带域阻塞的http转发

带域阻塞的http转发,http,go,tcp,forward,forwarding,Http,Go,Tcp,Forward,Forwarding,我正在尝试实现一个支持域阻塞的http转发服务器。我试过了 go io.Copy(dst、src) go io.Copy(src、dst) 它就像tcp转发上的一个符咒。然后我尝试使用类似于 go func(){ 读卡器:=io.TEERADER(src、dst) textReader:=textproto.NewReader(bufio.NewReader(reader)) requestLine,u=textReader.ReadLine() // ... ioutil.ReadAll(读

我正在尝试实现一个支持域阻塞的http转发服务器。我试过了

go io.Copy(dst、src)
go io.Copy(src、dst)
它就像tcp转发上的一个符咒。然后我尝试使用类似于

go func(){
读卡器:=io.TEERADER(src、dst)
textReader:=textproto.NewReader(bufio.NewReader(reader))
requestLine,u=textReader.ReadLine()
// ...
ioutil.ReadAll(读卡器)
}
它工作正常,但我担心性能不好(使用
ioutil.ReadAll
)。所以我写了下面的代码

func(f*转发器)句柄(src,dst net.Conn){
延迟dst.Close()
延迟src.Close()
完成:=make(chan结构{})
go func(){
textReader:=bufio.NewReader(src)
requestLine,U8;=textReader.ReadString('\n')
//解析请求行并应用域阻塞
写入([]字节(请求行))
io.副本(dst、src)

doneTCP转发是为了实现隧道代理不需要解析数据。反向代理可以使用

隧道代理用于分离http和https协议。客户端通常使用隧道发送https并发送Connect方法。发送http是Get方法。对于https请求服务,只有dail创建连接tcp转换,http请求使用反向代理实现

func(w http.ResponseWriter,r*http.Request){
//检查url主机
如果r.URL.Host!“”{
如果r.Method==eudore.MethodConnect{
//隧道代理
conn,err:=net.Dial(“tcp”,r.URL.Host)
如果错误!=零{
w、 文书主任(502)
返回
}
客户端,错误:=w.jackit()
如果错误!=零{
w、 文书主任(502)
康涅狄格州关闭
返回
}
写入([]字节(“HTTP/1.0 200正常\r\n\r\n”))
go func(){
io.副本(客户,康涅狄格州)
client.Close()
康涅狄格州关闭
}()
go func(){
io.副本(连接,客户)
client.Close()
康涅狄格州关闭
}()
}否则{
//反向代理
httputil.NewSingleHostReverseProxy(r.URL).servehttpp(w,r)
}
}
}
实现反向代理将解析客户端请求,代理将向目标服务器发送请求

反向代理转换请求,未测试:

func(w http.ResponseWriter, r *http.Request) {
    // set host
    r.URL.Scheme = "http"
    r.URL.Path = "example.com"
    // send
    resp,err := http.DefaultClient.Do(r)
    if err != nil {
        w.WriteHeader(502)
        return
    }

    // write respsonse
    defer resp.Body.Close()
    w.WriteHeader(resp.StatusCode)
    h := w.Header()
    for k,v := range resp.Header {
        h[k]=v
    }
    io.Copy(w, resp.Body)
}
但是,直接转发请求不处理hop-to-hop标头。中明确说明了hop-to-hop标头。hop-to-hop标头是两个连接之间的传输信息。例如,客户端到代理和代理到服务器是两个。客户端到服务器是端到端的

请直接使用反向代理,它已经为您处理了hop-to-hop头和升级

exmample NewSingleHostReverseProxy带过滤器:

主程序包
进口(
“net/http”
“字符串”
“net/http/httputil”
“网络/网址”
)
func main(){
地址:=url.Parse(“http://localhost:8088")
代理:=httputil.NewSingleHostReverseProxy(addr)
http.HandleFunc(“/”,func(w http.ResponseWriter,r*http.Request){
if strings.HasPrefix(r.URL.Path,“/api/”){
proxy.ServeHTTP(w,r)
}否则{
w、 书面负责人(404)
}
})
//监听服务器
}

你能使用而不是滚动你自己的吗?谢谢你的详细回答,但我想做的是将请求透明地转发到上游代理服务器。因此,转发边界内的任何响应,但也尝试阻止其中一些响应。我已通过更改
src.Write([]字节(s.statusLine))成功地做到了这一点
src.Write([]字节(s.statusLine+“\r\n”))
@F.Henry更新应答,添加筛选器而不是macth请求。