我正在尝试实现一个支持域阻止的 http 转发服务器。我试过了
go io.Copy(dst, src)
go io.Copy(src, dst)
它就像 tcp 转发的魅力一样。然后我尝试用类似的东西来做请求行解析
go func(){
reader := io.TeeReader(src, dst)
textReader := textproto.NewReader(bufio.NewReader(reader))
requestLine, _ = textReader.ReadLine()
// ...
ioutil.ReadAll(reader)
}
它工作正常,但我开始担心性能不佳(使用ioutil.ReadAll)。所以我写了下面的代码。
func (f *Forwarder) handle(src, dst net.Conn) {
defer dst.Close()
defer src.Close()
done := make(chan struct{})
go func() {
textReader := bufio.NewReader(src)
requestLine, _ = textReader.ReadString('\n')
// parse request line and apply domain blocking
dst.Write([]byte(requestLine))
io.Copy(dst, src)
done <- struct{}{}
}()
go func() {
textReader := bufio.NewReader(dst)
s.statusLine, _ = textReader.ReadString('\n')
src.Write([]byte(s.statusLine))
io.Copy(src, dst)
done <- struct{}{}
}()
<-done
<-done
}
不幸的是,它根本不起作用。请求可以打印出来,但不能用于响应。我一直卡在这里,不知道出了什么问题。
慕码人2483693
相关分类