middleware.go 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. package client
  2. import (
  3. "context"
  4. "encoding/json"
  5. "fmt"
  6. "net/url"
  7. "github.com/aws/smithy-go"
  8. smithymiddleware "github.com/aws/smithy-go/middleware"
  9. smithyhttp "github.com/aws/smithy-go/transport/http"
  10. )
  11. type buildEndpoint struct {
  12. Endpoint string
  13. }
  14. func (b *buildEndpoint) ID() string {
  15. return "BuildEndpoint"
  16. }
  17. func (b *buildEndpoint) HandleBuild(ctx context.Context, in smithymiddleware.BuildInput, next smithymiddleware.BuildHandler) (
  18. out smithymiddleware.BuildOutput, metadata smithymiddleware.Metadata, err error,
  19. ) {
  20. request, ok := in.Request.(*smithyhttp.Request)
  21. if !ok {
  22. return out, metadata, fmt.Errorf("unknown transport, %T", in.Request)
  23. }
  24. if len(b.Endpoint) == 0 {
  25. return out, metadata, fmt.Errorf("endpoint not provided")
  26. }
  27. parsed, err := url.Parse(b.Endpoint)
  28. if err != nil {
  29. return out, metadata, fmt.Errorf("failed to parse endpoint, %w", err)
  30. }
  31. request.URL = parsed
  32. return next.HandleBuild(ctx, in)
  33. }
  34. type serializeOpGetCredential struct{}
  35. func (s *serializeOpGetCredential) ID() string {
  36. return "OperationSerializer"
  37. }
  38. func (s *serializeOpGetCredential) HandleSerialize(ctx context.Context, in smithymiddleware.SerializeInput, next smithymiddleware.SerializeHandler) (
  39. out smithymiddleware.SerializeOutput, metadata smithymiddleware.Metadata, err error,
  40. ) {
  41. request, ok := in.Request.(*smithyhttp.Request)
  42. if !ok {
  43. return out, metadata, fmt.Errorf("unknown transport type, %T", in.Request)
  44. }
  45. params, ok := in.Parameters.(*GetCredentialsInput)
  46. if !ok {
  47. return out, metadata, fmt.Errorf("unknown input parameters, %T", in.Parameters)
  48. }
  49. const acceptHeader = "Accept"
  50. request.Header[acceptHeader] = append(request.Header[acceptHeader][:0], "application/json")
  51. if len(params.AuthorizationToken) > 0 {
  52. const authHeader = "Authorization"
  53. request.Header[authHeader] = append(request.Header[authHeader][:0], params.AuthorizationToken)
  54. }
  55. return next.HandleSerialize(ctx, in)
  56. }
  57. type deserializeOpGetCredential struct{}
  58. func (d *deserializeOpGetCredential) ID() string {
  59. return "OperationDeserializer"
  60. }
  61. func (d *deserializeOpGetCredential) HandleDeserialize(ctx context.Context, in smithymiddleware.DeserializeInput, next smithymiddleware.DeserializeHandler) (
  62. out smithymiddleware.DeserializeOutput, metadata smithymiddleware.Metadata, err error,
  63. ) {
  64. out, metadata, err = next.HandleDeserialize(ctx, in)
  65. if err != nil {
  66. return out, metadata, err
  67. }
  68. response, ok := out.RawResponse.(*smithyhttp.Response)
  69. if !ok {
  70. return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)}
  71. }
  72. if response.StatusCode < 200 || response.StatusCode >= 300 {
  73. return out, metadata, deserializeError(response)
  74. }
  75. var shape *GetCredentialsOutput
  76. if err = json.NewDecoder(response.Body).Decode(&shape); err != nil {
  77. return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("failed to deserialize json response, %w", err)}
  78. }
  79. out.Result = shape
  80. return out, metadata, err
  81. }
  82. func deserializeError(response *smithyhttp.Response) error {
  83. var errShape *EndpointError
  84. err := json.NewDecoder(response.Body).Decode(&errShape)
  85. if err != nil {
  86. return &smithy.DeserializationError{Err: fmt.Errorf("failed to decode error message, %w", err)}
  87. }
  88. if response.StatusCode >= 500 {
  89. errShape.Fault = smithy.FaultServer
  90. } else {
  91. errShape.Fault = smithy.FaultClient
  92. }
  93. return errShape
  94. }