From 3686f7e2cb0118367fdc74fd20b2e115fb90bb54 Mon Sep 17 00:00:00 2001 From: Drew DeVault Date: Fri, 1 Aug 2025 09:31:20 +0200 Subject: [PATCH] objects: improve support for our s3 deployment Not sure how well this generalizes but we can improve it when someone complains. --- objects/middleware.go | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/objects/middleware.go b/objects/middleware.go index 28bbc0641b0156e9181962468255df28324b6cf0..0c2da48864f81c1163e28389b72a804ff89082d5 100644 --- a/objects/middleware.go +++ b/objects/middleware.go @@ -9,6 +9,7 @@ import ( "github.com/aws/aws-sdk-go-v2/aws" "github.com/aws/aws-sdk-go-v2/credentials" "github.com/aws/aws-sdk-go-v2/service/s3" + "github.com/aws/smithy-go/endpoints" "github.com/vaughan0/go-ini" ) @@ -42,6 +43,27 @@ func ForContext(ctx context.Context) *s3.Client { var ErrDisabled = errors.New("object storage is not enabled for this server") +type S3Resolver struct { + conf ini.File + resolver s3.EndpointResolverV2 +} + +func (r *S3Resolver) ResolveEndpoint( + ctx context.Context, + params s3.EndpointParameters, +) (transport.Endpoint, error) { + upstream, _ := r.conf.Get("objects", "s3-upstream") + endpoint, err := r.resolver.ResolveEndpoint(ctx, params) + if err != nil { + return endpoint, err + } + endpoint.URI.Host = upstream + if params.Bucket != nil { + endpoint.URI.Path = *params.Bucket + } + return endpoint, nil +} + func NewClient(conf ini.File) (*s3.Client, error) { upstream, _ := conf.Get("objects", "s3-upstream") accessKey, _ := conf.Get("objects", "s3-access-key") @@ -59,7 +81,11 @@ func NewClient(conf ini.File) (*s3.Client, error) { Region: region, Credentials: creds, }, func(opts *s3.Options) { - opts.BaseEndpoint = aws.String(upstream) + opts.BaseEndpoint = aws.String("https://" + upstream) + opts.EndpointResolverV2 = &S3Resolver{ + conf, + s3.NewDefaultEndpointResolverV2(), + } }), nil }