HTTP transport: Fix an issue when HTTP client start fail with 403 (#3910)

Co-authored-by: RPRX <63339210+RPRX@users.noreply.github.com>
This commit is contained in:
yuhan6665 2024-10-14 22:55:48 -04:00 committed by GitHub
parent 8c180b9cfd
commit 6a70ae6408
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -134,21 +134,21 @@ func getHTTPClient(ctx context.Context, dest net.Destination, streamSettings *in
return nil, err return nil, err
} }
address := net.ParseAddress(rawHost) address := net.ParseAddress(rawHost)
hctx = c.ContextWithID(hctx, c.IDFromContext(ctx)) hctx = c.ContextWithID(hctx, c.IDFromContext(ctx))
hctx = session.ContextWithOutbounds(hctx, session.OutboundsFromContext(ctx)) hctx = session.ContextWithOutbounds(hctx, session.OutboundsFromContext(ctx))
hctx = session.ContextWithTimeoutOnly(hctx, true) hctx = session.ContextWithTimeoutOnly(hctx, true)
pconn, err := internet.DialSystem(hctx, net.TCPDestination(address, port), sockopt) pconn, err := internet.DialSystem(hctx, net.TCPDestination(address, port), sockopt)
if err != nil { if err != nil {
errors.LogErrorInner(ctx, err, "failed to dial to " + addr) errors.LogErrorInner(ctx, err, "failed to dial to "+addr)
return nil, err return nil, err
} }
if realityConfigs != nil { if realityConfigs != nil {
return reality.UClient(pconn, realityConfigs, hctx, dest) return reality.UClient(pconn, realityConfigs, hctx, dest)
} }
var cn tls.Interface var cn tls.Interface
if fingerprint := tls.GetFingerprint(tlsConfigs.Fingerprint); fingerprint != nil { if fingerprint := tls.GetFingerprint(tlsConfigs.Fingerprint); fingerprint != nil {
cn = tls.UClient(pconn, tlsConfig, fingerprint).(*tls.UConn) cn = tls.UClient(pconn, tlsConfig, fingerprint).(*tls.UConn)
@ -156,12 +156,12 @@ func getHTTPClient(ctx context.Context, dest net.Destination, streamSettings *in
cn = tls.Client(pconn, tlsConfig).(*tls.Conn) cn = tls.Client(pconn, tlsConfig).(*tls.Conn)
} }
if err := cn.HandshakeContext(ctx); err != nil { if err := cn.HandshakeContext(ctx); err != nil {
errors.LogErrorInner(ctx, err, "failed to dial to " + addr) errors.LogErrorInner(ctx, err, "failed to dial to "+addr)
return nil, err return nil, err
} }
if !tlsConfig.InsecureSkipVerify { if !tlsConfig.InsecureSkipVerify {
if err := cn.VerifyHostname(tlsConfig.ServerName); err != nil { if err := cn.VerifyHostname(tlsConfig.ServerName); err != nil {
errors.LogErrorInner(ctx, err, "failed to dial to " + addr) errors.LogErrorInner(ctx, err, "failed to dial to "+addr)
return nil, err return nil, err
} }
} }
@ -224,7 +224,7 @@ func Dial(ctx context.Context, dest net.Destination, streamSettings *internet.Me
Host: dest.NetAddr(), Host: dest.NetAddr(),
Path: httpSettings.getNormalizedPath(), Path: httpSettings.getNormalizedPath(),
}, },
Header: httpHeaders, Header: httpHeaders,
} }
// Disable any compression method from server. // Disable any compression method from server.
request.Header.Set("Accept-Encoding", "identity") request.Header.Set("Accept-Encoding", "identity")
@ -232,8 +232,12 @@ func Dial(ctx context.Context, dest net.Destination, streamSettings *internet.Me
wrc := &WaitReadCloser{Wait: make(chan struct{})} wrc := &WaitReadCloser{Wait: make(chan struct{})}
go func() { go func() {
response, err := client.Do(request) response, err := client.Do(request)
if err != nil { if err != nil || response.StatusCode != 200 {
errors.LogWarningInner(ctx, err, "failed to dial to ", dest) if err != nil {
errors.LogWarningInner(ctx, err, "failed to dial to ", dest)
} else {
errors.LogWarning(ctx, "unexpected status ", response.StatusCode)
}
wrc.Close() wrc.Close()
{ {
// Abandon `client` if `client.Do(request)` failed // Abandon `client` if `client.Do(request)` failed
@ -246,11 +250,6 @@ func Dial(ctx context.Context, dest net.Destination, streamSettings *internet.Me
} }
return return
} }
if response.StatusCode != 200 {
errors.LogWarning(ctx, "unexpected status", response.StatusCode)
wrc.Close()
return
}
wrc.Set(response.Body) wrc.Set(response.Body)
}() }()