-
Notifications
You must be signed in to change notification settings - Fork 37
/
user_agent.go
88 lines (73 loc) · 2.82 KB
/
user_agent.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
// Copyright (c) HashiCorp, Inc.
// SPDX-License-Identifier: MPL-2.0
package awsbase
import (
"context"
"fmt"
"github.com/aws/smithy-go/middleware"
smithyhttp "github.com/aws/smithy-go/transport/http"
"github.com/hashicorp/aws-sdk-go-base/v2/useragent"
)
func apnUserAgentMiddleware(apn APNInfo) middleware.BuildMiddleware {
return middleware.BuildMiddlewareFunc("tfAPNUserAgent",
func(ctx context.Context, in middleware.BuildInput, next middleware.BuildHandler) (middleware.BuildOutput, middleware.Metadata, error) {
request, ok := in.Request.(*smithyhttp.Request)
if !ok {
return middleware.BuildOutput{}, middleware.Metadata{}, fmt.Errorf("unknown request type %T", in.Request)
}
prependUserAgentHeader(request, apn.BuildUserAgentString())
return next.HandleBuild(ctx, in)
},
)
}
// Because the default User-Agent middleware prepends itself to the contents of the User-Agent header,
// we have to run after it and also prepend our custom User-Agent
func prependUserAgentHeader(request *smithyhttp.Request, value string) {
current := request.Header.Get("User-Agent")
if len(current) > 0 {
current = value + " " + current
} else {
current = value
}
request.Header["User-Agent"] = append(request.Header["User-Agent"][:0], current)
}
func withUserAgentAppender(ua string) func(*middleware.Stack) error {
return func(stack *middleware.Stack) error {
return stack.Build.Add(userAgentMiddleware(ua), middleware.After)
}
}
func userAgentMiddleware(ua string) middleware.BuildMiddleware {
return middleware.BuildMiddlewareFunc("tfUserAgentAppender",
func(ctx context.Context, in middleware.BuildInput, next middleware.BuildHandler) (middleware.BuildOutput, middleware.Metadata, error) {
request, ok := in.Request.(*smithyhttp.Request)
if !ok {
return middleware.BuildOutput{}, middleware.Metadata{}, fmt.Errorf("unknown request type %T", in.Request)
}
appendUserAgentHeader(request, ua)
return next.HandleBuild(ctx, in)
},
)
}
func userAgentFromContextMiddleware() middleware.BuildMiddleware {
return middleware.BuildMiddlewareFunc("tfCtxUserAgentAppender",
func(ctx context.Context, in middleware.BuildInput, next middleware.BuildHandler) (middleware.BuildOutput, middleware.Metadata, error) {
request, ok := in.Request.(*smithyhttp.Request)
if !ok {
return middleware.BuildOutput{}, middleware.Metadata{}, fmt.Errorf("unknown request type %T", in.Request)
}
if v := useragent.BuildFromContext(ctx); v != "" {
appendUserAgentHeader(request, v)
}
return next.HandleBuild(ctx, in)
},
)
}
func appendUserAgentHeader(request *smithyhttp.Request, value string) {
current := request.Header.Get("User-Agent")
if len(current) > 0 {
current = current + " " + value
} else {
current = value
}
request.Header["User-Agent"] = append(request.Header["User-Agent"][:0], current)
}