XHTTP client: Define Request.GetBody() for packet-up so h2 can replay after GOAWAY (#6632)

https://github.com/XTLS/Xray-core/pull/6632#issuecomment-5430735467

---------

Co-authored-by: 风扇滑翔翼 <Fangliding.fshxy@outlook.com>
This commit is contained in:
FunLay123
2026-08-26 20:41:43 +00:00
committed by GitHub
co-authored by 风扇滑翔翼
parent 77f98eba09
commit dffc7ada5e
2 changed files with 46 additions and 5 deletions
+10 -5
View File
@@ -1,6 +1,7 @@
package splithttp
import (
"bytes"
"encoding/base64"
"fmt"
"io"
@@ -330,14 +331,18 @@ func (c *Config) FillStreamRequest(request *http.Request, sessionId string, seqS
func (c *Config) FillPacketRequest(request *http.Request, sessionId string, seqStr string, payload buf.MultiBuffer) error {
dataPlacement := c.GetNormalizedUplinkDataPlacement()
data := make([]byte, payload.Len())
payload.Copy(data)
buf.ReleaseMulti(payload)
if dataPlacement == PlacementBody || dataPlacement == PlacementAuto {
request.Header = c.GetRequestHeader()
request.Body = io.NopCloser(&buf.MultiBufferContainer{MultiBuffer: payload})
request.ContentLength = int64(payload.Len())
request.Body = io.NopCloser(bytes.NewReader(data))
request.ContentLength = int64(len(data))
request.GetBody = func() (io.ReadCloser, error) {
return io.NopCloser(bytes.NewReader(data)), nil
}
} else {
data := make([]byte, payload.Len())
payload.Copy(data)
buf.ReleaseMulti(payload)
switch dataPlacement {
case PlacementHeader:
request.Header = c.GetRequestHeaderWithPayload(data)