1
0
mirror of synced 2024-11-25 14:36:03 +03:00
mg-transport-api-client-go/v1/request.go

116 lines
2.4 KiB
Go
Raw Normal View History

package v1
import (
"bytes"
"fmt"
2018-12-05 17:14:51 +03:00
"io"
"net/http"
2019-08-14 14:18:12 +03:00
"strings"
2024-02-12 14:31:57 +03:00
"time"
)
2024-02-12 14:31:57 +03:00
const MaxRPS = 100
2018-07-21 18:56:25 +03:00
var prefix = "/api/transport/v1"
// GetRequest performs GET request to the provided route.
func (c *MgClient) GetRequest(url string, parameters []byte) ([]byte, int, error) {
return makeRequest(
"GET",
fmt.Sprintf("%s%s%s", c.URL, prefix, url),
bytes.NewBuffer(parameters),
c,
)
}
// PostRequest performs POST request to the provided route.
2018-12-05 17:14:51 +03:00
func (c *MgClient) PostRequest(url string, parameters io.Reader) ([]byte, int, error) {
return makeRequest(
"POST",
fmt.Sprintf("%s%s%s", c.URL, prefix, url),
2018-12-05 17:14:51 +03:00
parameters,
c,
)
}
// PutRequest performs PUT request to the provided route.
func (c *MgClient) PutRequest(url string, parameters []byte) ([]byte, int, error) {
return makeRequest(
"PUT",
fmt.Sprintf("%s%s%s", c.URL, prefix, url),
bytes.NewBuffer(parameters),
c,
)
}
// DeleteRequest performs DELETE request to the provided route.
2018-05-21 17:56:42 +03:00
func (c *MgClient) DeleteRequest(url string, parameters []byte) ([]byte, int, error) {
return makeRequest(
"DELETE",
fmt.Sprintf("%s%s%s", c.URL, prefix, url),
2018-05-21 17:56:42 +03:00
bytes.NewBuffer(parameters),
c,
)
}
2018-12-05 17:14:51 +03:00
func makeRequest(reqType, url string, buf io.Reader, c *MgClient) ([]byte, int, error) {
var res []byte
req, err := http.NewRequest(reqType, url, buf)
if err != nil {
return res, 0, err
}
req.Header.Set("Content-Type", "application/json")
req.Header.Set("X-Transport-Token", c.Token)
2018-06-20 15:27:46 +03:00
if c.Debug {
if strings.Contains(url, "/files/upload") {
2021-11-22 16:16:01 +03:00
c.writeLog("MG TRANSPORT API Request: %s %s %s [file data]", reqType, url, c.Token)
2019-08-14 14:18:12 +03:00
} else {
2021-11-22 16:16:01 +03:00
c.writeLog("MG TRANSPORT API Request: %s %s %s %v", reqType, url, c.Token, buf)
2019-08-14 14:18:12 +03:00
}
2018-06-20 15:27:46 +03:00
}
2024-02-12 14:31:57 +03:00
c.mux.Lock()
defer c.mux.Unlock()
attempt := 0
tryAgain:
sleepTime := time.Second - time.Since(c.lastTime)
if sleepTime < 0 {
c.lastTime = time.Now()
c.rps = 0
} else if c.rps == MaxRPS {
time.Sleep(sleepTime)
c.lastTime = time.Now()
c.rps = 0
}
c.rps++
resp, err := c.httpClient.Do(req)
if err != nil {
2022-10-25 17:32:46 +03:00
return res, 0, NewCriticalHTTPError(err)
}
2024-02-12 14:31:57 +03:00
if resp.StatusCode == http.StatusTooManyRequests && attempt < 3 {
attempt++
goto tryAgain
}
2022-10-26 10:54:54 +03:00
if resp.StatusCode >= http.StatusInternalServerError {
err = NewServerError(resp)
return res, resp.StatusCode, err
}
2022-10-26 14:58:32 +03:00
res, err = buildLimitedRawResponse(resp)
if err != nil {
return res, 0, err
}
2018-06-20 15:27:46 +03:00
if c.Debug {
2021-11-22 16:16:01 +03:00
c.writeLog("MG TRANSPORT API Response: %s", res)
2018-06-20 15:27:46 +03:00
}
return res, resp.StatusCode, err
}