Skip to content

Commit 20b8930

Browse files
authored
fix: large file content may fail (#1176)
* fix: large file content may fail * fix: in case of add empty
1 parent 161edcf commit 20b8930

File tree

3 files changed

+24
-5
lines changed

3 files changed

+24
-5
lines changed

kraken/lib/src/foundation/http_client_request.dart

+9-4
Original file line numberDiff line numberDiff line change
@@ -170,8 +170,10 @@ class ProxyHttpClientRequest extends HttpClientRequest {
170170

171171
request = await _createBackendClientRequest();
172172
// Send the real data to backend client.
173-
request.add(_data);
174-
_data.clear();
173+
if (_data.isNotEmpty) {
174+
await request.addStream(Stream.value(_data));
175+
_data.clear();
176+
}
175177

176178
// Step 4: Lifecycle of shouldInterceptRequest
177179
HttpClientResponse? response;
@@ -222,8 +224,11 @@ class ProxyHttpClientRequest extends HttpClientRequest {
222224

223225
} else {
224226
request = await _createBackendClientRequest();
225-
request.add(_data);
226-
_data.clear();
227+
// Not using request.add, because large data will cause core exception.
228+
if (_data.isNotEmpty) {
229+
await request.addStream(Stream.value(_data));
230+
_data.clear();
231+
}
227232
}
228233

229234
return _requestQueue.add(request.close);

kraken/test/local_http_server.dart

+1-1
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ class LocalHttpServer {
4343
data.addAll(chunk);
4444

4545
if (data.length >= 4) {
46-
var lastFour = data.sublist(chunk.length - 4, chunk.length);
46+
var lastFour = data.sublist(data.length - 4, data.length);
4747

4848
// Ends with \r\n\r\n or
4949
// @TODO: content-length.

kraken/test/src/foundation/http_client.dart

+14
Original file line numberDiff line numberDiff line change
@@ -80,5 +80,19 @@ void main() {
8080

8181
assert(request.headers.value('referer') != null);
8282
});
83+
84+
test('Large content', () async {
85+
var request = await httpClient.openUrl('POST',
86+
server.getUri('plain_text'));
87+
KrakenHttpOverrides.setContextHeader(request.headers, contextId);
88+
// Mocked 3M file.
89+
var data = List<int>.generate(3034764, (i) => i);
90+
request.headers.set(HttpHeaders.contentLengthHeader, data.length);
91+
await request.addStream(Stream.value(data));
92+
request.add([13, 10, 13, 10]); // End of file, double CRLF.
93+
await request.close();
94+
95+
// No error is ok.
96+
});
8397
});
8498
}

0 commit comments

Comments
 (0)