package deconnector import ( "bufio" "net" "net/http" ) func (d *Deconnector) Handle(clientConn net.Conn) { upstreamURL, err := d.dialer.UpstreamURL() if err != nil { d.app.Logger().WithError(err).Error("failed to get upstream URL") return } defer clientConn.Close() req, err := http.ReadRequest(bufio.NewReader(clientConn)) if err != nil { d.app.Logger().WithError(err).Error("failed to read request") return } if req.Method == http.MethodConnect { _, port, _ := net.SplitHostPort(req.Host) if port == "443" { d.handleTunnel(clientConn, req.Host, upstreamURL) } else { d.handleDeconnect(clientConn, req, upstreamURL) } } else { req.RequestURI = "" if req.URL.Host == "" { req.URL.Host = req.Host } req.URL.Scheme = "http" d.app.Logger(). WithField("method", req.Method). WithField("url", req.URL). Info("Forwarding HTTP request") d.forwardHTTP(clientConn, req, upstreamURL) } }