Skip to content

Commit 6baae54

Browse files
authored
feat: Fix FD leak in request (#456)
* feat: Fix FD leak in request * feat: Add response.read() alternative * feat: I forget semicolons a lot
1 parent f116ecb commit 6baae54

File tree

1 file changed

+11
-1
lines changed

1 file changed

+11
-1
lines changed

src/utils/request.ts

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,13 +40,23 @@ export function get(url: URL, options?: Partial<RequestOptions>): Promise<Reques
4040
return sendRequest(url, requestOptions);
4141
}
4242

43+
// This utility function returns NO data, as per the types indicate
44+
// if a response body is needed, we can implement a listener
45+
// response.on('data', cb)
46+
// or call
47+
// response.read()
48+
// which can append data to a buffer and return it
4349
function sendRequest(url: URL, options: RequestOptions, buffer?: Buffer): Promise<RequestResult> {
4450
return new Promise((resolve) => {
4551
const requestMethod = url.protocol === "https:" ? https.request : http.request;
4652

4753
const request = requestMethod(options, (response) => {
4854
const statusCode = response.statusCode;
4955

56+
// https://nodejs.org/api/http.html#class-httpclientrequest
57+
// "Until the data is consumed, the 'end' event will not fire. Also, until the data is read it will consume memory that can eventually lead to a 'process out of memory' error"
58+
response.resume();
59+
5060
if (statusCode === undefined || statusCode < 200 || statusCode > 299) {
5161
return resolve({
5262
success: false,
@@ -61,7 +71,7 @@ function sendRequest(url: URL, options: RequestOptions, buffer?: Buffer): Promis
6171
});
6272
});
6373

64-
request.on("error", (error) => {
74+
request.once("error", (error) => {
6575
resolve({
6676
success: false,
6777
errorMessage: error.message,

0 commit comments

Comments
 (0)