in private/model/api/customization_passes.go [205:291]
func s3Customizations(a *API) error {
// back-fill signing name as 's3'
a.Metadata.SigningName = "s3"
var strExpires *Shape
var keepContentMD5Ref = map[string]struct{}{
"PutObjectInput": {},
"UploadPartInput": {},
}
for name, s := range a.Shapes {
// Remove ContentMD5 members unless specified otherwise.
if _, keep := keepContentMD5Ref[name]; !keep {
if _, have := s.MemberRefs["ContentMD5"]; have {
delete(s.MemberRefs, "ContentMD5")
}
}
// Generate getter methods for API operation fields used by customizations.
for _, refName := range []string{"Bucket", "SSECustomerKey", "CopySourceSSECustomerKey"} {
if ref, ok := s.MemberRefs[refName]; ok {
ref.GenerateGetter = true
}
}
// Generate a endpointARN method for the BucketName shape if this is used as an operation input
if s.UsedAsInput {
if s.ShapeName == "CreateBucketInput" {
// For all operations but CreateBucket the BucketName shape
// needs to be decorated.
continue
}
var endpointARNShape *ShapeRef
for _, ref := range s.MemberRefs {
if ref.OrigShapeName != "BucketName" || ref.Shape.Type != "string" {
continue
}
if endpointARNShape != nil {
return fmt.Errorf("more then one BucketName shape present on shape")
}
ref.EndpointARN = true
endpointARNShape = ref
}
if endpointARNShape != nil {
s.HasEndpointARNMember = true
a.HasEndpointARN = true
}
}
// Decorate member references that are modeled with the wrong type.
// Specifically the case where a member was modeled as a string, but is
// expected to sent across the wire as a base64 value.
//
// e.g. S3's SSECustomerKey and CopySourceSSECustomerKey
for _, refName := range []string{
"SSECustomerKey",
"CopySourceSSECustomerKey",
} {
if ref, ok := s.MemberRefs[refName]; ok {
ref.CustomTags = append(ref.CustomTags, ShapeTag{
"marshal-as", "blob",
})
}
}
// Expires should be a string not time.Time since the format is not
// enforced by S3, and any value can be set to this field outside of the SDK.
if strings.HasSuffix(name, "Output") {
if ref, ok := s.MemberRefs["Expires"]; ok {
if strExpires == nil {
newShape := *ref.Shape
strExpires = &newShape
strExpires.Type = "string"
strExpires.refs = []*ShapeRef{}
}
ref.Shape.removeRef(ref)
ref.Shape = strExpires
ref.Shape.refs = append(ref.Shape.refs, &s.MemberRef)
}
}
}
s3CustRemoveHeadObjectModeledErrors(a)
return nil
}