54 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			Go
		
	
	
			
		
		
	
	
			54 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)
 | 
						|
}
 |