From 4c3842711dd6abc8401f83678f30bb56e3f8819b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=A3=8E=E6=89=87=E6=BB=91=E7=BF=94=E7=BF=BC?= Date: Sun, 24 May 2026 20:05:40 +0800 Subject: [PATCH] XHTTP client: Fix packet-up `OpenUsage` counting and H3 `keepAlivePeriod` parameter (#6140) Fixes https://github.com/XTLS/Xray-core/pull/6140#issuecomment-4525409315 --- transport/internet/splithttp/dialer.go | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/transport/internet/splithttp/dialer.go b/transport/internet/splithttp/dialer.go index f89c71ed..1329713c 100644 --- a/transport/internet/splithttp/dialer.go +++ b/transport/internet/splithttp/dialer.go @@ -183,6 +183,8 @@ func createHTTPClient(dest net.Destination, streamSettings *internet.MemoryStrea if quicParams.KeepAlivePeriod == 0 { if keepAlivePeriod == 0 { quicConfig.KeepAlivePeriod = net.QuicgoH3KeepAlivePeriod + } else if keepAlivePeriod > 0 { + quicConfig.KeepAlivePeriod = keepAlivePeriod } } if quicParams.MaxIncomingStreams == 0 { @@ -506,6 +508,8 @@ func Dial(ctx context.Context, dest net.Destination, streamSettings *internet.Me var seq int64 var lastWrite time.Time + dynamicHTTPClient := httpClient + dynamicXmuxClient := xmuxClient for { // by offloading the uploads into a buffered pipe, multiple conn.Write // calls get automatically batched together into larger POST requests. @@ -540,13 +544,13 @@ func Dial(ctx context.Context, dest net.Destination, streamSettings *internet.Me lastWrite = time.Now() - if xmuxClient != nil && (xmuxClient.LeftRequests.Add(-1) <= 0 || - (xmuxClient.UnreusableAt != time.Time{} && lastWrite.After(xmuxClient.UnreusableAt))) { - httpClient, xmuxClient = getHTTPClient(ctx, dest, streamSettings) + if dynamicXmuxClient != nil && (dynamicXmuxClient.LeftRequests.Add(-1) <= 0 || + (dynamicXmuxClient.UnreusableAt != time.Time{} && lastWrite.After(dynamicXmuxClient.UnreusableAt))) { + dynamicHTTPClient, dynamicXmuxClient = getHTTPClient(ctx, dest, streamSettings) } - go func() { - err := httpClient.PostPacket( + go func(hClient DialerClient) { + err := hClient.PostPacket( ctx, requestURL.String(), sessionId, @@ -559,9 +563,9 @@ func Dial(ctx context.Context, dest net.Destination, streamSettings *internet.Me uploadPipeReader.Interrupt() doSplit.Store(false) } - }() + }(dynamicHTTPClient) - if _, ok := httpClient.(*DefaultDialerClient); ok { + if _, ok := dynamicHTTPClient.(*DefaultDialerClient); ok { <-wroteRequest.Wait() } }