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 ) func requestHandler(ctx *fasthttp.RequestCtx) { 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) }) return } ..... }
|