@@ 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
}