...
1 package http
2
3 import (
4 "context"
5 "fmt"
6
7 "github.com/aws/smithy-go/middleware"
8 )
9
10 const contentMD5Header = "Content-Md5"
11
12
13
14 type contentMD5Checksum struct {
15 }
16
17
18
19 func AddContentChecksumMiddleware(stack *middleware.Stack) error {
20
21 return stack.Build.Add(&contentMD5Checksum{}, middleware.Before)
22 }
23
24
25 func (m *contentMD5Checksum) ID() string { return "ContentChecksum" }
26
27
28
29 func (m *contentMD5Checksum) HandleBuild(
30 ctx context.Context, in middleware.BuildInput, next middleware.BuildHandler,
31 ) (
32 out middleware.BuildOutput, metadata middleware.Metadata, err error,
33 ) {
34 req, ok := in.Request.(*Request)
35 if !ok {
36 return out, metadata, fmt.Errorf("unknown request type %T", req)
37 }
38
39
40 if v := req.Header.Get(contentMD5Header); len(v) != 0 {
41 return next.HandleBuild(ctx, in)
42 }
43
44
45 stream := req.GetStream()
46
47 if stream != nil {
48 if !req.IsStreamSeekable() {
49 return out, metadata, fmt.Errorf(
50 "unseekable stream is not supported for computing md5 checksum")
51 }
52
53 v, err := computeMD5Checksum(stream)
54 if err != nil {
55 return out, metadata, fmt.Errorf("error computing md5 checksum, %w", err)
56 }
57
58
59 if err := req.RewindStream(); err != nil {
60 return out, metadata, fmt.Errorf(
61 "error rewinding request stream after computing md5 checksum, %w", err)
62 }
63
64
65 req.Header.Set(contentMD5Header, string(v))
66 }
67
68
69 return next.HandleBuild(ctx, in)
70 }
71
View as plain text