mirror of
https://github.com/XTLS/Xray-core.git
synced 2026-05-08 14:13:22 +00:00
XHTTP transport: Some optimizations (#5803)
https://github.com/XTLS/Xray-core/pull/5801 https://github.com/XTLS/Xray-core/pull/5808 --------- Co-authored-by: Sergei Ozeranskii <sergey.ozeranskiy@gmail.com> Co-authored-by: rufsieus <rufsieus@gmail.com>
This commit is contained in:
@@ -18,6 +18,7 @@ import (
|
||||
"github.com/apernet/quic-go/http3"
|
||||
goreality "github.com/xtls/reality"
|
||||
"github.com/xtls/xray-core/common"
|
||||
"github.com/xtls/xray-core/common/buf"
|
||||
"github.com/xtls/xray-core/common/errors"
|
||||
"github.com/xtls/xray-core/common/net"
|
||||
http_proto "github.com/xtls/xray-core/common/protocol/http"
|
||||
@@ -293,15 +294,36 @@ func (h *requestHandler) ServeHTTP(writer http.ResponseWriter, request *http.Req
|
||||
|
||||
var bodyPayload []byte
|
||||
if dataPlacement == PlacementAuto || dataPlacement == PlacementBody {
|
||||
bodyPayload, err = io.ReadAll(io.LimitReader(request.Body, int64(scMaxEachPostBytes)+1))
|
||||
if err != nil {
|
||||
errors.LogInfoInner(context.Background(), err, "failed to upload (ReadAll)")
|
||||
writer.WriteHeader(http.StatusInternalServerError)
|
||||
var readErr error
|
||||
if request.ContentLength > int64(scMaxEachPostBytes) {
|
||||
errors.LogInfo(context.Background(), "Too large upload. scMaxEachPostBytes is set to ", scMaxEachPostBytes, "but request size exceed it. Adjust scMaxEachPostBytes on the server to be at least as large as client.")
|
||||
writer.WriteHeader(http.StatusRequestEntityTooLarge)
|
||||
return
|
||||
}
|
||||
if request.ContentLength > 0 {
|
||||
bodyPayload = make([]byte, request.ContentLength)
|
||||
_, readErr = io.ReadFull(request.Body, bodyPayload)
|
||||
} else {
|
||||
bodyPayload, readErr = buf.ReadAllToBytes(io.LimitReader(request.Body, int64(scMaxEachPostBytes)+1))
|
||||
}
|
||||
if readErr != nil {
|
||||
errors.LogInfoInner(context.Background(), readErr, "failed to read body payload")
|
||||
writer.WriteHeader(http.StatusBadRequest)
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
payload := slices.Concat(headerPayload, cookiePayload, bodyPayload)
|
||||
var payload []byte
|
||||
switch dataPlacement {
|
||||
case PlacementHeader:
|
||||
payload = headerPayload
|
||||
case PlacementCookie:
|
||||
payload = cookiePayload
|
||||
case PlacementBody:
|
||||
payload = bodyPayload
|
||||
case PlacementAuto:
|
||||
payload = slices.Concat(headerPayload, cookiePayload, bodyPayload)
|
||||
}
|
||||
|
||||
if len(payload) > scMaxEachPostBytes {
|
||||
errors.LogInfo(context.Background(), "Too large upload. scMaxEachPostBytes is set to ", scMaxEachPostBytes, "but request size exceed it. Adjust scMaxEachPostBytes on the server to be at least as large as client.")
|
||||
|
||||
Reference in New Issue
Block a user