mirror of
https://github.com/TeaOSLab/EdgeNode.git
synced 2025-11-09 20:10:27 +08:00
忽略301, 302, 303, 307, 308响应中没有Location的错误提示
This commit is contained in:
@@ -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{
|
||||||
|
|||||||
26
internal/nodes/http_client_transport.go
Normal file
26
internal/nodes/http_client_transport.go
Normal 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
|
||||||
|
}
|
||||||
@@ -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())
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user