api_client.go 44 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461
  1. // Code generated by smithy-go-codegen DO NOT EDIT.
  2. package s3
  3. import (
  4. "context"
  5. cryptorand "crypto/rand"
  6. "errors"
  7. "fmt"
  8. "github.com/aws/aws-sdk-go-v2/aws"
  9. "github.com/aws/aws-sdk-go-v2/aws/defaults"
  10. awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware"
  11. "github.com/aws/aws-sdk-go-v2/aws/retry"
  12. "github.com/aws/aws-sdk-go-v2/aws/signer/v4"
  13. awshttp "github.com/aws/aws-sdk-go-v2/aws/transport/http"
  14. internalauth "github.com/aws/aws-sdk-go-v2/internal/auth"
  15. internalauthsmithy "github.com/aws/aws-sdk-go-v2/internal/auth/smithy"
  16. internalConfig "github.com/aws/aws-sdk-go-v2/internal/configsources"
  17. internalmiddleware "github.com/aws/aws-sdk-go-v2/internal/middleware"
  18. "github.com/aws/aws-sdk-go-v2/internal/v4a"
  19. acceptencodingcust "github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding"
  20. internalChecksum "github.com/aws/aws-sdk-go-v2/service/internal/checksum"
  21. presignedurlcust "github.com/aws/aws-sdk-go-v2/service/internal/presigned-url"
  22. "github.com/aws/aws-sdk-go-v2/service/internal/s3shared"
  23. s3sharedconfig "github.com/aws/aws-sdk-go-v2/service/internal/s3shared/config"
  24. s3cust "github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations"
  25. smithy "github.com/aws/smithy-go"
  26. smithyauth "github.com/aws/smithy-go/auth"
  27. smithydocument "github.com/aws/smithy-go/document"
  28. "github.com/aws/smithy-go/logging"
  29. "github.com/aws/smithy-go/metrics"
  30. "github.com/aws/smithy-go/middleware"
  31. smithyrand "github.com/aws/smithy-go/rand"
  32. "github.com/aws/smithy-go/tracing"
  33. smithyhttp "github.com/aws/smithy-go/transport/http"
  34. "net"
  35. "net/http"
  36. "sync/atomic"
  37. "time"
  38. )
  39. const ServiceID = "S3"
  40. const ServiceAPIVersion = "2006-03-01"
  41. type operationMetrics struct {
  42. Duration metrics.Float64Histogram
  43. SerializeDuration metrics.Float64Histogram
  44. ResolveIdentityDuration metrics.Float64Histogram
  45. ResolveEndpointDuration metrics.Float64Histogram
  46. SignRequestDuration metrics.Float64Histogram
  47. DeserializeDuration metrics.Float64Histogram
  48. }
  49. func (m *operationMetrics) histogramFor(name string) metrics.Float64Histogram {
  50. switch name {
  51. case "client.call.duration":
  52. return m.Duration
  53. case "client.call.serialization_duration":
  54. return m.SerializeDuration
  55. case "client.call.resolve_identity_duration":
  56. return m.ResolveIdentityDuration
  57. case "client.call.resolve_endpoint_duration":
  58. return m.ResolveEndpointDuration
  59. case "client.call.signing_duration":
  60. return m.SignRequestDuration
  61. case "client.call.deserialization_duration":
  62. return m.DeserializeDuration
  63. default:
  64. panic("unrecognized operation metric")
  65. }
  66. }
  67. func timeOperationMetric[T any](
  68. ctx context.Context, metric string, fn func() (T, error),
  69. opts ...metrics.RecordMetricOption,
  70. ) (T, error) {
  71. instr := getOperationMetrics(ctx).histogramFor(metric)
  72. opts = append([]metrics.RecordMetricOption{withOperationMetadata(ctx)}, opts...)
  73. start := time.Now()
  74. v, err := fn()
  75. end := time.Now()
  76. elapsed := end.Sub(start)
  77. instr.Record(ctx, float64(elapsed)/1e9, opts...)
  78. return v, err
  79. }
  80. func startMetricTimer(ctx context.Context, metric string, opts ...metrics.RecordMetricOption) func() {
  81. instr := getOperationMetrics(ctx).histogramFor(metric)
  82. opts = append([]metrics.RecordMetricOption{withOperationMetadata(ctx)}, opts...)
  83. var ended bool
  84. start := time.Now()
  85. return func() {
  86. if ended {
  87. return
  88. }
  89. ended = true
  90. end := time.Now()
  91. elapsed := end.Sub(start)
  92. instr.Record(ctx, float64(elapsed)/1e9, opts...)
  93. }
  94. }
  95. func withOperationMetadata(ctx context.Context) metrics.RecordMetricOption {
  96. return func(o *metrics.RecordMetricOptions) {
  97. o.Properties.Set("rpc.service", middleware.GetServiceID(ctx))
  98. o.Properties.Set("rpc.method", middleware.GetOperationName(ctx))
  99. }
  100. }
  101. type operationMetricsKey struct{}
  102. func withOperationMetrics(parent context.Context, mp metrics.MeterProvider) (context.Context, error) {
  103. meter := mp.Meter("github.com/aws/aws-sdk-go-v2/service/s3")
  104. om := &operationMetrics{}
  105. var err error
  106. om.Duration, err = operationMetricTimer(meter, "client.call.duration",
  107. "Overall call duration (including retries and time to send or receive request and response body)")
  108. if err != nil {
  109. return nil, err
  110. }
  111. om.SerializeDuration, err = operationMetricTimer(meter, "client.call.serialization_duration",
  112. "The time it takes to serialize a message body")
  113. if err != nil {
  114. return nil, err
  115. }
  116. om.ResolveIdentityDuration, err = operationMetricTimer(meter, "client.call.auth.resolve_identity_duration",
  117. "The time taken to acquire an identity (AWS credentials, bearer token, etc) from an Identity Provider")
  118. if err != nil {
  119. return nil, err
  120. }
  121. om.ResolveEndpointDuration, err = operationMetricTimer(meter, "client.call.resolve_endpoint_duration",
  122. "The time it takes to resolve an endpoint (endpoint resolver, not DNS) for the request")
  123. if err != nil {
  124. return nil, err
  125. }
  126. om.SignRequestDuration, err = operationMetricTimer(meter, "client.call.auth.signing_duration",
  127. "The time it takes to sign a request")
  128. if err != nil {
  129. return nil, err
  130. }
  131. om.DeserializeDuration, err = operationMetricTimer(meter, "client.call.deserialization_duration",
  132. "The time it takes to deserialize a message body")
  133. if err != nil {
  134. return nil, err
  135. }
  136. return context.WithValue(parent, operationMetricsKey{}, om), nil
  137. }
  138. func operationMetricTimer(m metrics.Meter, name, desc string) (metrics.Float64Histogram, error) {
  139. return m.Float64Histogram(name, func(o *metrics.InstrumentOptions) {
  140. o.UnitLabel = "s"
  141. o.Description = desc
  142. })
  143. }
  144. func getOperationMetrics(ctx context.Context) *operationMetrics {
  145. return ctx.Value(operationMetricsKey{}).(*operationMetrics)
  146. }
  147. func operationTracer(p tracing.TracerProvider) tracing.Tracer {
  148. return p.Tracer("github.com/aws/aws-sdk-go-v2/service/s3")
  149. }
  150. // Client provides the API client to make operations call for Amazon Simple
  151. // Storage Service.
  152. type Client struct {
  153. options Options
  154. // Difference between the time reported by the server and the client
  155. timeOffset *atomic.Int64
  156. }
  157. // New returns an initialized Client based on the functional options. Provide
  158. // additional functional options to further configure the behavior of the client,
  159. // such as changing the client's endpoint or adding custom middleware behavior.
  160. func New(options Options, optFns ...func(*Options)) *Client {
  161. options = options.Copy()
  162. resolveDefaultLogger(&options)
  163. setResolvedDefaultsMode(&options)
  164. resolveRetryer(&options)
  165. resolveHTTPClient(&options)
  166. resolveHTTPSignerV4(&options)
  167. resolveIdempotencyTokenProvider(&options)
  168. resolveEndpointResolverV2(&options)
  169. resolveHTTPSignerV4a(&options)
  170. resolveTracerProvider(&options)
  171. resolveMeterProvider(&options)
  172. resolveAuthSchemeResolver(&options)
  173. for _, fn := range optFns {
  174. fn(&options)
  175. }
  176. finalizeRetryMaxAttempts(&options)
  177. ignoreAnonymousAuth(&options)
  178. resolveExpressCredentials(&options)
  179. finalizeServiceEndpointAuthResolver(&options)
  180. resolveAuthSchemes(&options)
  181. client := &Client{
  182. options: options,
  183. }
  184. finalizeExpressCredentials(&options, client)
  185. initializeTimeOffsetResolver(client)
  186. return client
  187. }
  188. // Options returns a copy of the client configuration.
  189. //
  190. // Callers SHOULD NOT perform mutations on any inner structures within client
  191. // config. Config overrides should instead be made on a per-operation basis through
  192. // functional options.
  193. func (c *Client) Options() Options {
  194. return c.options.Copy()
  195. }
  196. func (c *Client) invokeOperation(
  197. ctx context.Context, opID string, params interface{}, optFns []func(*Options), stackFns ...func(*middleware.Stack, Options) error,
  198. ) (
  199. result interface{}, metadata middleware.Metadata, err error,
  200. ) {
  201. ctx = middleware.ClearStackValues(ctx)
  202. ctx = middleware.WithServiceID(ctx, ServiceID)
  203. ctx = middleware.WithOperationName(ctx, opID)
  204. stack := middleware.NewStack(opID, smithyhttp.NewStackRequest)
  205. options := c.options.Copy()
  206. for _, fn := range optFns {
  207. fn(&options)
  208. }
  209. setSafeEventStreamClientLogMode(&options, opID)
  210. finalizeOperationRetryMaxAttempts(&options, *c)
  211. finalizeClientEndpointResolverOptions(&options)
  212. finalizeOperationExpressCredentials(&options, *c)
  213. finalizeOperationEndpointAuthResolver(&options)
  214. for _, fn := range stackFns {
  215. if err := fn(stack, options); err != nil {
  216. return nil, metadata, err
  217. }
  218. }
  219. for _, fn := range options.APIOptions {
  220. if err := fn(stack); err != nil {
  221. return nil, metadata, err
  222. }
  223. }
  224. ctx, err = withOperationMetrics(ctx, options.MeterProvider)
  225. if err != nil {
  226. return nil, metadata, err
  227. }
  228. tracer := operationTracer(options.TracerProvider)
  229. spanName := fmt.Sprintf("%s.%s", ServiceID, opID)
  230. ctx = tracing.WithOperationTracer(ctx, tracer)
  231. ctx, span := tracer.StartSpan(ctx, spanName, func(o *tracing.SpanOptions) {
  232. o.Kind = tracing.SpanKindClient
  233. o.Properties.Set("rpc.system", "aws-api")
  234. o.Properties.Set("rpc.method", opID)
  235. o.Properties.Set("rpc.service", ServiceID)
  236. })
  237. endTimer := startMetricTimer(ctx, "client.call.duration")
  238. defer endTimer()
  239. defer span.End()
  240. handler := smithyhttp.NewClientHandlerWithOptions(options.HTTPClient, func(o *smithyhttp.ClientHandler) {
  241. o.Meter = options.MeterProvider.Meter("github.com/aws/aws-sdk-go-v2/service/s3")
  242. })
  243. decorated := middleware.DecorateHandler(handler, stack)
  244. result, metadata, err = decorated.Handle(ctx, params)
  245. if err != nil {
  246. span.SetProperty("exception.type", fmt.Sprintf("%T", err))
  247. span.SetProperty("exception.message", err.Error())
  248. var aerr smithy.APIError
  249. if errors.As(err, &aerr) {
  250. span.SetProperty("api.error_code", aerr.ErrorCode())
  251. span.SetProperty("api.error_message", aerr.ErrorMessage())
  252. span.SetProperty("api.error_fault", aerr.ErrorFault().String())
  253. }
  254. err = &smithy.OperationError{
  255. ServiceID: ServiceID,
  256. OperationName: opID,
  257. Err: err,
  258. }
  259. }
  260. span.SetProperty("error", err != nil)
  261. if err == nil {
  262. span.SetStatus(tracing.SpanStatusOK)
  263. } else {
  264. span.SetStatus(tracing.SpanStatusError)
  265. }
  266. return result, metadata, err
  267. }
  268. type operationInputKey struct{}
  269. func setOperationInput(ctx context.Context, input interface{}) context.Context {
  270. return middleware.WithStackValue(ctx, operationInputKey{}, input)
  271. }
  272. func getOperationInput(ctx context.Context) interface{} {
  273. return middleware.GetStackValue(ctx, operationInputKey{})
  274. }
  275. type setOperationInputMiddleware struct {
  276. }
  277. func (*setOperationInputMiddleware) ID() string {
  278. return "setOperationInput"
  279. }
  280. func (m *setOperationInputMiddleware) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) (
  281. out middleware.SerializeOutput, metadata middleware.Metadata, err error,
  282. ) {
  283. ctx = setOperationInput(ctx, in.Parameters)
  284. return next.HandleSerialize(ctx, in)
  285. }
  286. func addProtocolFinalizerMiddlewares(stack *middleware.Stack, options Options, operation string) error {
  287. if err := stack.Finalize.Add(&resolveAuthSchemeMiddleware{operation: operation, options: options}, middleware.Before); err != nil {
  288. return fmt.Errorf("add ResolveAuthScheme: %w", err)
  289. }
  290. if err := stack.Finalize.Insert(&getIdentityMiddleware{options: options}, "ResolveAuthScheme", middleware.After); err != nil {
  291. return fmt.Errorf("add GetIdentity: %v", err)
  292. }
  293. if err := stack.Finalize.Insert(&resolveEndpointV2Middleware{options: options}, "GetIdentity", middleware.After); err != nil {
  294. return fmt.Errorf("add ResolveEndpointV2: %v", err)
  295. }
  296. if err := stack.Finalize.Insert(&signRequestMiddleware{options: options}, "ResolveEndpointV2", middleware.After); err != nil {
  297. return fmt.Errorf("add Signing: %w", err)
  298. }
  299. return nil
  300. }
  301. func resolveAuthSchemeResolver(options *Options) {
  302. if options.AuthSchemeResolver == nil {
  303. options.AuthSchemeResolver = &defaultAuthSchemeResolver{}
  304. }
  305. }
  306. func resolveAuthSchemes(options *Options) {
  307. if options.AuthSchemes == nil {
  308. options.AuthSchemes = []smithyhttp.AuthScheme{
  309. internalauth.NewHTTPAuthScheme("aws.auth#sigv4", &internalauthsmithy.V4SignerAdapter{
  310. Signer: options.HTTPSignerV4,
  311. Logger: options.Logger,
  312. LogSigning: options.ClientLogMode.IsSigning(),
  313. }),
  314. internalauth.NewHTTPAuthScheme("com.amazonaws.s3#sigv4express", &s3cust.ExpressSigner{
  315. Signer: options.HTTPSignerV4,
  316. Logger: options.Logger,
  317. LogSigning: options.ClientLogMode.IsSigning(),
  318. }),
  319. internalauth.NewHTTPAuthScheme("aws.auth#sigv4a", &v4a.SignerAdapter{
  320. Signer: options.httpSignerV4a,
  321. Logger: options.Logger,
  322. LogSigning: options.ClientLogMode.IsSigning(),
  323. }),
  324. }
  325. }
  326. }
  327. type noSmithyDocumentSerde = smithydocument.NoSerde
  328. type legacyEndpointContextSetter struct {
  329. LegacyResolver EndpointResolver
  330. }
  331. func (*legacyEndpointContextSetter) ID() string {
  332. return "legacyEndpointContextSetter"
  333. }
  334. func (m *legacyEndpointContextSetter) HandleInitialize(ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler) (
  335. out middleware.InitializeOutput, metadata middleware.Metadata, err error,
  336. ) {
  337. if m.LegacyResolver != nil {
  338. ctx = awsmiddleware.SetRequiresLegacyEndpoints(ctx, true)
  339. }
  340. return next.HandleInitialize(ctx, in)
  341. }
  342. func addlegacyEndpointContextSetter(stack *middleware.Stack, o Options) error {
  343. return stack.Initialize.Add(&legacyEndpointContextSetter{
  344. LegacyResolver: o.EndpointResolver,
  345. }, middleware.Before)
  346. }
  347. func resolveDefaultLogger(o *Options) {
  348. if o.Logger != nil {
  349. return
  350. }
  351. o.Logger = logging.Nop{}
  352. }
  353. func addSetLoggerMiddleware(stack *middleware.Stack, o Options) error {
  354. return middleware.AddSetLoggerMiddleware(stack, o.Logger)
  355. }
  356. func setResolvedDefaultsMode(o *Options) {
  357. if len(o.resolvedDefaultsMode) > 0 {
  358. return
  359. }
  360. var mode aws.DefaultsMode
  361. mode.SetFromString(string(o.DefaultsMode))
  362. if mode == aws.DefaultsModeAuto {
  363. mode = defaults.ResolveDefaultsModeAuto(o.Region, o.RuntimeEnvironment)
  364. }
  365. o.resolvedDefaultsMode = mode
  366. }
  367. // NewFromConfig returns a new client from the provided config.
  368. func NewFromConfig(cfg aws.Config, optFns ...func(*Options)) *Client {
  369. opts := Options{
  370. Region: cfg.Region,
  371. DefaultsMode: cfg.DefaultsMode,
  372. RuntimeEnvironment: cfg.RuntimeEnvironment,
  373. HTTPClient: cfg.HTTPClient,
  374. Credentials: cfg.Credentials,
  375. APIOptions: cfg.APIOptions,
  376. Logger: cfg.Logger,
  377. ClientLogMode: cfg.ClientLogMode,
  378. AppID: cfg.AppID,
  379. RequestChecksumCalculation: cfg.RequestChecksumCalculation,
  380. ResponseChecksumValidation: cfg.ResponseChecksumValidation,
  381. AuthSchemePreference: cfg.AuthSchemePreference,
  382. }
  383. resolveAWSRetryerProvider(cfg, &opts)
  384. resolveAWSRetryMaxAttempts(cfg, &opts)
  385. resolveAWSRetryMode(cfg, &opts)
  386. resolveAWSEndpointResolver(cfg, &opts)
  387. resolveInterceptors(cfg, &opts)
  388. resolveUseARNRegion(cfg, &opts)
  389. resolveDisableMultiRegionAccessPoints(cfg, &opts)
  390. resolveDisableExpressAuth(cfg, &opts)
  391. resolveUseDualStackEndpoint(cfg, &opts)
  392. resolveUseFIPSEndpoint(cfg, &opts)
  393. resolveBaseEndpoint(cfg, &opts)
  394. return New(opts, func(o *Options) {
  395. for _, opt := range cfg.ServiceOptions {
  396. opt(ServiceID, o)
  397. }
  398. for _, opt := range optFns {
  399. opt(o)
  400. }
  401. })
  402. }
  403. func resolveHTTPClient(o *Options) {
  404. var buildable *awshttp.BuildableClient
  405. if o.HTTPClient != nil {
  406. var ok bool
  407. buildable, ok = o.HTTPClient.(*awshttp.BuildableClient)
  408. if !ok {
  409. return
  410. }
  411. } else {
  412. buildable = awshttp.NewBuildableClient()
  413. }
  414. modeConfig, err := defaults.GetModeConfiguration(o.resolvedDefaultsMode)
  415. if err == nil {
  416. buildable = buildable.WithDialerOptions(func(dialer *net.Dialer) {
  417. if dialerTimeout, ok := modeConfig.GetConnectTimeout(); ok {
  418. dialer.Timeout = dialerTimeout
  419. }
  420. })
  421. buildable = buildable.WithTransportOptions(func(transport *http.Transport) {
  422. if tlsHandshakeTimeout, ok := modeConfig.GetTLSNegotiationTimeout(); ok {
  423. transport.TLSHandshakeTimeout = tlsHandshakeTimeout
  424. }
  425. })
  426. }
  427. o.HTTPClient = buildable
  428. }
  429. func resolveRetryer(o *Options) {
  430. if o.Retryer != nil {
  431. return
  432. }
  433. if len(o.RetryMode) == 0 {
  434. modeConfig, err := defaults.GetModeConfiguration(o.resolvedDefaultsMode)
  435. if err == nil {
  436. o.RetryMode = modeConfig.RetryMode
  437. }
  438. }
  439. if len(o.RetryMode) == 0 {
  440. o.RetryMode = aws.RetryModeStandard
  441. }
  442. var standardOptions []func(*retry.StandardOptions)
  443. if v := o.RetryMaxAttempts; v != 0 {
  444. standardOptions = append(standardOptions, func(so *retry.StandardOptions) {
  445. so.MaxAttempts = v
  446. })
  447. }
  448. switch o.RetryMode {
  449. case aws.RetryModeAdaptive:
  450. var adaptiveOptions []func(*retry.AdaptiveModeOptions)
  451. if len(standardOptions) != 0 {
  452. adaptiveOptions = append(adaptiveOptions, func(ao *retry.AdaptiveModeOptions) {
  453. ao.StandardOptions = append(ao.StandardOptions, standardOptions...)
  454. })
  455. }
  456. o.Retryer = retry.NewAdaptiveMode(adaptiveOptions...)
  457. default:
  458. o.Retryer = retry.NewStandard(standardOptions...)
  459. }
  460. }
  461. func resolveAWSRetryerProvider(cfg aws.Config, o *Options) {
  462. if cfg.Retryer == nil {
  463. return
  464. }
  465. o.Retryer = cfg.Retryer()
  466. }
  467. func resolveAWSRetryMode(cfg aws.Config, o *Options) {
  468. if len(cfg.RetryMode) == 0 {
  469. return
  470. }
  471. o.RetryMode = cfg.RetryMode
  472. }
  473. func resolveAWSRetryMaxAttempts(cfg aws.Config, o *Options) {
  474. if cfg.RetryMaxAttempts == 0 {
  475. return
  476. }
  477. o.RetryMaxAttempts = cfg.RetryMaxAttempts
  478. }
  479. func finalizeRetryMaxAttempts(o *Options) {
  480. if o.RetryMaxAttempts == 0 {
  481. return
  482. }
  483. o.Retryer = retry.AddWithMaxAttempts(o.Retryer, o.RetryMaxAttempts)
  484. }
  485. func finalizeOperationRetryMaxAttempts(o *Options, client Client) {
  486. if v := o.RetryMaxAttempts; v == 0 || v == client.options.RetryMaxAttempts {
  487. return
  488. }
  489. o.Retryer = retry.AddWithMaxAttempts(o.Retryer, o.RetryMaxAttempts)
  490. }
  491. func resolveAWSEndpointResolver(cfg aws.Config, o *Options) {
  492. if cfg.EndpointResolver == nil && cfg.EndpointResolverWithOptions == nil {
  493. return
  494. }
  495. o.EndpointResolver = withEndpointResolver(cfg.EndpointResolver, cfg.EndpointResolverWithOptions)
  496. }
  497. func resolveInterceptors(cfg aws.Config, o *Options) {
  498. o.Interceptors = cfg.Interceptors.Copy()
  499. }
  500. func addClientUserAgent(stack *middleware.Stack, options Options) error {
  501. ua, err := getOrAddRequestUserAgent(stack)
  502. if err != nil {
  503. return err
  504. }
  505. ua.AddSDKAgentKeyValue(awsmiddleware.APIMetadata, "s3", goModuleVersion)
  506. if len(options.AppID) > 0 {
  507. ua.AddSDKAgentKey(awsmiddleware.ApplicationIdentifier, options.AppID)
  508. }
  509. return nil
  510. }
  511. func getOrAddRequestUserAgent(stack *middleware.Stack) (*awsmiddleware.RequestUserAgent, error) {
  512. id := (*awsmiddleware.RequestUserAgent)(nil).ID()
  513. mw, ok := stack.Build.Get(id)
  514. if !ok {
  515. mw = awsmiddleware.NewRequestUserAgent()
  516. if err := stack.Build.Add(mw, middleware.After); err != nil {
  517. return nil, err
  518. }
  519. }
  520. ua, ok := mw.(*awsmiddleware.RequestUserAgent)
  521. if !ok {
  522. return nil, fmt.Errorf("%T for %s middleware did not match expected type", mw, id)
  523. }
  524. return ua, nil
  525. }
  526. type HTTPSignerV4 interface {
  527. SignHTTP(ctx context.Context, credentials aws.Credentials, r *http.Request, payloadHash string, service string, region string, signingTime time.Time, optFns ...func(*v4.SignerOptions)) error
  528. }
  529. func resolveHTTPSignerV4(o *Options) {
  530. if o.HTTPSignerV4 != nil {
  531. return
  532. }
  533. o.HTTPSignerV4 = newDefaultV4Signer(*o)
  534. }
  535. func newDefaultV4Signer(o Options) *v4.Signer {
  536. return v4.NewSigner(func(so *v4.SignerOptions) {
  537. so.Logger = o.Logger
  538. so.LogSigning = o.ClientLogMode.IsSigning()
  539. so.DisableURIPathEscaping = true
  540. })
  541. }
  542. func addClientRequestID(stack *middleware.Stack) error {
  543. return stack.Build.Add(&awsmiddleware.ClientRequestID{}, middleware.After)
  544. }
  545. func addComputeContentLength(stack *middleware.Stack) error {
  546. return stack.Build.Add(&smithyhttp.ComputeContentLength{}, middleware.After)
  547. }
  548. func addRawResponseToMetadata(stack *middleware.Stack) error {
  549. return stack.Deserialize.Add(&awsmiddleware.AddRawResponse{}, middleware.Before)
  550. }
  551. func addRecordResponseTiming(stack *middleware.Stack) error {
  552. return stack.Deserialize.Add(&awsmiddleware.RecordResponseTiming{}, middleware.After)
  553. }
  554. func addSpanRetryLoop(stack *middleware.Stack, options Options) error {
  555. return stack.Finalize.Insert(&spanRetryLoop{options: options}, "Retry", middleware.Before)
  556. }
  557. type spanRetryLoop struct {
  558. options Options
  559. }
  560. func (*spanRetryLoop) ID() string {
  561. return "spanRetryLoop"
  562. }
  563. func (m *spanRetryLoop) HandleFinalize(
  564. ctx context.Context, in middleware.FinalizeInput, next middleware.FinalizeHandler,
  565. ) (
  566. middleware.FinalizeOutput, middleware.Metadata, error,
  567. ) {
  568. tracer := operationTracer(m.options.TracerProvider)
  569. ctx, span := tracer.StartSpan(ctx, "RetryLoop")
  570. defer span.End()
  571. return next.HandleFinalize(ctx, in)
  572. }
  573. func addStreamingEventsPayload(stack *middleware.Stack) error {
  574. return stack.Finalize.Add(&v4.StreamingEventsPayload{}, middleware.Before)
  575. }
  576. func addUnsignedPayload(stack *middleware.Stack) error {
  577. return stack.Finalize.Insert(&v4.UnsignedPayload{}, "ResolveEndpointV2", middleware.After)
  578. }
  579. func addComputePayloadSHA256(stack *middleware.Stack) error {
  580. return stack.Finalize.Insert(&v4.ComputePayloadSHA256{}, "ResolveEndpointV2", middleware.After)
  581. }
  582. func addContentSHA256Header(stack *middleware.Stack) error {
  583. return stack.Finalize.Insert(&v4.ContentSHA256Header{}, (*v4.ComputePayloadSHA256)(nil).ID(), middleware.After)
  584. }
  585. func addIsWaiterUserAgent(o *Options) {
  586. o.APIOptions = append(o.APIOptions, func(stack *middleware.Stack) error {
  587. ua, err := getOrAddRequestUserAgent(stack)
  588. if err != nil {
  589. return err
  590. }
  591. ua.AddUserAgentFeature(awsmiddleware.UserAgentFeatureWaiter)
  592. return nil
  593. })
  594. }
  595. func addIsPaginatorUserAgent(o *Options) {
  596. o.APIOptions = append(o.APIOptions, func(stack *middleware.Stack) error {
  597. ua, err := getOrAddRequestUserAgent(stack)
  598. if err != nil {
  599. return err
  600. }
  601. ua.AddUserAgentFeature(awsmiddleware.UserAgentFeaturePaginator)
  602. return nil
  603. })
  604. }
  605. func resolveIdempotencyTokenProvider(o *Options) {
  606. if o.IdempotencyTokenProvider != nil {
  607. return
  608. }
  609. o.IdempotencyTokenProvider = smithyrand.NewUUIDIdempotencyToken(cryptorand.Reader)
  610. }
  611. func addRetry(stack *middleware.Stack, o Options) error {
  612. attempt := retry.NewAttemptMiddleware(o.Retryer, smithyhttp.RequestCloner, func(m *retry.Attempt) {
  613. m.LogAttempts = o.ClientLogMode.IsRetries()
  614. m.OperationMeter = o.MeterProvider.Meter("github.com/aws/aws-sdk-go-v2/service/s3")
  615. })
  616. if err := stack.Finalize.Insert(attempt, "ResolveAuthScheme", middleware.Before); err != nil {
  617. return err
  618. }
  619. if err := stack.Finalize.Insert(&retry.MetricsHeader{}, attempt.ID(), middleware.After); err != nil {
  620. return err
  621. }
  622. return nil
  623. }
  624. // resolves UseARNRegion S3 configuration
  625. func resolveUseARNRegion(cfg aws.Config, o *Options) error {
  626. if len(cfg.ConfigSources) == 0 {
  627. return nil
  628. }
  629. value, found, err := s3sharedconfig.ResolveUseARNRegion(context.Background(), cfg.ConfigSources)
  630. if err != nil {
  631. return err
  632. }
  633. if found {
  634. o.UseARNRegion = value
  635. }
  636. return nil
  637. }
  638. // resolves DisableMultiRegionAccessPoints S3 configuration
  639. func resolveDisableMultiRegionAccessPoints(cfg aws.Config, o *Options) error {
  640. if len(cfg.ConfigSources) == 0 {
  641. return nil
  642. }
  643. value, found, err := s3sharedconfig.ResolveDisableMultiRegionAccessPoints(context.Background(), cfg.ConfigSources)
  644. if err != nil {
  645. return err
  646. }
  647. if found {
  648. o.DisableMultiRegionAccessPoints = value
  649. }
  650. return nil
  651. }
  652. // resolves dual-stack endpoint configuration
  653. func resolveUseDualStackEndpoint(cfg aws.Config, o *Options) error {
  654. if len(cfg.ConfigSources) == 0 {
  655. return nil
  656. }
  657. value, found, err := internalConfig.ResolveUseDualStackEndpoint(context.Background(), cfg.ConfigSources)
  658. if err != nil {
  659. return err
  660. }
  661. if found {
  662. o.EndpointOptions.UseDualStackEndpoint = value
  663. }
  664. return nil
  665. }
  666. // resolves FIPS endpoint configuration
  667. func resolveUseFIPSEndpoint(cfg aws.Config, o *Options) error {
  668. if len(cfg.ConfigSources) == 0 {
  669. return nil
  670. }
  671. value, found, err := internalConfig.ResolveUseFIPSEndpoint(context.Background(), cfg.ConfigSources)
  672. if err != nil {
  673. return err
  674. }
  675. if found {
  676. o.EndpointOptions.UseFIPSEndpoint = value
  677. }
  678. return nil
  679. }
  680. func resolveAccountID(identity smithyauth.Identity, mode aws.AccountIDEndpointMode) *string {
  681. if mode == aws.AccountIDEndpointModeDisabled {
  682. return nil
  683. }
  684. if ca, ok := identity.(*internalauthsmithy.CredentialsAdapter); ok && ca.Credentials.AccountID != "" {
  685. return aws.String(ca.Credentials.AccountID)
  686. }
  687. return nil
  688. }
  689. type httpSignerV4a interface {
  690. SignHTTP(ctx context.Context, credentials v4a.Credentials, r *http.Request, payloadHash,
  691. service string, regionSet []string, signingTime time.Time,
  692. optFns ...func(*v4a.SignerOptions)) error
  693. }
  694. func resolveHTTPSignerV4a(o *Options) {
  695. if o.httpSignerV4a != nil {
  696. return
  697. }
  698. o.httpSignerV4a = newDefaultV4aSigner(*o)
  699. }
  700. func newDefaultV4aSigner(o Options) *v4a.Signer {
  701. return v4a.NewSigner(func(so *v4a.SignerOptions) {
  702. so.Logger = o.Logger
  703. so.LogSigning = o.ClientLogMode.IsSigning()
  704. })
  705. }
  706. func addTimeOffsetBuild(stack *middleware.Stack, c *Client) error {
  707. mw := internalmiddleware.AddTimeOffsetMiddleware{Offset: c.timeOffset}
  708. if err := stack.Build.Add(&mw, middleware.After); err != nil {
  709. return err
  710. }
  711. return stack.Deserialize.Insert(&mw, "RecordResponseTiming", middleware.Before)
  712. }
  713. func initializeTimeOffsetResolver(c *Client) {
  714. c.timeOffset = new(atomic.Int64)
  715. }
  716. func addUserAgentRetryMode(stack *middleware.Stack, options Options) error {
  717. ua, err := getOrAddRequestUserAgent(stack)
  718. if err != nil {
  719. return err
  720. }
  721. switch options.Retryer.(type) {
  722. case *retry.Standard:
  723. ua.AddUserAgentFeature(awsmiddleware.UserAgentFeatureRetryModeStandard)
  724. case *retry.AdaptiveMode:
  725. ua.AddUserAgentFeature(awsmiddleware.UserAgentFeatureRetryModeAdaptive)
  726. }
  727. return nil
  728. }
  729. func addRequestChecksumMetricsTracking(stack *middleware.Stack, options Options) error {
  730. ua, err := getOrAddRequestUserAgent(stack)
  731. if err != nil {
  732. return err
  733. }
  734. return stack.Build.Insert(&internalChecksum.RequestChecksumMetricsTracking{
  735. RequestChecksumCalculation: options.RequestChecksumCalculation,
  736. UserAgent: ua,
  737. }, "UserAgent", middleware.Before)
  738. }
  739. func addResponseChecksumMetricsTracking(stack *middleware.Stack, options Options) error {
  740. ua, err := getOrAddRequestUserAgent(stack)
  741. if err != nil {
  742. return err
  743. }
  744. return stack.Build.Insert(&internalChecksum.ResponseChecksumMetricsTracking{
  745. ResponseChecksumValidation: options.ResponseChecksumValidation,
  746. UserAgent: ua,
  747. }, "UserAgent", middleware.Before)
  748. }
  749. type setCredentialSourceMiddleware struct {
  750. ua *awsmiddleware.RequestUserAgent
  751. options Options
  752. }
  753. func (m setCredentialSourceMiddleware) ID() string { return "SetCredentialSourceMiddleware" }
  754. func (m setCredentialSourceMiddleware) HandleBuild(ctx context.Context, in middleware.BuildInput, next middleware.BuildHandler) (
  755. out middleware.BuildOutput, metadata middleware.Metadata, err error,
  756. ) {
  757. asProviderSource, ok := m.options.Credentials.(aws.CredentialProviderSource)
  758. if !ok {
  759. return next.HandleBuild(ctx, in)
  760. }
  761. providerSources := asProviderSource.ProviderSources()
  762. for _, source := range providerSources {
  763. m.ua.AddCredentialsSource(source)
  764. }
  765. return next.HandleBuild(ctx, in)
  766. }
  767. func addCredentialSource(stack *middleware.Stack, options Options) error {
  768. ua, err := getOrAddRequestUserAgent(stack)
  769. if err != nil {
  770. return err
  771. }
  772. mw := setCredentialSourceMiddleware{ua: ua, options: options}
  773. return stack.Build.Insert(&mw, "UserAgent", middleware.Before)
  774. }
  775. func resolveTracerProvider(options *Options) {
  776. if options.TracerProvider == nil {
  777. options.TracerProvider = &tracing.NopTracerProvider{}
  778. }
  779. }
  780. func resolveMeterProvider(options *Options) {
  781. if options.MeterProvider == nil {
  782. options.MeterProvider = metrics.NopMeterProvider{}
  783. }
  784. }
  785. // IdempotencyTokenProvider interface for providing idempotency token
  786. type IdempotencyTokenProvider interface {
  787. GetIdempotencyToken() (string, error)
  788. }
  789. func addMetadataRetrieverMiddleware(stack *middleware.Stack) error {
  790. return s3shared.AddMetadataRetrieverMiddleware(stack)
  791. }
  792. func add100Continue(stack *middleware.Stack, options Options) error {
  793. return s3shared.Add100Continue(stack, options.ContinueHeaderThresholdBytes)
  794. }
  795. func addRecursionDetection(stack *middleware.Stack) error {
  796. return stack.Build.Add(&awsmiddleware.RecursionDetection{}, middleware.After)
  797. }
  798. // ComputedInputChecksumsMetadata provides information about the algorithms used
  799. // to compute the checksum(s) of the input payload.
  800. type ComputedInputChecksumsMetadata struct {
  801. // ComputedChecksums is a map of algorithm name to checksum value of the computed
  802. // input payload's checksums.
  803. ComputedChecksums map[string]string
  804. }
  805. // GetComputedInputChecksumsMetadata retrieves from the result metadata the map of
  806. // algorithms and input payload checksums values.
  807. func GetComputedInputChecksumsMetadata(m middleware.Metadata) (ComputedInputChecksumsMetadata, bool) {
  808. values, ok := internalChecksum.GetComputedInputChecksums(m)
  809. if !ok {
  810. return ComputedInputChecksumsMetadata{}, false
  811. }
  812. return ComputedInputChecksumsMetadata{
  813. ComputedChecksums: values,
  814. }, true
  815. }
  816. func addInputChecksumMiddleware(stack *middleware.Stack, options internalChecksum.InputMiddlewareOptions) (err error) {
  817. err = stack.Initialize.Add(&internalChecksum.SetupInputContext{
  818. GetAlgorithm: options.GetAlgorithm,
  819. RequireChecksum: options.RequireChecksum,
  820. RequestChecksumCalculation: options.RequestChecksumCalculation,
  821. }, middleware.Before)
  822. if err != nil {
  823. return err
  824. }
  825. stack.Build.Remove("ContentChecksum")
  826. inputChecksum := &internalChecksum.ComputeInputPayloadChecksum{
  827. EnableTrailingChecksum: options.EnableTrailingChecksum,
  828. EnableComputePayloadHash: options.EnableComputeSHA256PayloadHash,
  829. EnableDecodedContentLengthHeader: options.EnableDecodedContentLengthHeader,
  830. }
  831. if err := stack.Finalize.Insert(inputChecksum, "ResolveEndpointV2", middleware.After); err != nil {
  832. return err
  833. }
  834. if options.EnableTrailingChecksum {
  835. trailerMiddleware := &internalChecksum.AddInputChecksumTrailer{
  836. EnableTrailingChecksum: inputChecksum.EnableTrailingChecksum,
  837. EnableComputePayloadHash: inputChecksum.EnableComputePayloadHash,
  838. EnableDecodedContentLengthHeader: inputChecksum.EnableDecodedContentLengthHeader,
  839. }
  840. if err := stack.Finalize.Insert(trailerMiddleware, inputChecksum.ID(), middleware.After); err != nil {
  841. return err
  842. }
  843. }
  844. return nil
  845. }
  846. // ChecksumValidationMetadata contains metadata such as the checksum algorithm
  847. // used for data integrity validation.
  848. type ChecksumValidationMetadata struct {
  849. // AlgorithmsUsed is the set of the checksum algorithms used to validate the
  850. // response payload. The response payload must be completely read in order for the
  851. // checksum validation to be performed. An error is returned by the operation
  852. // output's response io.ReadCloser if the computed checksums are invalid.
  853. AlgorithmsUsed []string
  854. }
  855. // GetChecksumValidationMetadata returns the set of algorithms that will be used
  856. // to validate the response payload with. The response payload must be completely
  857. // read in order for the checksum validation to be performed. An error is returned
  858. // by the operation output's response io.ReadCloser if the computed checksums are
  859. // invalid. Returns false if no checksum algorithm used metadata was found.
  860. func GetChecksumValidationMetadata(m middleware.Metadata) (ChecksumValidationMetadata, bool) {
  861. values, ok := internalChecksum.GetOutputValidationAlgorithmsUsed(m)
  862. if !ok {
  863. return ChecksumValidationMetadata{}, false
  864. }
  865. return ChecksumValidationMetadata{
  866. AlgorithmsUsed: append(make([]string, 0, len(values)), values...),
  867. }, true
  868. }
  869. // nopGetBucketAccessor is no-op accessor for operation that don't support bucket
  870. // member as input
  871. func nopGetBucketAccessor(input interface{}) (*string, bool) {
  872. return nil, false
  873. }
  874. func addResponseErrorMiddleware(stack *middleware.Stack) error {
  875. return s3shared.AddResponseErrorMiddleware(stack)
  876. }
  877. func disableAcceptEncodingGzip(stack *middleware.Stack) error {
  878. return acceptencodingcust.AddAcceptEncodingGzip(stack, acceptencodingcust.AddAcceptEncodingGzipOptions{})
  879. }
  880. // ResponseError provides the HTTP centric error type wrapping the underlying
  881. // error with the HTTP response value and the deserialized RequestID.
  882. type ResponseError interface {
  883. error
  884. ServiceHostID() string
  885. ServiceRequestID() string
  886. }
  887. var _ ResponseError = (*s3shared.ResponseError)(nil)
  888. // GetHostIDMetadata retrieves the host id from middleware metadata returns host
  889. // id as string along with a boolean indicating presence of hostId on middleware
  890. // metadata.
  891. func GetHostIDMetadata(metadata middleware.Metadata) (string, bool) {
  892. return s3shared.GetHostIDMetadata(metadata)
  893. }
  894. // HTTPPresignerV4 represents presigner interface used by presign url client
  895. type HTTPPresignerV4 interface {
  896. PresignHTTP(
  897. ctx context.Context, credentials aws.Credentials, r *http.Request,
  898. payloadHash string, service string, region string, signingTime time.Time,
  899. optFns ...func(*v4.SignerOptions),
  900. ) (url string, signedHeader http.Header, err error)
  901. }
  902. // httpPresignerV4a represents sigv4a presigner interface used by presign url
  903. // client
  904. type httpPresignerV4a interface {
  905. PresignHTTP(
  906. ctx context.Context, credentials v4a.Credentials, r *http.Request,
  907. payloadHash string, service string, regionSet []string, signingTime time.Time,
  908. optFns ...func(*v4a.SignerOptions),
  909. ) (url string, signedHeader http.Header, err error)
  910. }
  911. // PresignOptions represents the presign client options
  912. type PresignOptions struct {
  913. // ClientOptions are list of functional options to mutate client options used by
  914. // the presign client.
  915. ClientOptions []func(*Options)
  916. // Presigner is the presigner used by the presign url client
  917. Presigner HTTPPresignerV4
  918. // Expires sets the expiration duration for the generated presign url. This should
  919. // be the duration in seconds the presigned URL should be considered valid for. If
  920. // not set or set to zero, presign url would default to expire after 900 seconds.
  921. Expires time.Duration
  922. // presignerV4a is the presigner used by the presign url client
  923. presignerV4a httpPresignerV4a
  924. }
  925. func (o PresignOptions) copy() PresignOptions {
  926. clientOptions := make([]func(*Options), len(o.ClientOptions))
  927. copy(clientOptions, o.ClientOptions)
  928. o.ClientOptions = clientOptions
  929. return o
  930. }
  931. // WithPresignClientFromClientOptions is a helper utility to retrieve a function
  932. // that takes PresignOption as input
  933. func WithPresignClientFromClientOptions(optFns ...func(*Options)) func(*PresignOptions) {
  934. return withPresignClientFromClientOptions(optFns).options
  935. }
  936. type withPresignClientFromClientOptions []func(*Options)
  937. func (w withPresignClientFromClientOptions) options(o *PresignOptions) {
  938. o.ClientOptions = append(o.ClientOptions, w...)
  939. }
  940. // WithPresignExpires is a helper utility to append Expires value on presign
  941. // options optional function
  942. func WithPresignExpires(dur time.Duration) func(*PresignOptions) {
  943. return withPresignExpires(dur).options
  944. }
  945. type withPresignExpires time.Duration
  946. func (w withPresignExpires) options(o *PresignOptions) {
  947. o.Expires = time.Duration(w)
  948. }
  949. // PresignClient represents the presign url client
  950. type PresignClient struct {
  951. client *Client
  952. options PresignOptions
  953. }
  954. // NewPresignClient generates a presign client using provided API Client and
  955. // presign options
  956. func NewPresignClient(c *Client, optFns ...func(*PresignOptions)) *PresignClient {
  957. var options PresignOptions
  958. for _, fn := range optFns {
  959. fn(&options)
  960. }
  961. if len(options.ClientOptions) != 0 {
  962. c = New(c.options, options.ClientOptions...)
  963. }
  964. if options.Presigner == nil {
  965. options.Presigner = newDefaultV4Signer(c.options)
  966. }
  967. if options.presignerV4a == nil {
  968. options.presignerV4a = newDefaultV4aSigner(c.options)
  969. }
  970. return &PresignClient{
  971. client: c,
  972. options: options,
  973. }
  974. }
  975. func withNopHTTPClientAPIOption(o *Options) {
  976. o.HTTPClient = smithyhttp.NopClient{}
  977. }
  978. type presignContextPolyfillMiddleware struct {
  979. }
  980. func (*presignContextPolyfillMiddleware) ID() string {
  981. return "presignContextPolyfill"
  982. }
  983. func (m *presignContextPolyfillMiddleware) HandleFinalize(ctx context.Context, in middleware.FinalizeInput, next middleware.FinalizeHandler) (
  984. out middleware.FinalizeOutput, metadata middleware.Metadata, err error,
  985. ) {
  986. rscheme := getResolvedAuthScheme(ctx)
  987. if rscheme == nil {
  988. return out, metadata, fmt.Errorf("no resolved auth scheme")
  989. }
  990. schemeID := rscheme.Scheme.SchemeID()
  991. ctx = s3cust.SetSignerVersion(ctx, schemeID)
  992. if schemeID == "aws.auth#sigv4" || schemeID == "com.amazonaws.s3#sigv4express" {
  993. if sn, ok := smithyhttp.GetSigV4SigningName(&rscheme.SignerProperties); ok {
  994. ctx = awsmiddleware.SetSigningName(ctx, sn)
  995. }
  996. if sr, ok := smithyhttp.GetSigV4SigningRegion(&rscheme.SignerProperties); ok {
  997. ctx = awsmiddleware.SetSigningRegion(ctx, sr)
  998. }
  999. } else if schemeID == "aws.auth#sigv4a" {
  1000. if sn, ok := smithyhttp.GetSigV4ASigningName(&rscheme.SignerProperties); ok {
  1001. ctx = awsmiddleware.SetSigningName(ctx, sn)
  1002. }
  1003. if sr, ok := smithyhttp.GetSigV4ASigningRegions(&rscheme.SignerProperties); ok {
  1004. ctx = awsmiddleware.SetSigningRegion(ctx, sr[0])
  1005. }
  1006. }
  1007. return next.HandleFinalize(ctx, in)
  1008. }
  1009. type presignConverter PresignOptions
  1010. func (c presignConverter) convertToPresignMiddleware(stack *middleware.Stack, options Options) (err error) {
  1011. if _, ok := stack.Finalize.Get((*acceptencodingcust.DisableGzip)(nil).ID()); ok {
  1012. stack.Finalize.Remove((*acceptencodingcust.DisableGzip)(nil).ID())
  1013. }
  1014. if _, ok := stack.Finalize.Get((*retry.Attempt)(nil).ID()); ok {
  1015. stack.Finalize.Remove((*retry.Attempt)(nil).ID())
  1016. }
  1017. if _, ok := stack.Finalize.Get((*retry.MetricsHeader)(nil).ID()); ok {
  1018. stack.Finalize.Remove((*retry.MetricsHeader)(nil).ID())
  1019. }
  1020. stack.Deserialize.Clear()
  1021. stack.Build.Remove((*awsmiddleware.ClientRequestID)(nil).ID())
  1022. stack.Build.Remove("UserAgent")
  1023. if err := stack.Finalize.Insert(&presignContextPolyfillMiddleware{}, "Signing", middleware.Before); err != nil {
  1024. return err
  1025. }
  1026. pmw := v4.NewPresignHTTPRequestMiddleware(v4.PresignHTTPRequestMiddlewareOptions{
  1027. CredentialsProvider: options.Credentials,
  1028. Presigner: c.Presigner,
  1029. LogSigning: options.ClientLogMode.IsSigning(),
  1030. })
  1031. if _, err := stack.Finalize.Swap("Signing", pmw); err != nil {
  1032. return err
  1033. }
  1034. if err = smithyhttp.AddNoPayloadDefaultContentTypeRemover(stack); err != nil {
  1035. return err
  1036. }
  1037. // extended s3 presigning
  1038. signermv := s3cust.NewPresignHTTPRequestMiddleware(s3cust.PresignHTTPRequestMiddlewareOptions{
  1039. CredentialsProvider: options.Credentials,
  1040. ExpressCredentials: options.ExpressCredentials,
  1041. V4Presigner: c.Presigner,
  1042. V4aPresigner: c.presignerV4a,
  1043. LogSigning: options.ClientLogMode.IsSigning(),
  1044. })
  1045. err = s3cust.RegisterPreSigningMiddleware(stack, signermv)
  1046. if err != nil {
  1047. return err
  1048. }
  1049. if c.Expires < 0 {
  1050. return fmt.Errorf("presign URL duration must be 0 or greater, %v", c.Expires)
  1051. }
  1052. // add middleware to set expiration for s3 presigned url, if expiration is set to
  1053. // 0, this middleware sets a default expiration of 900 seconds
  1054. err = stack.Build.Add(&s3cust.AddExpiresOnPresignedURL{Expires: c.Expires}, middleware.After)
  1055. if err != nil {
  1056. return err
  1057. }
  1058. err = presignedurlcust.AddAsIsPresigningMiddleware(stack)
  1059. if err != nil {
  1060. return err
  1061. }
  1062. return nil
  1063. }
  1064. func withNoDefaultChecksumAPIOption(options *Options) {
  1065. options.RequestChecksumCalculation = aws.RequestChecksumCalculationWhenRequired
  1066. }
  1067. func addRequestResponseLogging(stack *middleware.Stack, o Options) error {
  1068. return stack.Deserialize.Add(&smithyhttp.RequestResponseLogger{
  1069. LogRequest: o.ClientLogMode.IsRequest(),
  1070. LogRequestWithBody: o.ClientLogMode.IsRequestWithBody(),
  1071. LogResponse: o.ClientLogMode.IsResponse(),
  1072. LogResponseWithBody: o.ClientLogMode.IsResponseWithBody(),
  1073. }, middleware.After)
  1074. }
  1075. type disableHTTPSMiddleware struct {
  1076. DisableHTTPS bool
  1077. }
  1078. func (*disableHTTPSMiddleware) ID() string {
  1079. return "disableHTTPS"
  1080. }
  1081. func (m *disableHTTPSMiddleware) HandleFinalize(ctx context.Context, in middleware.FinalizeInput, next middleware.FinalizeHandler) (
  1082. out middleware.FinalizeOutput, metadata middleware.Metadata, err error,
  1083. ) {
  1084. req, ok := in.Request.(*smithyhttp.Request)
  1085. if !ok {
  1086. return out, metadata, fmt.Errorf("unknown transport type %T", in.Request)
  1087. }
  1088. if m.DisableHTTPS && !smithyhttp.GetHostnameImmutable(ctx) {
  1089. req.URL.Scheme = "http"
  1090. }
  1091. return next.HandleFinalize(ctx, in)
  1092. }
  1093. func addDisableHTTPSMiddleware(stack *middleware.Stack, o Options) error {
  1094. return stack.Finalize.Insert(&disableHTTPSMiddleware{
  1095. DisableHTTPS: o.EndpointOptions.DisableHTTPS,
  1096. }, "ResolveEndpointV2", middleware.After)
  1097. }
  1098. func addInterceptBeforeRetryLoop(stack *middleware.Stack, opts Options) error {
  1099. return stack.Finalize.Insert(&smithyhttp.InterceptBeforeRetryLoop{
  1100. Interceptors: opts.Interceptors.BeforeRetryLoop,
  1101. }, "Retry", middleware.Before)
  1102. }
  1103. func addInterceptAttempt(stack *middleware.Stack, opts Options) error {
  1104. return stack.Finalize.Insert(&smithyhttp.InterceptAttempt{
  1105. BeforeAttempt: opts.Interceptors.BeforeAttempt,
  1106. AfterAttempt: opts.Interceptors.AfterAttempt,
  1107. }, "Retry", middleware.After)
  1108. }
  1109. func addInterceptExecution(stack *middleware.Stack, opts Options) error {
  1110. return stack.Initialize.Add(&smithyhttp.InterceptExecution{
  1111. BeforeExecution: opts.Interceptors.BeforeExecution,
  1112. AfterExecution: opts.Interceptors.AfterExecution,
  1113. }, middleware.Before)
  1114. }
  1115. func addInterceptBeforeSerialization(stack *middleware.Stack, opts Options) error {
  1116. return stack.Serialize.Insert(&smithyhttp.InterceptBeforeSerialization{
  1117. Interceptors: opts.Interceptors.BeforeSerialization,
  1118. }, "OperationSerializer", middleware.Before)
  1119. }
  1120. func addInterceptAfterSerialization(stack *middleware.Stack, opts Options) error {
  1121. return stack.Serialize.Insert(&smithyhttp.InterceptAfterSerialization{
  1122. Interceptors: opts.Interceptors.AfterSerialization,
  1123. }, "OperationSerializer", middleware.After)
  1124. }
  1125. func addInterceptBeforeSigning(stack *middleware.Stack, opts Options) error {
  1126. return stack.Finalize.Insert(&smithyhttp.InterceptBeforeSigning{
  1127. Interceptors: opts.Interceptors.BeforeSigning,
  1128. }, "Signing", middleware.Before)
  1129. }
  1130. func addInterceptAfterSigning(stack *middleware.Stack, opts Options) error {
  1131. return stack.Finalize.Insert(&smithyhttp.InterceptAfterSigning{
  1132. Interceptors: opts.Interceptors.AfterSigning,
  1133. }, "Signing", middleware.After)
  1134. }
  1135. func addInterceptTransmit(stack *middleware.Stack, opts Options) error {
  1136. return stack.Deserialize.Add(&smithyhttp.InterceptTransmit{
  1137. BeforeTransmit: opts.Interceptors.BeforeTransmit,
  1138. AfterTransmit: opts.Interceptors.AfterTransmit,
  1139. }, middleware.After)
  1140. }
  1141. func addInterceptBeforeDeserialization(stack *middleware.Stack, opts Options) error {
  1142. return stack.Deserialize.Insert(&smithyhttp.InterceptBeforeDeserialization{
  1143. Interceptors: opts.Interceptors.BeforeDeserialization,
  1144. }, "OperationDeserializer", middleware.After) // (deserialize stack is called in reverse)
  1145. }
  1146. func addInterceptAfterDeserialization(stack *middleware.Stack, opts Options) error {
  1147. return stack.Deserialize.Insert(&smithyhttp.InterceptAfterDeserialization{
  1148. Interceptors: opts.Interceptors.AfterDeserialization,
  1149. }, "OperationDeserializer", middleware.Before)
  1150. }
  1151. type spanInitializeStart struct {
  1152. }
  1153. func (*spanInitializeStart) ID() string {
  1154. return "spanInitializeStart"
  1155. }
  1156. func (m *spanInitializeStart) HandleInitialize(
  1157. ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler,
  1158. ) (
  1159. middleware.InitializeOutput, middleware.Metadata, error,
  1160. ) {
  1161. ctx, _ = tracing.StartSpan(ctx, "Initialize")
  1162. return next.HandleInitialize(ctx, in)
  1163. }
  1164. type spanInitializeEnd struct {
  1165. }
  1166. func (*spanInitializeEnd) ID() string {
  1167. return "spanInitializeEnd"
  1168. }
  1169. func (m *spanInitializeEnd) HandleInitialize(
  1170. ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler,
  1171. ) (
  1172. middleware.InitializeOutput, middleware.Metadata, error,
  1173. ) {
  1174. ctx, span := tracing.PopSpan(ctx)
  1175. span.End()
  1176. return next.HandleInitialize(ctx, in)
  1177. }
  1178. type spanBuildRequestStart struct {
  1179. }
  1180. func (*spanBuildRequestStart) ID() string {
  1181. return "spanBuildRequestStart"
  1182. }
  1183. func (m *spanBuildRequestStart) HandleSerialize(
  1184. ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler,
  1185. ) (
  1186. middleware.SerializeOutput, middleware.Metadata, error,
  1187. ) {
  1188. ctx, _ = tracing.StartSpan(ctx, "BuildRequest")
  1189. return next.HandleSerialize(ctx, in)
  1190. }
  1191. type spanBuildRequestEnd struct {
  1192. }
  1193. func (*spanBuildRequestEnd) ID() string {
  1194. return "spanBuildRequestEnd"
  1195. }
  1196. func (m *spanBuildRequestEnd) HandleBuild(
  1197. ctx context.Context, in middleware.BuildInput, next middleware.BuildHandler,
  1198. ) (
  1199. middleware.BuildOutput, middleware.Metadata, error,
  1200. ) {
  1201. ctx, span := tracing.PopSpan(ctx)
  1202. span.End()
  1203. return next.HandleBuild(ctx, in)
  1204. }
  1205. func addSpanInitializeStart(stack *middleware.Stack) error {
  1206. return stack.Initialize.Add(&spanInitializeStart{}, middleware.Before)
  1207. }
  1208. func addSpanInitializeEnd(stack *middleware.Stack) error {
  1209. return stack.Initialize.Add(&spanInitializeEnd{}, middleware.After)
  1210. }
  1211. func addSpanBuildRequestStart(stack *middleware.Stack) error {
  1212. return stack.Serialize.Add(&spanBuildRequestStart{}, middleware.Before)
  1213. }
  1214. func addSpanBuildRequestEnd(stack *middleware.Stack) error {
  1215. return stack.Build.Add(&spanBuildRequestEnd{}, middleware.After)
  1216. }