53 lines
1.3 KiB
Go
53 lines
1.3 KiB
Go
package checksum
|
|
|
|
import (
|
|
"crypto/md5"
|
|
"encoding/base64"
|
|
"fmt"
|
|
|
|
"github.com/aws/aws-sdk-go/aws"
|
|
"github.com/aws/aws-sdk-go/aws/awserr"
|
|
"github.com/aws/aws-sdk-go/aws/request"
|
|
)
|
|
|
|
const contentMD5Header = "Content-Md5"
|
|
|
|
// AddBodyContentMD5Handler computes and sets the HTTP Content-MD5 header for requests that
|
|
// require it.
|
|
func AddBodyContentMD5Handler(r *request.Request) {
|
|
// if Content-MD5 header is already present, return
|
|
if v := r.HTTPRequest.Header.Get(contentMD5Header); len(v) != 0 {
|
|
return
|
|
}
|
|
|
|
// if S3DisableContentMD5Validation flag is set, return
|
|
if aws.BoolValue(r.Config.S3DisableContentMD5Validation) {
|
|
return
|
|
}
|
|
|
|
// if request is presigned, return
|
|
if r.IsPresigned() {
|
|
return
|
|
}
|
|
|
|
// if body is not seekable, return
|
|
if !aws.IsReaderSeekable(r.Body) {
|
|
if r.Config.Logger != nil {
|
|
r.Config.Logger.Log(fmt.Sprintf(
|
|
"Unable to compute Content-MD5 for unseekable body, S3.%s",
|
|
r.Operation.Name))
|
|
}
|
|
return
|
|
}
|
|
|
|
h := md5.New()
|
|
|
|
if _, err := aws.CopySeekableBody(h, r.Body); err != nil {
|
|
r.Error = awserr.New("ContentMD5", "failed to compute body MD5", err)
|
|
return
|
|
}
|
|
|
|
// encode the md5 checksum in base64 and set the request header.
|
|
v := base64.StdEncoding.EncodeToString(h.Sum(nil))
|
|
r.HTTPRequest.Header.Set(contentMD5Header, v)
|
|
}
|