fix read on close

This commit is contained in:
holooooo 2021-05-25 15:15:43 +08:00
parent 2182081831
commit f8df3d1bee
3 changed files with 15 additions and 20 deletions

View File

@ -247,7 +247,7 @@ func TestOption_WithRetry(t *testing.T) {
} }
retryAmount := 1 retryAmount := 1
retryDelay := 200 * time.Millisecond retryDelay := 800 * time.Millisecond
startTime := time.Now().UnixNano() / int64(time.Millisecond) startTime := time.Now().UnixNano() / int64(time.Millisecond)
_ = client.Get(nil, "", WithRetry(retryAmount, retryDelay)) _ = client.Get(nil, "", WithRetry(retryAmount, retryDelay))

View File

@ -80,7 +80,13 @@ func (c *Client) customReq(req *BeegoHTTPRequest, opts []BeegoHTTPRequestOption)
// handleResponse try to parse body to meaningful value // handleResponse try to parse body to meaningful value
func (c *Client) handleResponse(value interface{}, req *BeegoHTTPRequest) error { func (c *Client) handleResponse(value interface{}, req *BeegoHTTPRequest) error {
err := c.handleCarrier(value, req) // make sure req.resp is not nil
_, err := req.Bytes()
if err != nil {
return err
}
err = c.handleCarrier(value, req)
if err != nil { if err != nil {
return err return err
} }
@ -90,22 +96,17 @@ func (c *Client) handleResponse(value interface{}, req *BeegoHTTPRequest) error
// handleCarrier set http data to value // handleCarrier set http data to value
func (c *Client) handleCarrier(value interface{}, req *BeegoHTTPRequest) error { func (c *Client) handleCarrier(value interface{}, req *BeegoHTTPRequest) error {
resp, err := req.Response()
if err != nil {
return err
}
defer resp.Body.Close()
if value == nil { if value == nil {
return err return nil
} }
if carrier, ok := value.(HTTPResponseCarrier); ok { if carrier, ok := value.(HTTPResponseCarrier); ok {
b, err := req.Bytes() b, err := req.Bytes()
if err != nil { if err != nil {
return err return err
} }
resp.Body = ioutil.NopCloser(bytes.NewReader(b)) req.resp.Body = ioutil.NopCloser(bytes.NewReader(b))
carrier.SetHTTPResponse(resp) carrier.SetHTTPResponse(req.resp)
} }
if carrier, ok := value.(HTTPBodyCarrier); ok { if carrier, ok := value.(HTTPBodyCarrier); ok {
b, err := req.Bytes() b, err := req.Bytes()
@ -123,10 +124,10 @@ func (c *Client) handleCarrier(value interface{}, req *BeegoHTTPRequest) error {
carrier.SetBytes(b) carrier.SetBytes(b)
} }
if carrier, ok := value.(HTTPStatusCarrier); ok { if carrier, ok := value.(HTTPStatusCarrier); ok {
carrier.SetStatusCode(resp.StatusCode) carrier.SetStatusCode(req.resp.StatusCode)
} }
if carrier, ok := value.(HTTPHeadersCarrier); ok { if carrier, ok := value.(HTTPHeadersCarrier); ok {
carrier.SetHeader(resp.Header) carrier.SetHeader(req.resp.Header)
} }
return nil return nil
} }

View File

@ -662,13 +662,7 @@ func (b *BeegoHTTPRequest) ToValue(value interface{}) error {
return nil return nil
} }
resp, err := b.Response() contentType := strings.Split(b.resp.Header.Get(contentTypeKey), ";")[0]
if err != nil {
return err
}
defer resp.Body.Close()
contentType := strings.Split(resp.Header.Get(contentTypeKey), ";")[0]
// try to parse it as content type // try to parse it as content type
switch contentType { switch contentType {
case "application/json": case "application/json":