client.go 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. package client
  2. import (
  3. "fmt"
  4. "github.com/aws/aws-sdk-go/aws"
  5. "github.com/aws/aws-sdk-go/aws/client/metadata"
  6. "github.com/aws/aws-sdk-go/aws/request"
  7. )
  8. // A Config provides configuration to a service client instance.
  9. type Config struct {
  10. Config *aws.Config
  11. Handlers request.Handlers
  12. Endpoint string
  13. SigningRegion string
  14. SigningName string
  15. }
  16. // ConfigProvider provides a generic way for a service client to receive
  17. // the ClientConfig without circular dependencies.
  18. type ConfigProvider interface {
  19. ClientConfig(serviceName string, cfgs ...*aws.Config) Config
  20. }
  21. // ConfigNoResolveEndpointProvider same as ConfigProvider except it will not
  22. // resolve the endpoint automatically. The service client's endpoint must be
  23. // provided via the aws.Config.Endpoint field.
  24. type ConfigNoResolveEndpointProvider interface {
  25. ClientConfigNoResolveEndpoint(cfgs ...*aws.Config) Config
  26. }
  27. // A Client implements the base client request and response handling
  28. // used by all service clients.
  29. type Client struct {
  30. request.Retryer
  31. metadata.ClientInfo
  32. Config aws.Config
  33. Handlers request.Handlers
  34. }
  35. // New will return a pointer to a new initialized service client.
  36. func New(cfg aws.Config, info metadata.ClientInfo, handlers request.Handlers, options ...func(*Client)) *Client {
  37. svc := &Client{
  38. Config: cfg,
  39. ClientInfo: info,
  40. Handlers: handlers.Copy(),
  41. }
  42. switch retryer, ok := cfg.Retryer.(request.Retryer); {
  43. case ok:
  44. svc.Retryer = retryer
  45. case cfg.Retryer != nil && cfg.Logger != nil:
  46. s := fmt.Sprintf("WARNING: %T does not implement request.Retryer; using DefaultRetryer instead", cfg.Retryer)
  47. cfg.Logger.Log(s)
  48. fallthrough
  49. default:
  50. maxRetries := aws.IntValue(cfg.MaxRetries)
  51. if cfg.MaxRetries == nil || maxRetries == aws.UseServiceDefaultRetries {
  52. maxRetries = 3
  53. }
  54. svc.Retryer = DefaultRetryer{NumMaxRetries: maxRetries}
  55. }
  56. svc.AddDebugHandlers()
  57. for _, option := range options {
  58. option(svc)
  59. }
  60. return svc
  61. }
  62. // NewRequest returns a new Request pointer for the service API
  63. // operation and parameters.
  64. func (c *Client) NewRequest(operation *request.Operation, params interface{}, data interface{}) *request.Request {
  65. return request.New(c.Config, c.ClientInfo, c.Handlers, c.Retryer, operation, params, data)
  66. }
  67. // AddDebugHandlers injects debug logging handlers into the service to log request
  68. // debug information.
  69. func (c *Client) AddDebugHandlers() {
  70. if !c.Config.LogLevel.AtLeast(aws.LogDebug) {
  71. return
  72. }
  73. c.Handlers.Send.PushFrontNamed(request.NamedHandler{Name: "awssdk.client.LogRequest", Fn: logRequest})
  74. c.Handlers.Send.PushBackNamed(request.NamedHandler{Name: "awssdk.client.LogResponse", Fn: logResponse})
  75. }