1package protocol
2
3import (
4	"strings"
5
6	"github.com/aws/aws-sdk-go/aws"
7	"github.com/aws/aws-sdk-go/aws/request"
8)
9
10// HostPrefixHandlerName is the handler name for the host prefix request
11// handler.
12const HostPrefixHandlerName = "awssdk.endpoint.HostPrefixHandler"
13
14// NewHostPrefixHandler constructs a build handler
15func NewHostPrefixHandler(prefix string, labelsFn func() map[string]string) request.NamedHandler {
16	builder := HostPrefixBuilder{
17		Prefix:   prefix,
18		LabelsFn: labelsFn,
19	}
20
21	return request.NamedHandler{
22		Name: HostPrefixHandlerName,
23		Fn:   builder.Build,
24	}
25}
26
27// HostPrefixBuilder provides the request handler to expand and prepend
28// the host prefix into the operation's request endpoint host.
29type HostPrefixBuilder struct {
30	Prefix   string
31	LabelsFn func() map[string]string
32}
33
34// Build updates the passed in Request with the HostPrefix template expanded.
35func (h HostPrefixBuilder) Build(r *request.Request) {
36	if aws.BoolValue(r.Config.DisableEndpointHostPrefix) {
37		return
38	}
39
40	var labels map[string]string
41	if h.LabelsFn != nil {
42		labels = h.LabelsFn()
43	}
44
45	prefix := h.Prefix
46	for name, value := range labels {
47		prefix = strings.Replace(prefix, "{"+name+"}", value, -1)
48	}
49
50	r.HTTPRequest.URL.Host = prefix + r.HTTPRequest.URL.Host
51	if len(r.HTTPRequest.Host) > 0 {
52		r.HTTPRequest.Host = prefix + r.HTTPRequest.Host
53	}
54}
55