| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112 |
- package aws
- import (
- "github.com/ks3sdklib/aws-sdk-go/aws/retry"
- "github.com/ks3sdklib/aws-sdk-go/internal/endpoints"
- "net/http"
- "net/http/httputil"
- "regexp"
- )
- // A Service implements the base service request and response handling
- // used by all services.
- type Service struct {
- Config *Config
- Handlers Handlers
- ManualSend bool
- ServiceName string
- APIVersion string
- Endpoint string
- SigningName string
- SigningRegion string
- JSONVersion string
- TargetPrefix string
- RetryRule retry.RetryRule
- ShouldRetry func(error) bool
- MaxRetries int
- }
- var schemeRE = regexp.MustCompile("^([^:]+)://")
- // NewService will return a pointer to a new Server object initialized.
- func NewService(config *Config) *Service {
- svc := &Service{Config: config}
- svc.Initialize()
- return svc
- }
- // Initialize initializes the service.
- func (s *Service) Initialize() {
- if s.Config == nil {
- s.Config = &Config{}
- }
- if s.Config.HTTPClient == nil {
- s.Config.HTTPClient = http.DefaultClient
- }
- if s.RetryRule == nil {
- s.RetryRule = s.Config.RetryRule
- }
- if s.ShouldRetry == nil {
- s.ShouldRetry = s.Config.ShouldRetry
- }
- s.MaxRetries = s.Config.MaxRetries
- s.Handlers.Validate.PushBack(ValidateEndpointHandler)
- s.Handlers.Build.PushBack(UserAgentHandler)
- s.Handlers.Sign.PushBack(BuildContentLength)
- s.Handlers.Send.PushBack(SendHandler)
- s.Handlers.AfterRetry.PushBack(AfterRetryHandler)
- s.Handlers.ValidateResponse.PushBack(ValidateResponseHandler)
- s.AddDebugHandlers()
- s.buildEndpoint()
- if !s.Config.DisableParamValidation {
- s.Handlers.Validate.PushBack(ValidateParameters)
- }
- }
- // buildEndpoint builds the endpoint values the service will use to make requests with.
- func (s *Service) buildEndpoint() {
- if s.Config.Endpoint != "" {
- s.Endpoint = s.Config.Endpoint
- } else {
- s.Endpoint, s.SigningRegion =
- endpoints.EndpointForRegion(s.ServiceName, s.Config.Region)
- }
- if s.Endpoint != "" && !schemeRE.MatchString(s.Endpoint) {
- scheme := "https"
- if s.Config.DisableSSL {
- scheme = "http"
- }
- s.Endpoint = scheme + "://" + s.Endpoint
- }
- }
- // AddDebugHandlers injects debug logging handlers into the service to log request
- // debug information.
- func (s *Service) AddDebugHandlers() {
- if s.Config.LogLevel < Debug {
- return
- }
- s.Handlers.Send.PushFront(func(r *Request) {
- logBody := r.Config.LogHTTPBody
- dumpedBody, _ := httputil.DumpRequestOut(r.HTTPRequest, logBody)
- r.Config.LogDebug("---[ REQUEST ]-----------------------------")
- r.Config.LogDebug("%s", string(dumpedBody))
- r.Config.LogDebug("-----------------------------------------------------")
- })
- s.Handlers.Send.PushBack(func(r *Request) {
- r.Config.LogDebug("---[ RESPONSE ]--------------------------------------")
- if r.HTTPResponse != nil {
- logBody := r.Config.LogHTTPBody
- dumpedBody, _ := httputil.DumpResponse(r.HTTPResponse, logBody)
- r.Config.LogDebug("%s", string(dumpedBody))
- } else if r.Error != nil {
- r.Config.LogDebug("%s", r.Error.Error())
- }
- r.Config.LogDebug("-----------------------------------------------------")
- })
- }
|