]>
Commit | Line | Data |
---|---|---|
bae9f6d2 JC |
1 | package client |
2 | ||
3 | import ( | |
4 | "fmt" | |
bae9f6d2 JC |
5 | |
6 | "github.com/aws/aws-sdk-go/aws" | |
bae9f6d2 JC |
7 | "github.com/aws/aws-sdk-go/aws/client/metadata" |
8 | "github.com/aws/aws-sdk-go/aws/request" | |
9 | ) | |
10 | ||
11 | // A Config provides configuration to a service client instance. | |
12 | type Config struct { | |
13 | Config *aws.Config | |
14 | Handlers request.Handlers | |
15 | Endpoint string | |
16 | SigningRegion string | |
17 | SigningName string | |
15c0b25d AP |
18 | |
19 | // States that the signing name did not come from a modeled source but | |
20 | // was derived based on other data. Used by service client constructors | |
107c1cdb | 21 | // to determine if the signin name can be overridden based on metadata the |
15c0b25d AP |
22 | // service has. |
23 | SigningNameDerived bool | |
bae9f6d2 JC |
24 | } |
25 | ||
26 | // ConfigProvider provides a generic way for a service client to receive | |
27 | // the ClientConfig without circular dependencies. | |
28 | type ConfigProvider interface { | |
29 | ClientConfig(serviceName string, cfgs ...*aws.Config) Config | |
30 | } | |
31 | ||
32 | // ConfigNoResolveEndpointProvider same as ConfigProvider except it will not | |
33 | // resolve the endpoint automatically. The service client's endpoint must be | |
34 | // provided via the aws.Config.Endpoint field. | |
35 | type ConfigNoResolveEndpointProvider interface { | |
36 | ClientConfigNoResolveEndpoint(cfgs ...*aws.Config) Config | |
37 | } | |
38 | ||
39 | // A Client implements the base client request and response handling | |
40 | // used by all service clients. | |
41 | type Client struct { | |
42 | request.Retryer | |
43 | metadata.ClientInfo | |
44 | ||
45 | Config aws.Config | |
46 | Handlers request.Handlers | |
47 | } | |
48 | ||
49 | // New will return a pointer to a new initialized service client. | |
50 | func New(cfg aws.Config, info metadata.ClientInfo, handlers request.Handlers, options ...func(*Client)) *Client { | |
51 | svc := &Client{ | |
52 | Config: cfg, | |
53 | ClientInfo: info, | |
54 | Handlers: handlers.Copy(), | |
55 | } | |
56 | ||
57 | switch retryer, ok := cfg.Retryer.(request.Retryer); { | |
58 | case ok: | |
59 | svc.Retryer = retryer | |
60 | case cfg.Retryer != nil && cfg.Logger != nil: | |
61 | s := fmt.Sprintf("WARNING: %T does not implement request.Retryer; using DefaultRetryer instead", cfg.Retryer) | |
62 | cfg.Logger.Log(s) | |
63 | fallthrough | |
64 | default: | |
65 | maxRetries := aws.IntValue(cfg.MaxRetries) | |
66 | if cfg.MaxRetries == nil || maxRetries == aws.UseServiceDefaultRetries { | |
67 | maxRetries = 3 | |
68 | } | |
69 | svc.Retryer = DefaultRetryer{NumMaxRetries: maxRetries} | |
70 | } | |
71 | ||
72 | svc.AddDebugHandlers() | |
73 | ||
74 | for _, option := range options { | |
75 | option(svc) | |
76 | } | |
77 | ||
78 | return svc | |
79 | } | |
80 | ||
81 | // NewRequest returns a new Request pointer for the service API | |
82 | // operation and parameters. | |
83 | func (c *Client) NewRequest(operation *request.Operation, params interface{}, data interface{}) *request.Request { | |
84 | return request.New(c.Config, c.ClientInfo, c.Handlers, c.Retryer, operation, params, data) | |
85 | } | |
86 | ||
87 | // AddDebugHandlers injects debug logging handlers into the service to log request | |
88 | // debug information. | |
89 | func (c *Client) AddDebugHandlers() { | |
90 | if !c.Config.LogLevel.AtLeast(aws.LogDebug) { | |
91 | return | |
92 | } | |
93 | ||
15c0b25d AP |
94 | c.Handlers.Send.PushFrontNamed(LogHTTPRequestHandler) |
95 | c.Handlers.Send.PushBackNamed(LogHTTPResponseHandler) | |
bae9f6d2 | 96 | } |