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  }