Просмотр исходного кода

fix(fetcher): ensure response body is closed even on client error

Frédéric Guillot 2 месяцев назад
Родитель
Сommit
5a8df8abf0

+ 1 - 1
internal/reader/fetcher/response_handler.go

@@ -125,7 +125,7 @@ func (r *ResponseHandler) IsRedirect() bool {
 }
 
 func (r *ResponseHandler) Close() {
-	if r.httpResponse != nil && r.httpResponse.Body != nil && r.clientErr == nil {
+	if r.httpResponse != nil && r.httpResponse.Body != nil {
 		r.httpResponse.Body.Close()
 	}
 }

+ 29 - 0
internal/reader/fetcher/response_handler_test.go

@@ -4,11 +4,26 @@
 package fetcher // import "miniflux.app/v2/internal/reader/fetcher"
 
 import (
+	"errors"
+	"io"
 	"net/http"
 	"testing"
 	"time"
 )
 
+type testReadCloser struct {
+	closed bool
+}
+
+func (rc *testReadCloser) Read(_ []byte) (int, error) {
+	return 0, io.EOF
+}
+
+func (rc *testReadCloser) Close() error {
+	rc.closed = true
+	return nil
+}
+
 func TestIsModified(t *testing.T) {
 	var cachedEtag = "abc123"
 	var cachedLastModified = "Wed, 21 Oct 2015 07:28:00 GMT"
@@ -174,3 +189,17 @@ func TestCacheControlMaxAgeInMinutes(t *testing.T) {
 		})
 	}
 }
+
+func TestResponseHandlerCloseClosesBodyOnClientError(t *testing.T) {
+	body := &testReadCloser{}
+	rh := ResponseHandler{
+		httpResponse: &http.Response{Body: body},
+		clientErr:    errors.New("boom"),
+	}
+
+	rh.Close()
+
+	if !body.closed {
+		t.Error("Expected response body to be closed")
+	}
+}