Files
versitygw/s3api/utils/context-keys.go
T
niksis02 d383e1f32f fix: track how the request body ended before closing the connection
The body stream is now wrapped in a `bodyStreamTracker` before the handler touches it, which remembers the stream's first terminal result rather than asking fasthttp a second, unsafe question. `io.EOF` means the body was read out in full and the connection is still in sync; no terminal result means the handler stopped partway, so the leftovers are drained the way a
`Content-Length` body already was; a framing error means nothing decodable is left and the connection cannot carry another request.

`fasthttp.Request.SetBodyStream` cannot install the wrapper, as it releases the current `*requestStream` back to its pool, so `requestBodyStream` is now the accessor every body reader takes the stream from.

Broken framing no longer gives up on draining either. The connection is closed either way, so a bounded read off the raw socket costs nothing and lets the client finish its write and read the S3 error instead of a reset.
2026-09-09 23:30:32 +04:00

44 lines
1.9 KiB
Go

// Copyright 2023 Versity Software
// This file is licensed under the Apache License, Version 2.0
// (the "License"); you may not use this file except in compliance
// with the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.
package utils
import "github.com/versity/versitygw/internal/httpctx"
// Region, StartTime, IsRoot, Account, AccessKey context locals
// are set to default values in middlewares.SetDefaultValues
// to avoid the nil interface conversions
type ContextKey = httpctx.ContextKey
const (
ContextKeyRegion = httpctx.ContextKeyRegion
ContextKeyStartTime = httpctx.ContextKeyStartTime
ContextKeyIsRoot = httpctx.ContextKeyIsRoot
ContextKeyRootAccessKey = httpctx.ContextKeyRootAccessKey
ContextKeyAccount = httpctx.ContextKeyAccount
ContextKeyAuthenticated = httpctx.ContextKeyAuthenticated
ContextKeyPublicBucket = httpctx.ContextKeyPublicBucket
ContextKeyParsedAcl = httpctx.ContextKeyParsedAcl
ContextKeySkipResBodyLog = httpctx.ContextKeySkipResBodyLog
ContextKeyBodyReader = httpctx.ContextKeyBodyReader
ContextKeyBodyStream = httpctx.ContextKeyBodyStream
ContextKeySkip = httpctx.ContextKeySkip
ContextKeyStack = httpctx.ContextKeyStack
ContextKeyBucketOwner = httpctx.ContextKeyBucketOwner
ContextKeyObjectPostResult = httpctx.ContextKeyObjectPostResult
ContextKeyRequestID = httpctx.ContextKeyRequestID
ContextKeyHostID = httpctx.ContextKeyHostID
ContextKeyWebsiteConfig = httpctx.ContextKeyWebsiteConfig
)