Fix: some HTTP proxy request broken
This commit is contained in:
parent
9b229b15e7
commit
436dc91dd4
2 changed files with 19 additions and 1 deletions
|
@ -43,3 +43,19 @@ func RemoveHopByHopHeaders(header http.Header) {
|
||||||
header.Del(strings.TrimSpace(h))
|
header.Del(strings.TrimSpace(h))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// RemoveExtraHTTPHostPort remove extra host port (example.com:80 --> example.com)
|
||||||
|
// It resolves the behavior of some HTTP servers that do not handle host:80 (e.g. baidu.com)
|
||||||
|
func RemoveExtraHTTPHostPort(req *http.Request) {
|
||||||
|
host := req.Host
|
||||||
|
if host == "" {
|
||||||
|
host = req.URL.Host
|
||||||
|
}
|
||||||
|
|
||||||
|
if pHost, port, err := net.SplitHostPort(host); err == nil && port == "80" {
|
||||||
|
host = pHost
|
||||||
|
}
|
||||||
|
|
||||||
|
req.Host = host
|
||||||
|
req.URL.Host = host
|
||||||
|
}
|
||||||
|
|
|
@ -20,11 +20,12 @@ import (
|
||||||
func handleHTTP(ctx *context.HTTPContext, outbound net.Conn) {
|
func handleHTTP(ctx *context.HTTPContext, outbound net.Conn) {
|
||||||
req := ctx.Request()
|
req := ctx.Request()
|
||||||
conn := ctx.Conn()
|
conn := ctx.Conn()
|
||||||
host := req.Host
|
|
||||||
|
|
||||||
inboundReader := bufio.NewReader(conn)
|
inboundReader := bufio.NewReader(conn)
|
||||||
outboundReader := bufio.NewReader(outbound)
|
outboundReader := bufio.NewReader(outbound)
|
||||||
|
|
||||||
|
inbound.RemoveExtraHTTPHostPort(req)
|
||||||
|
host := req.Host
|
||||||
for {
|
for {
|
||||||
keepAlive := strings.TrimSpace(strings.ToLower(req.Header.Get("Proxy-Connection"))) == "keep-alive"
|
keepAlive := strings.TrimSpace(strings.ToLower(req.Header.Get("Proxy-Connection"))) == "keep-alive"
|
||||||
|
|
||||||
|
@ -79,6 +80,7 @@ func handleHTTP(ctx *context.HTTPContext, outbound net.Conn) {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inbound.RemoveExtraHTTPHostPort(req)
|
||||||
// Sometimes firefox just open a socket to process multiple domains in HTTP
|
// Sometimes firefox just open a socket to process multiple domains in HTTP
|
||||||
// The temporary solution is close connection when encountering different HOST
|
// The temporary solution is close connection when encountering different HOST
|
||||||
if req.Host != host {
|
if req.Host != host {
|
||||||
|
|
Loading…
Reference in a new issue