mirror of
https://github.com/versity/versitygw.git
synced 2026-09-23 16:34:18 +00:00
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.
62 lines
2.2 KiB
Go
62 lines
2.2 KiB
Go
// Copyright 2026 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 httpctx
|
|
|
|
import (
|
|
"github.com/gofiber/fiber/v3"
|
|
)
|
|
|
|
// ContextKey names a request-local value stored in fiber.Ctx locals.
|
|
type ContextKey string
|
|
|
|
const (
|
|
ContextKeyRegion ContextKey = "region"
|
|
ContextKeyStartTime ContextKey = "start-time"
|
|
ContextKeyIsRoot ContextKey = "is-root"
|
|
ContextKeyRootAccessKey ContextKey = "root-access-key"
|
|
ContextKeyAccount ContextKey = "account"
|
|
ContextKeyAuthenticated ContextKey = "authenticated"
|
|
ContextKeyPublicBucket ContextKey = "public-bucket"
|
|
ContextKeyParsedAcl ContextKey = "parsed-acl"
|
|
ContextKeySkipResBodyLog ContextKey = "skip-res-body-log"
|
|
ContextKeyBodyReader ContextKey = "body-reader"
|
|
ContextKeyBodyStream ContextKey = "body-stream"
|
|
ContextKeySkip ContextKey = "__skip"
|
|
ContextKeyStack ContextKey = "stack"
|
|
ContextKeyBucketOwner ContextKey = "bucket-owner"
|
|
ContextKeyObjectPostResult ContextKey = "object-post-result"
|
|
ContextKeyRequestID ContextKey = "request-id"
|
|
ContextKeyHostID ContextKey = "host-id"
|
|
ContextKeyWebsiteConfig ContextKey = "website-config"
|
|
ContextKeyCallerIdentity ContextKey = "iam-caller-identity"
|
|
ContextKeyOriginalURIPath ContextKey = "original-uri-path"
|
|
)
|
|
|
|
func (ck ContextKey) Set(ctx fiber.Ctx, val any) {
|
|
ctx.Locals(string(ck), val)
|
|
}
|
|
|
|
func (ck ContextKey) IsSet(ctx fiber.Ctx) bool {
|
|
return ctx.Locals(string(ck)) != nil
|
|
}
|
|
|
|
func (ck ContextKey) Delete(ctx fiber.Ctx) {
|
|
ctx.Locals(string(ck), nil)
|
|
}
|
|
|
|
func (ck ContextKey) Get(ctx fiber.Ctx) any {
|
|
return ctx.Locals(string(ck))
|
|
}
|