123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164 |
- package client
- import (
- "context"
- "encoding/json"
- "fmt"
- "io"
- "net/url"
- "github.com/aws/smithy-go"
- smithymiddleware "github.com/aws/smithy-go/middleware"
- smithyhttp "github.com/aws/smithy-go/transport/http"
- )
- type buildEndpoint struct {
- Endpoint string
- }
- func (b *buildEndpoint) ID() string {
- return "BuildEndpoint"
- }
- func (b *buildEndpoint) HandleBuild(ctx context.Context, in smithymiddleware.BuildInput, next smithymiddleware.BuildHandler) (
- out smithymiddleware.BuildOutput, metadata smithymiddleware.Metadata, err error,
- ) {
- request, ok := in.Request.(*smithyhttp.Request)
- if !ok {
- return out, metadata, fmt.Errorf("unknown transport, %T", in.Request)
- }
- if len(b.Endpoint) == 0 {
- return out, metadata, fmt.Errorf("endpoint not provided")
- }
- parsed, err := url.Parse(b.Endpoint)
- if err != nil {
- return out, metadata, fmt.Errorf("failed to parse endpoint, %w", err)
- }
- request.URL = parsed
- return next.HandleBuild(ctx, in)
- }
- type serializeOpGetCredential struct{}
- func (s *serializeOpGetCredential) ID() string {
- return "OperationSerializer"
- }
- func (s *serializeOpGetCredential) HandleSerialize(ctx context.Context, in smithymiddleware.SerializeInput, next smithymiddleware.SerializeHandler) (
- out smithymiddleware.SerializeOutput, metadata smithymiddleware.Metadata, err error,
- ) {
- request, ok := in.Request.(*smithyhttp.Request)
- if !ok {
- return out, metadata, fmt.Errorf("unknown transport type, %T", in.Request)
- }
- params, ok := in.Parameters.(*GetCredentialsInput)
- if !ok {
- return out, metadata, fmt.Errorf("unknown input parameters, %T", in.Parameters)
- }
- const acceptHeader = "Accept"
- request.Header[acceptHeader] = append(request.Header[acceptHeader][:0], "application/json")
- if len(params.AuthorizationToken) > 0 {
- const authHeader = "Authorization"
- request.Header[authHeader] = append(request.Header[authHeader][:0], params.AuthorizationToken)
- }
- return next.HandleSerialize(ctx, in)
- }
- type deserializeOpGetCredential struct{}
- func (d *deserializeOpGetCredential) ID() string {
- return "OperationDeserializer"
- }
- func (d *deserializeOpGetCredential) HandleDeserialize(ctx context.Context, in smithymiddleware.DeserializeInput, next smithymiddleware.DeserializeHandler) (
- out smithymiddleware.DeserializeOutput, metadata smithymiddleware.Metadata, err error,
- ) {
- out, metadata, err = next.HandleDeserialize(ctx, in)
- if err != nil {
- return out, metadata, err
- }
- response, ok := out.RawResponse.(*smithyhttp.Response)
- if !ok {
- return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)}
- }
- if response.StatusCode < 200 || response.StatusCode >= 300 {
- return out, metadata, deserializeError(response)
- }
- var shape *GetCredentialsOutput
- if err = json.NewDecoder(response.Body).Decode(&shape); err != nil {
- return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("failed to deserialize json response, %w", err)}
- }
- out.Result = shape
- return out, metadata, err
- }
- func deserializeError(response *smithyhttp.Response) error {
- // we could be talking to anything, json isn't guaranteed
- // see https://github.com/aws/aws-sdk-go-v2/issues/2316
- if response.Header.Get("Content-Type") == "application/json" {
- return deserializeJSONError(response)
- }
- msg, err := io.ReadAll(response.Body)
- if err != nil {
- return &smithy.DeserializationError{
- Err: fmt.Errorf("read response, %w", err),
- }
- }
- return &EndpointError{
- // no sensible value for Code
- Message: string(msg),
- Fault: stof(response.StatusCode),
- statusCode: response.StatusCode,
- }
- }
- func deserializeJSONError(response *smithyhttp.Response) error {
- var errShape *EndpointError
- if err := json.NewDecoder(response.Body).Decode(&errShape); err != nil {
- return &smithy.DeserializationError{
- Err: fmt.Errorf("failed to decode error message, %w", err),
- }
- }
- errShape.Fault = stof(response.StatusCode)
- errShape.statusCode = response.StatusCode
- return errShape
- }
- // maps HTTP status code to smithy ErrorFault
- func stof(code int) smithy.ErrorFault {
- if code >= 500 {
- return smithy.FaultServer
- }
- return smithy.FaultClient
- }
- func addProtocolFinalizerMiddlewares(stack *smithymiddleware.Stack, options Options, operation string) error {
- if err := stack.Finalize.Add(&resolveAuthSchemeMiddleware{operation: operation, options: options}, smithymiddleware.Before); err != nil {
- return fmt.Errorf("add ResolveAuthScheme: %w", err)
- }
- if err := stack.Finalize.Insert(&getIdentityMiddleware{options: options}, "ResolveAuthScheme", smithymiddleware.After); err != nil {
- return fmt.Errorf("add GetIdentity: %w", err)
- }
- if err := stack.Finalize.Insert(&resolveEndpointV2Middleware{options: options}, "GetIdentity", smithymiddleware.After); err != nil {
- return fmt.Errorf("add ResolveEndpointV2: %w", err)
- }
- if err := stack.Finalize.Insert(&signRequestMiddleware{}, "ResolveEndpointV2", smithymiddleware.After); err != nil {
- return fmt.Errorf("add Signing: %w", err)
- }
- return nil
- }
|