-type RequestError struct {
- StatusCode int
- Body []byte
-}
-
-func (pe RequestError) Error() string {
- return fmt.Sprintf("Request failed due to error response with status: %v and body: %v", pe.StatusCode, string(pe.Body))
-}
-
-func Post(url string, body []byte, contentType string, client HTTPClient) error {
- return do(http.MethodPost, url, body, contentType, client)
-}
-
-func do(method string, url string, body []byte, contentType string, client HTTPClient) error {
- if req, reqErr := http.NewRequest(method, url, bytes.NewBuffer(body)); reqErr == nil {
- req.Header.Set("Content-Type", contentType)
- if response, respErr := client.Do(req); respErr == nil {
- if isResponseSuccess(response.StatusCode) {
- return nil
- } else {
- return getRequestError(response)
- }
- } else {
- return respErr
- }
- } else {
- return reqErr
- }
-}
-
-func isResponseSuccess(statusCode int) bool {
- return statusCode >= http.StatusOK && statusCode <= 299
-}
-
-func getRequestError(response *http.Response) RequestError {
- defer response.Body.Close()
- responseData, _ := io.ReadAll(response.Body)
- putError := RequestError{
- StatusCode: response.StatusCode,
- Body: responseData,
- }
- return putError
-}
-