github.com/aavshr/aws-sdk-go@v1.41.3/private/checksum/content_md5.go (about) 1 package checksum 2 3 import ( 4 "crypto/md5" 5 "encoding/base64" 6 "fmt" 7 8 "github.com/aavshr/aws-sdk-go/aws" 9 "github.com/aavshr/aws-sdk-go/aws/awserr" 10 "github.com/aavshr/aws-sdk-go/aws/request" 11 ) 12 13 const contentMD5Header = "Content-Md5" 14 15 // AddBodyContentMD5Handler computes and sets the HTTP Content-MD5 header for requests that 16 // require it. 17 func AddBodyContentMD5Handler(r *request.Request) { 18 // if Content-MD5 header is already present, return 19 if v := r.HTTPRequest.Header.Get(contentMD5Header); len(v) != 0 { 20 return 21 } 22 23 // if S3DisableContentMD5Validation flag is set, return 24 if aws.BoolValue(r.Config.S3DisableContentMD5Validation) { 25 return 26 } 27 28 // if request is presigned, return 29 if r.IsPresigned() { 30 return 31 } 32 33 // if body is not seekable, return 34 if !aws.IsReaderSeekable(r.Body) { 35 if r.Config.Logger != nil { 36 r.Config.Logger.Log(fmt.Sprintf( 37 "Unable to compute Content-MD5 for unseekable body, S3.%s", 38 r.Operation.Name)) 39 } 40 return 41 } 42 43 h := md5.New() 44 45 if _, err := aws.CopySeekableBody(h, r.Body); err != nil { 46 r.Error = awserr.New("ContentMD5", "failed to compute body MD5", err) 47 return 48 } 49 50 // encode the md5 checksum in base64 and set the request header. 51 v := base64.StdEncoding.EncodeToString(h.Sum(nil)) 52 r.HTTPRequest.Header.Set(contentMD5Header, v) 53 }