Skip to content

Commit f874c63

Browse files
committed
CRE-1319
1 parent bd03513 commit f874c63

File tree

2 files changed

+44
-1
lines changed

2 files changed

+44
-1
lines changed

pkg/http/http.go

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,18 @@ import (
1010
"github.com/smartcontractkit/chainlink-common/pkg/logger"
1111
)
1212

13+
type noOpResponseWriter struct{}
14+
15+
func (w *noOpResponseWriter) Header() http.Header {
16+
return http.Header{}
17+
}
18+
19+
func (w *noOpResponseWriter) Write(b []byte) (int, error) {
20+
return len(b), nil
21+
}
22+
23+
func (w *noOpResponseWriter) WriteHeader(statusCode int) {}
24+
1325
type clientConfig interface {
1426
URL() url.URL // DatabaseURL
1527
}
@@ -72,7 +84,10 @@ func (h *Request) SendRequestReader() (responseBody io.ReadCloser, statusCode in
7284
elapsed := time.Since(start)
7385
logger.Sugared(h.Logger).Tracew(fmt.Sprintf("http adapter got %v in %s", statusCode, elapsed), "statusCode", statusCode, "timeElapsedSeconds", elapsed)
7486

75-
source := http.MaxBytesReader(nil, r.Body, h.Config.SizeLimit)
87+
var source io.ReadCloser = r.Body
88+
if h.Config.SizeLimit > 0 {
89+
source = http.MaxBytesReader(&noOpResponseWriter{}, r.Body, h.Config.SizeLimit)
90+
}
7691

7792
return source, statusCode, r.Header, nil
7893
}

pkg/http/http_test.go

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,3 +55,31 @@ func (t *mockTransport) RoundTrip(req *netHttp.Request) (*netHttp.Response, erro
5555
response.Body = io.NopCloser(strings.NewReader(responseBody))
5656
return response, nil
5757
}
58+
59+
func TestSendRequestReader_WithSizeLimit(t *testing.T) {
60+
t.Parallel()
61+
62+
client := NewUnrestrictedClient()
63+
client.Transport = newMockTransport()
64+
65+
netReq, err := netHttp.NewRequestWithContext(t.Context(), "GET", "http://localhost", bytes.NewReader([]byte{}))
66+
assert.NoError(t, err)
67+
68+
req := &Request{
69+
Client: client,
70+
Request: netReq,
71+
Config: RequestConfig{SizeLimit: 100},
72+
Logger: logger.Nop(),
73+
}
74+
75+
reader, statusCode, headers, err := req.SendRequestReader()
76+
assert.NoError(t, err)
77+
assert.Equal(t, 200, statusCode)
78+
assert.Equal(t, "application/json", headers.Get("Content-Type"))
79+
80+
// Verify reader works
81+
body, err := io.ReadAll(reader)
82+
assert.NoError(t, err)
83+
assert.Equal(t, `{"foo":123}`, string(body))
84+
assert.NoError(t, reader.Close())
85+
}

0 commit comments

Comments
 (0)