fix review
This commit is contained in:
parent
bf7e5cdb93
commit
8765026f7e
@ -742,10 +742,10 @@ func (t *MGClientTest) Test_SuccessHandleError() {
|
|||||||
|
|
||||||
t.Assert().Equal(http.StatusInternalServerError, statusCode)
|
t.Assert().Equal(http.StatusInternalServerError, statusCode)
|
||||||
t.Assert().IsType(new(httpClientError), err)
|
t.Assert().IsType(new(httpClientError), err)
|
||||||
t.Assert().Equal("Internal server error", err.Error())
|
t.Assert().Equal(internalServerError, err.Error())
|
||||||
var serverErr *httpClientError
|
var serverErr *httpClientError
|
||||||
if errors.As(err, &serverErr) {
|
if errors.As(err, &serverErr) {
|
||||||
t.Assert().NotNil(serverErr.ResponseBody)
|
t.Assert().NotNil(serverErr.LimitedResponse)
|
||||||
} else {
|
} else {
|
||||||
t.Fail("Unexpected type of error")
|
t.Fail("Unexpected type of error")
|
||||||
}
|
}
|
||||||
|
19
v1/errors.go
19
v1/errors.go
@ -1,6 +1,7 @@
|
|||||||
package v1
|
package v1
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"bytes"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
@ -8,19 +9,23 @@ import (
|
|||||||
"net/http"
|
"net/http"
|
||||||
)
|
)
|
||||||
|
|
||||||
var defaultErrorMessage = "Internal http client error"
|
var defaultErrorMessage = "internal http client error"
|
||||||
var internalServerError = "Internal server error"
|
var internalServerError = "internal server error"
|
||||||
|
|
||||||
type httpClientError struct {
|
type httpClientError struct {
|
||||||
ErrorMsg string
|
ErrorMsg string
|
||||||
BaseError error
|
BaseError error
|
||||||
ResponseBody io.ReadCloser
|
LimitedResponse io.Reader
|
||||||
}
|
}
|
||||||
|
|
||||||
func (err *httpClientError) Unwrap() error {
|
func (err *httpClientError) Unwrap() error {
|
||||||
return err.BaseError
|
return err.BaseError
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (err *httpClientError) Is(target error) bool {
|
||||||
|
return errors.As(target, &err)
|
||||||
|
}
|
||||||
|
|
||||||
func (err *httpClientError) Error() string {
|
func (err *httpClientError) Error() string {
|
||||||
message := defaultErrorMessage
|
message := defaultErrorMessage
|
||||||
|
|
||||||
@ -59,7 +64,7 @@ func NewAPIClientError(responseBody []byte) error {
|
|||||||
|
|
||||||
func NewServerError(response *http.Response) error {
|
func NewServerError(response *http.Response) error {
|
||||||
var data []byte
|
var data []byte
|
||||||
body, err := buildRawResponse(response)
|
body, err := buildLimitedRawResponse(response)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
data = body
|
data = body
|
||||||
}
|
}
|
||||||
@ -68,7 +73,7 @@ func NewServerError(response *http.Response) error {
|
|||||||
var serverError *httpClientError
|
var serverError *httpClientError
|
||||||
|
|
||||||
if errors.As(err, &serverError) {
|
if errors.As(err, &serverError) {
|
||||||
serverError.ResponseBody = response.Body
|
serverError.LimitedResponse = bytes.NewBuffer(body)
|
||||||
return serverError
|
return serverError
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -47,7 +47,7 @@ func TestNewServerError(t *testing.T) {
|
|||||||
|
|
||||||
var err *httpClientError
|
var err *httpClientError
|
||||||
if errors.As(serverErr, &err) {
|
if errors.As(serverErr, &err) {
|
||||||
assert.NotNil(t, err.ResponseBody)
|
assert.NotNil(t, err.LimitedResponse)
|
||||||
} else {
|
} else {
|
||||||
t.Fatal("Unexpected type of error")
|
t.Fatal("Unexpected type of error")
|
||||||
}
|
}
|
||||||
|
@ -5,13 +5,18 @@ import (
|
|||||||
"net/http"
|
"net/http"
|
||||||
)
|
)
|
||||||
|
|
||||||
func buildRawResponse(resp *http.Response) ([]byte, error) {
|
const MB = 1 << 20
|
||||||
|
const MaxSizeBody = MB * 0.5
|
||||||
|
|
||||||
|
func buildLimitedRawResponse(resp *http.Response) ([]byte, error) {
|
||||||
defer resp.Body.Close()
|
defer resp.Body.Close()
|
||||||
|
|
||||||
res, err := io.ReadAll(resp.Body)
|
limitReader := io.LimitReader(resp.Body, MaxSizeBody)
|
||||||
|
body, err := io.ReadAll(limitReader)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return res, err
|
return body, err
|
||||||
}
|
}
|
||||||
|
|
||||||
return res, nil
|
return body, nil
|
||||||
}
|
}
|
||||||
|
@ -78,7 +78,7 @@ func makeRequest(reqType, url string, buf io.Reader, c *MgClient) ([]byte, int,
|
|||||||
return res, resp.StatusCode, err
|
return res, resp.StatusCode, err
|
||||||
}
|
}
|
||||||
|
|
||||||
res, err = buildRawResponse(resp)
|
res, err = buildLimitedRawResponse(resp)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return res, 0, err
|
return res, 0, err
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user