1package s3 2 3import ( 4 "github.com/aws/aws-sdk-go/aws/client" 5 "github.com/aws/aws-sdk-go/aws/request" 6 "github.com/aws/aws-sdk-go/internal/s3shared/arn" 7 "github.com/aws/aws-sdk-go/internal/s3shared/s3err" 8) 9 10func init() { 11 initClient = defaultInitClientFn 12 initRequest = defaultInitRequestFn 13} 14 15func defaultInitClientFn(c *client.Client) { 16 // Support building custom endpoints based on config 17 c.Handlers.Build.PushFront(endpointHandler) 18 19 // Require SSL when using SSE keys 20 c.Handlers.Validate.PushBack(validateSSERequiresSSL) 21 c.Handlers.Build.PushBack(computeSSEKeyMD5) 22 c.Handlers.Build.PushBack(computeCopySourceSSEKeyMD5) 23 24 // S3 uses custom error unmarshaling logic 25 c.Handlers.UnmarshalError.Clear() 26 c.Handlers.UnmarshalError.PushBack(unmarshalError) 27 c.Handlers.UnmarshalError.PushBackNamed(s3err.RequestFailureWrapperHandler()) 28} 29 30func defaultInitRequestFn(r *request.Request) { 31 // Add request handlers for specific platforms. 32 // e.g. 100-continue support for PUT requests using Go 1.6 33 platformRequestHandlers(r) 34 35 switch r.Operation.Name { 36 case opGetBucketLocation: 37 // GetBucketLocation has custom parsing logic 38 r.Handlers.Unmarshal.PushFront(buildGetBucketLocation) 39 case opCreateBucket: 40 // Auto-populate LocationConstraint with current region 41 r.Handlers.Validate.PushFront(populateLocationConstraint) 42 case opCopyObject, opUploadPartCopy, opCompleteMultipartUpload: 43 r.Handlers.Unmarshal.PushFront(copyMultipartStatusOKUnmarshalError) 44 r.Handlers.Unmarshal.PushBackNamed(s3err.RequestFailureWrapperHandler()) 45 case opPutObject, opUploadPart: 46 r.Handlers.Build.PushBack(computeBodyHashes) 47 // Disabled until #1837 root issue is resolved. 48 // case opGetObject: 49 // r.Handlers.Build.PushBack(askForTxEncodingAppendMD5) 50 // r.Handlers.Unmarshal.PushBack(useMD5ValidationReader) 51 case opWriteGetObjectResponse: 52 r.Handlers.Build.PushFront(buildWriteGetObjectResponseEndpoint) 53 } 54} 55 56// bucketGetter is an accessor interface to grab the "Bucket" field from 57// an S3 type. 58type bucketGetter interface { 59 getBucket() string 60} 61 62// sseCustomerKeyGetter is an accessor interface to grab the "SSECustomerKey" 63// field from an S3 type. 64type sseCustomerKeyGetter interface { 65 getSSECustomerKey() string 66} 67 68// copySourceSSECustomerKeyGetter is an accessor interface to grab the 69// "CopySourceSSECustomerKey" field from an S3 type. 70type copySourceSSECustomerKeyGetter interface { 71 getCopySourceSSECustomerKey() string 72} 73 74// endpointARNGetter is an accessor interface to grab the 75// the field corresponding to an endpoint ARN input. 76type endpointARNGetter interface { 77 getEndpointARN() (arn.Resource, error) 78 hasEndpointARN() bool 79} 80