HTTP CONNECT方法的实现,接4合一之HTTP代理实现,我们这次主要改造requestHandler方法

一般情况下普通HTTP请求经过HTTP代理时不会使用CONNECT方式,通常是HTTPS连接经过HTTP代理时才会使用CONNECT方式,所以我们在转换Host到目标服务器地址的时候默认使用443端口

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
const(
HttpsPort = 443 //https默认端口号
)
func requestHandler(ctx *fasthttp.RequestCtx) {
// 支持CONNECT方法
if "CONNECT" == string(ctx.Method()) {
//获取目标服务器及端口号,
target, err := hostToTcpAddr(string(ctx.Host()), HttpsPort)
if err != nil {
ctx.Error(err.Error(), fasthttp.StatusServiceUnavailable)
return
}
ctx.HijackSetNoResponse(true)
ctx.Hijack(func(lConn net.Conn) {
_, _ = fmt.Fprintf(lConn, "HTTP/1.1 200 OK\r\nServer: shs\r\nDate: %v\r\n\r\n", time.Now().UTC().Format(time.RFC1123))
rConn, err := d.DialTarget(target)
if err != nil {
_ = lConn.Close()
log.Println(err)
return
}
go io.Copy(lConn,rConn)
_,_ = io.Copy(rConn,lConn)
})
//ctx.Error(http.StatusText(http.StatusMethodNotAllowed), http.StatusMethodNotAllowed)
return
}
.....
}