| 45 | var _ Client = (*RESTClient)(nil) |
| 46 | |
| 47 | func NewRESTClient(baseURL, accountTag, zoneTag, authToken, userAgent string, log *zerolog.Logger) (*RESTClient, error) { |
| 48 | baseURL = strings.TrimSuffix(baseURL, "/") |
| 49 | accountLevelEndpoint, err := url.Parse(fmt.Sprintf("%s/accounts/%s/cfd_tunnel", baseURL, accountTag)) |
| 50 | if err != nil { |
| 51 | return nil, errors.Wrap(err, "failed to create account level endpoint") |
| 52 | } |
| 53 | accountRoutesEndpoint, err := url.Parse(fmt.Sprintf("%s/accounts/%s/teamnet/routes", baseURL, accountTag)) |
| 54 | if err != nil { |
| 55 | return nil, errors.Wrap(err, "failed to create route account-level endpoint") |
| 56 | } |
| 57 | accountVnetsEndpoint, err := url.Parse(fmt.Sprintf("%s/accounts/%s/teamnet/virtual_networks", baseURL, accountTag)) |
| 58 | if err != nil { |
| 59 | return nil, errors.Wrap(err, "failed to create virtual network account-level endpoint") |
| 60 | } |
| 61 | zoneLevelEndpoint, err := url.Parse(fmt.Sprintf("%s/zones/%s/tunnels", baseURL, zoneTag)) |
| 62 | if err != nil { |
| 63 | return nil, errors.Wrap(err, "failed to create account level endpoint") |
| 64 | } |
| 65 | httpTransport := http.Transport{ |
| 66 | TLSHandshakeTimeout: defaultTimeout, |
| 67 | ResponseHeaderTimeout: defaultTimeout, |
| 68 | } |
| 69 | _ = http2.ConfigureTransport(&httpTransport) |
| 70 | return &RESTClient{ |
| 71 | baseEndpoints: &baseEndpoints{ |
| 72 | accountLevel: *accountLevelEndpoint, |
| 73 | zoneLevel: *zoneLevelEndpoint, |
| 74 | accountRoutes: *accountRoutesEndpoint, |
| 75 | accountVnets: *accountVnetsEndpoint, |
| 76 | }, |
| 77 | authToken: authToken, |
| 78 | userAgent: userAgent, |
| 79 | client: http.Client{ |
| 80 | Transport: &httpTransport, |
| 81 | Timeout: defaultTimeout, |
| 82 | }, |
| 83 | log: log, |
| 84 | }, nil |
| 85 | } |
| 86 | |
| 87 | func (r *RESTClient) sendRequest(method string, url url.URL, body interface{}) (*http.Response, error) { |
| 88 | var bodyReader io.Reader |