-
Notifications
You must be signed in to change notification settings - Fork 40
/
request_handler.go
96 lines (80 loc) · 2.2 KB
/
request_handler.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
89
90
91
92
93
94
95
96
// Package client provides internal utilities for the twilio-go client library.
package client
import (
"net/http"
"net/url"
"os"
"strings"
)
type RequestHandler struct {
Client BaseClient
Edge string
Region string
}
func NewRequestHandler(client BaseClient) *RequestHandler {
return &RequestHandler{
Client: client,
Edge: os.Getenv("TWILIO_EDGE"),
Region: os.Getenv("TWILIO_REGION"),
}
}
func (c *RequestHandler) sendRequest(method string, rawURL string, data url.Values,
headers map[string]interface{}) (*http.Response, error) {
parsedURL, err := c.BuildUrl(rawURL)
if err != nil {
return nil, err
}
return c.Client.SendRequest(method, parsedURL, data, headers)
}
// BuildUrl builds the target host string taking into account region and edge configurations.
func (c *RequestHandler) BuildUrl(rawURL string) (string, error) {
u, err := url.Parse(rawURL)
if err != nil {
return "", err
}
var (
edge = ""
region = ""
pieces = strings.Split(u.Host, ".")
product = pieces[0]
result []string
)
suffix := ""
if len(pieces) >= 3 {
suffix = strings.Join(pieces[len(pieces)-2:], ".")
} else {
return u.String(), nil
}
if len(pieces) == 4 {
// product.region.twilio.com
region = pieces[1]
} else if len(pieces) == 5 {
// product.edge.region.twilio.com
edge = pieces[1]
region = pieces[2]
}
if c.Edge != "" {
edge = c.Edge
}
if c.Region != "" {
region = c.Region
} else if region == "" && edge != "" {
region = "us1"
}
for _, item := range []string{product, edge, region, suffix} {
if item != "" {
result = append(result, item)
}
}
u.Host = strings.Join(result, ".")
return u.String(), nil
}
func (c *RequestHandler) Post(path string, bodyData url.Values, headers map[string]interface{}) (*http.Response, error) {
return c.sendRequest(http.MethodPost, path, bodyData, headers)
}
func (c *RequestHandler) Get(path string, queryData url.Values, headers map[string]interface{}) (*http.Response, error) {
return c.sendRequest(http.MethodGet, path, queryData, headers)
}
func (c *RequestHandler) Delete(path string, nothing url.Values, headers map[string]interface{}) (*http.Response, error) {
return c.sendRequest(http.MethodDelete, path, nil, headers)
}