XHTTP client: Fix a race condition and a data race (#6665)

https://github.com/XTLS/Xray-core/pull/6665#issuecomment-5429028477

---------

Co-authored-by: 风扇滑翔翼 <Fangliding.fshxy@outlook.com>
This commit is contained in:
ivolfram
2026-08-26 19:19:41 +00:00
committed by GitHub
co-authored by 风扇滑翔翼
parent f124daf5a3
commit 77f98eba09
2 changed files with 8 additions and 6 deletions
+6 -5
View File
@@ -8,6 +8,7 @@ import (
"net/http"
"net/http/httptrace"
"sync"
"sync/atomic"
"github.com/apernet/quic-go/http3"
"github.com/xtls/xray-core/common"
@@ -32,7 +33,7 @@ type DialerClient interface {
type DefaultDialerClient struct {
transportConfig *Config
client *http.Client
closed bool
closed atomic.Bool
httpVersion string
// pool of net.Conn, created using dialUploadConn
uploadRawPool *sync.Pool
@@ -40,7 +41,7 @@ type DefaultDialerClient struct {
}
func (c *DefaultDialerClient) IsClosed() bool {
return c.closed
return c.closed.Load()
}
func (c *DefaultDialerClient) OpenStream(ctx context.Context, url string, sessionId string, body io.Reader, uploadOnly bool) (wrc io.ReadCloser, remoteAddr, localAddr net.Addr, err error) {
@@ -72,7 +73,7 @@ func (c *DefaultDialerClient) OpenStream(ctx context.Context, url string, sessio
resp, err := c.client.Do(req)
if err != nil {
if !uploadOnly { // stream-down is enough
c.closed = true
c.closed.Store(true)
errors.LogInfoInner(ctx, err, "failed to "+method+" "+url)
}
gotConn.Close()
@@ -108,7 +109,7 @@ func (c *DefaultDialerClient) PostPacket(ctx context.Context, url string, sessio
if c.httpVersion != "1.1" {
resp, err := c.client.Do(req)
if err != nil {
c.closed = true
c.closed.Store(true)
return err
}
@@ -148,7 +149,7 @@ func (c *DefaultDialerClient) PostPacket(ctx context.Context, url string, sessio
if h1UploadConn.UnreadedResponsesCount > 0 {
resp, err := http.ReadResponse(h1UploadConn.RespBufReader, req)
if err != nil {
c.closed = true
c.closed.Store(true)
return fmt.Errorf("error while reading response: %s", err.Error())
}
io.Copy(io.Discard, resp.Body)
+2 -1
View File
@@ -595,11 +595,12 @@ func (w uploadWriter) Write(b []byte) (int, error) {
var writed int
for _, buff := range buffer.MultiBuffer {
n := int(buff.Len())
err := w.WriteMultiBuffer(buf.MultiBuffer{buff})
if err != nil {
return writed, err
}
writed += int(buff.Len())
writed += n
}
return writed, nil
}