mirror of
https://github.com/imgproxy/imgproxy.git
synced 2025-10-09 19:52:30 +02:00
Remove imagefetcher.bodyReader; Don't cancel request on error in FetchImage
This commit is contained in:
@@ -72,19 +72,12 @@ func (r *Request) Send() (*http.Response, error) {
|
|||||||
func (r *Request) FetchImage() (*http.Response, error) {
|
func (r *Request) FetchImage() (*http.Response, error) {
|
||||||
res, err := r.Send()
|
res, err := r.Send()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
r.cancel()
|
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// Closes the response body and cancels request context
|
|
||||||
cancel := func() {
|
|
||||||
res.Body.Close()
|
|
||||||
r.cancel()
|
|
||||||
}
|
|
||||||
|
|
||||||
// If the source image was not modified, close the body and NotModifiedError
|
// If the source image was not modified, close the body and NotModifiedError
|
||||||
if res.StatusCode == http.StatusNotModified {
|
if res.StatusCode == http.StatusNotModified {
|
||||||
cancel()
|
res.Body.Close()
|
||||||
return nil, newNotModifiedError(res.Header)
|
return nil, newNotModifiedError(res.Header)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -93,29 +86,22 @@ func (r *Request) FetchImage() (*http.Response, error) {
|
|||||||
if res.StatusCode == http.StatusPartialContent {
|
if res.StatusCode == http.StatusPartialContent {
|
||||||
err = checkPartialContentResponse(res)
|
err = checkPartialContentResponse(res)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
cancel()
|
res.Body.Close()
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
} else if res.StatusCode != http.StatusOK {
|
} else if res.StatusCode != http.StatusOK {
|
||||||
body := extractErraticBody(res)
|
body := extractErraticBody(res)
|
||||||
cancel()
|
res.Body.Close()
|
||||||
return nil, newImageResponseStatusError(res.StatusCode, body)
|
return nil, newImageResponseStatusError(res.StatusCode, body)
|
||||||
}
|
}
|
||||||
|
|
||||||
// If the response is gzip encoded, wrap it in a gzip reader
|
// If the response is gzip encoded, wrap it in a gzip reader
|
||||||
err = wrapGzipBody(res)
|
err = wrapGzipBody(res)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
cancel()
|
res.Body.Close()
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// Wrap the response body in a bodyReader to ensure the request context
|
|
||||||
// is cancelled when the body is closed
|
|
||||||
res.Body = &bodyReader{
|
|
||||||
body: res.Body,
|
|
||||||
request: r,
|
|
||||||
}
|
|
||||||
|
|
||||||
return res, nil
|
return res, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -188,24 +174,6 @@ func wrapGzipBody(res *http.Response) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// bodyReader is a wrapper around io.ReadCloser which closes original request context
|
|
||||||
// when the body is closed.
|
|
||||||
type bodyReader struct {
|
|
||||||
body io.ReadCloser // The body to read from
|
|
||||||
request *Request
|
|
||||||
}
|
|
||||||
|
|
||||||
// Read reads data from the response body into the provided byte slice
|
|
||||||
func (r *bodyReader) Read(p []byte) (int, error) {
|
|
||||||
return r.body.Read(p)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Close closes the response body and cancels the request context
|
|
||||||
func (r *bodyReader) Close() error {
|
|
||||||
defer r.request.cancel()
|
|
||||||
return r.body.Close()
|
|
||||||
}
|
|
||||||
|
|
||||||
// gzipReadCloser is a wrapper around gzip.Reader which also closes the original body
|
// gzipReadCloser is a wrapper around gzip.Reader which also closes the original body
|
||||||
type gzipReadCloser struct {
|
type gzipReadCloser struct {
|
||||||
*gzip.Reader
|
*gzip.Reader
|
||||||
|
Reference in New Issue
Block a user