s3: drain request body before error response (#11334)

* s3: drain request body before error response

* s3: keep oversized request bodies drainable
This commit is contained in:
Chris Lu authored and GitHub committed 2026-09-15 13:09:07 -07:00
1 parent 166af06a2b
commit 93d4a6aefd
8 files changed
+157 -13

No files matched your search

+16
View File
@@ -3,9 +3,11 @@ package s3err
import (
"bytes"
"encoding/xml"
"io"
"net/http"
"strconv"
"strings"
"time"
"github.com/aws/aws-sdk-go/private/protocol/xml/xmlutil"
"github.com/gorilla/mux"
@@ -18,6 +20,8 @@ type mimeType string
const (
mimeNone mimeType = ""
MimeXML mimeType = "application/xml"
errorResponseBodyDrainTimeout = 30 * time.Second
)
func WriteAwsXMLResponse(w http.ResponseWriter, r *http.Request, statusCode int, result interface{}) {
@@ -62,10 +66,22 @@ func WriteErrorResponseWithMessage(w http.ResponseWriter, r *http.Request, error
if message != "" {
errorResponse.Message = message
}
drainRequestBody(w, r)
WriteXMLResponse(w, r, apiError.HTTPStatusCode, errorResponse)
PostLog(r, apiError.HTTPStatusCode, errorCode)
}
func drainRequestBody(w http.ResponseWriter, r *http.Request) {
if r == nil || r.Body == nil || r.Body == http.NoBody {
return
}
rc := http.NewResponseController(w)
if err := rc.SetReadDeadline(time.Now().Add(errorResponseBodyDrainTimeout)); err == nil {
defer rc.SetReadDeadline(time.Time{})
}
_, _ = io.Copy(io.Discard, r.Body)
}
func getRESTErrorResponse(err APIError, resource string, bucket, object, requestID string) RESTErrorResponse {
return RESTErrorResponse{
Code: err.Code,