忽略301, 302, 303, 307, 308响应中没有Location的错误提示

This commit is contained in:
GoEdgeLab
2022-05-19 20:16:40 +08:00
parent 38603416ee
commit 6f13d6f560
3 changed files with 72 additions and 38 deletions

View File

@@ -104,39 +104,41 @@ func (this *HTTPClientPool) Client(req *HTTPRequest,
} }
} }
var transport = &http.Transport{ var transport = &HTTPClientTransport{
DialContext: func(ctx context.Context, network, addr string) (net.Conn, error) { Transport: &http.Transport{
// 支持TOA的连接 DialContext: func(ctx context.Context, network, addr string) (net.Conn, error) {
conn, err := this.handleTOA(req, ctx, network, originAddr, connectionTimeout) // 支持TOA的连接
if conn != nil || err != nil { conn, err := this.handleTOA(req, ctx, network, originAddr, connectionTimeout)
return conn, err if conn != nil || err != nil {
} return conn, err
}
// 普通的连接 // 普通的连接
conn, err = (&net.Dialer{ conn, err = (&net.Dialer{
Timeout: connectionTimeout, Timeout: connectionTimeout,
KeepAlive: 1 * time.Minute, KeepAlive: 1 * time.Minute,
}).DialContext(ctx, network, originAddr) }).DialContext(ctx, network, originAddr)
if err != nil { if err != nil {
return nil, err return nil, err
} }
// 处理PROXY protocol // 处理PROXY protocol
err = this.handlePROXYProtocol(conn, req, proxyProtocol) err = this.handlePROXYProtocol(conn, req, proxyProtocol)
if err != nil { if err != nil {
return nil, err return nil, err
} }
return conn, nil return conn, nil
},
MaxIdleConns: 0,
MaxIdleConnsPerHost: idleConns,
MaxConnsPerHost: maxConnections,
IdleConnTimeout: idleTimeout,
ExpectContinueTimeout: 1 * time.Second,
TLSHandshakeTimeout: 3 * time.Second,
TLSClientConfig: tlsConfig,
Proxy: nil,
}, },
MaxIdleConns: 0,
MaxIdleConnsPerHost: idleConns,
MaxConnsPerHost: maxConnections,
IdleConnTimeout: idleTimeout,
ExpectContinueTimeout: 1 * time.Second,
TLSHandshakeTimeout: 3 * time.Second,
TLSClientConfig: tlsConfig,
Proxy: nil,
} }
rawClient = &http.Client{ rawClient = &http.Client{

View File

@@ -0,0 +1,26 @@
// Copyright 2022 Liuxiangchao iwind.liu@gmail.com. All rights reserved. Official site: https://goedge.cn .
package nodes
import (
"net/http"
)
const emptyHTTPLocation = "/$EmptyHTTPLocation$"
type HTTPClientTransport struct {
*http.Transport
}
func (this *HTTPClientTransport) RoundTrip(req *http.Request) (*http.Response, error) {
resp, err := this.Transport.RoundTrip(req)
if err != nil {
return resp, err
}
// 检查在跳转相关状态中Location是否存在
if httpStatusIsRedirect(resp.StatusCode) && len(resp.Header.Get("Location")) == 0 {
resp.Header.Set("Location", emptyHTTPLocation)
}
return resp, nil
}

View File

@@ -282,16 +282,22 @@ func (this *HTTPRequest) doReverseProxy() {
// 替换Location中的源站地址 // 替换Location中的源站地址
var locationHeader = resp.Header.Get("Location") var locationHeader = resp.Header.Get("Location")
if len(locationHeader) > 0 { if len(locationHeader) > 0 {
locationURL, err := url.Parse(locationHeader) // 空Location处理
if err == nil && locationURL.Host != this.ReqHost && (locationURL.Host == originAddr || strings.HasPrefix(originAddr, locationURL.Host+":")) { if locationHeader == emptyHTTPLocation {
locationURL.Host = this.ReqHost resp.Header.Del("Location")
if this.IsHTTP { } else {
locationURL.Scheme = "http" // 自动修正Location中的源站地址
} else if this.IsHTTPS { locationURL, err := url.Parse(locationHeader)
locationURL.Scheme = "https" if err == nil && locationURL.Host != this.ReqHost && (locationURL.Host == originAddr || strings.HasPrefix(originAddr, locationURL.Host+":")) {
} locationURL.Host = this.ReqHost
if this.IsHTTP {
locationURL.Scheme = "http"
} else if this.IsHTTPS {
locationURL.Scheme = "https"
}
resp.Header.Set("Location", locationURL.String()) resp.Header.Set("Location", locationURL.String())
}
} }
} }