mirror of
https://github.com/XTLS/Xray-core.git
synced 2024-11-22 16:41:29 +00:00
SplitHTTP client: Raise idle timeout to 5 minutes, Add h*KeepalivePeriod (#3624)
This commit is contained in:
parent
9e93c19161
commit
85e2ebc6f7
|
@ -26,6 +26,16 @@ import (
|
||||||
"golang.org/x/net/http2"
|
"golang.org/x/net/http2"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// defines the maximum time an idle TCP session can survive in the tunnel, so
|
||||||
|
// it should be consistent across HTTP versions and with other transports.
|
||||||
|
const connIdleTimeout = 300 * time.Second
|
||||||
|
|
||||||
|
// consistent with quic-go
|
||||||
|
const h3KeepalivePeriod = 10 * time.Second
|
||||||
|
|
||||||
|
// consistent with chrome
|
||||||
|
const h2KeepalivePeriod = 45 * time.Second
|
||||||
|
|
||||||
type dialerConf struct {
|
type dialerConf struct {
|
||||||
net.Destination
|
net.Destination
|
||||||
*internet.MemoryStreamConfig
|
*internet.MemoryStreamConfig
|
||||||
|
@ -89,7 +99,17 @@ func getHTTPClient(ctx context.Context, dest net.Destination, streamSettings *in
|
||||||
var uploadTransport http.RoundTripper
|
var uploadTransport http.RoundTripper
|
||||||
|
|
||||||
if isH3 {
|
if isH3 {
|
||||||
|
quicConfig := &quic.Config{
|
||||||
|
MaxIdleTimeout: connIdleTimeout,
|
||||||
|
|
||||||
|
// these two are defaults of quic-go/http3. the default of quic-go (no
|
||||||
|
// http3) is different, so it is hardcoded here for clarity.
|
||||||
|
// https://github.com/quic-go/quic-go/blob/b8ea5c798155950fb5bbfdd06cad1939c9355878/http3/client.go#L36-L39
|
||||||
|
MaxIncomingStreams: -1,
|
||||||
|
KeepAlivePeriod: h3KeepalivePeriod,
|
||||||
|
}
|
||||||
roundTripper := &http3.RoundTripper{
|
roundTripper := &http3.RoundTripper{
|
||||||
|
QUICConfig: quicConfig,
|
||||||
TLSClientConfig: gotlsConfig,
|
TLSClientConfig: gotlsConfig,
|
||||||
Dial: func(ctx context.Context, addr string, tlsCfg *gotls.Config, cfg *quic.Config) (quic.EarlyConnection, error) {
|
Dial: func(ctx context.Context, addr string, tlsCfg *gotls.Config, cfg *quic.Config) (quic.EarlyConnection, error) {
|
||||||
conn, err := internet.DialSystem(ctx, dest, streamSettings.SocketSettings)
|
conn, err := internet.DialSystem(ctx, dest, streamSettings.SocketSettings)
|
||||||
|
@ -131,7 +151,8 @@ func getHTTPClient(ctx context.Context, dest net.Destination, streamSettings *in
|
||||||
DialTLSContext: func(ctxInner context.Context, network string, addr string, cfg *gotls.Config) (net.Conn, error) {
|
DialTLSContext: func(ctxInner context.Context, network string, addr string, cfg *gotls.Config) (net.Conn, error) {
|
||||||
return dialContext(ctxInner)
|
return dialContext(ctxInner)
|
||||||
},
|
},
|
||||||
IdleConnTimeout: 90 * time.Second,
|
IdleConnTimeout: connIdleTimeout,
|
||||||
|
ReadIdleTimeout: h2KeepalivePeriod,
|
||||||
}
|
}
|
||||||
uploadTransport = downloadTransport
|
uploadTransport = downloadTransport
|
||||||
} else {
|
} else {
|
||||||
|
@ -142,7 +163,7 @@ func getHTTPClient(ctx context.Context, dest net.Destination, streamSettings *in
|
||||||
downloadTransport = &http.Transport{
|
downloadTransport = &http.Transport{
|
||||||
DialTLSContext: httpDialContext,
|
DialTLSContext: httpDialContext,
|
||||||
DialContext: httpDialContext,
|
DialContext: httpDialContext,
|
||||||
IdleConnTimeout: 90 * time.Second,
|
IdleConnTimeout: connIdleTimeout,
|
||||||
// chunked transfer download with keepalives is buggy with
|
// chunked transfer download with keepalives is buggy with
|
||||||
// http.Client and our custom dial context.
|
// http.Client and our custom dial context.
|
||||||
DisableKeepAlives: true,
|
DisableKeepAlives: true,
|
||||||
|
|
Loading…
Reference in a new issue