Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

http: merge chunks during chunked encoding #47630

Draft
wants to merge 4 commits into
base: main
Choose a base branch
from

Conversation

gjgmenendez
Copy link

@gjgmenendez gjgmenendez commented Apr 19, 2023

@nodejs-github-bot
Copy link
Collaborator

Review requested:

  • @nodejs/http
  • @nodejs/net

@nodejs-github-bot nodejs-github-bot added http Issues or PRs related to the http subsystem. needs-ci PRs that need a full CI run. labels Apr 19, 2023
@mscdex
Copy link
Contributor

mscdex commented Apr 20, 2023

What is the context for this?

@bnoordhuis
Copy link
Member

@tniessen tniessen changed the title Issue#57 http: merge chunks during chunked encoding Apr 20, 2023
@tniessen tniessen added the performance Issues and PRs related to the performance of Node.js. label Apr 20, 2023
Copy link
Member

@ronag ronag left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Needs a little more work. 🤗

@@ -866,6 +866,7 @@ function strictContentLength(msg) {
);
}

let chunkBuffer = Buffer.alloc(0);
Copy link
Member

@ronag ronag Apr 21, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Having this as a global variable will cause concurrent requests to interleave and become corrupt. The buffer needs to be scoped to the response object itself.

msg._send(crlf_buf, null, null);
msg._send(chunk, encoding, null, len);
ret = msg._send(crlf_buf, null, callback);
chunkBuffer = Buffer.concat([chunkBuffer, Buffer.from(chunk)]);
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Concatenating buffers is very slow. They require a memory allocation + memory copy. Just keep an Array of buffers.

Comment on lines +1047 to +1053
if (!this._headerSent && Buffer.byteLength(chunkBuffer)) {
this._send(NumberPrototypeToString(Buffer.byteLength(chunkBuffer), 16), 'latin1', null);
this._send(crlf_buf, null, null);
this._send(chunkBuffer, null, null);
this._send(crlf_buf, null, callback);
chunkBuffer = Buffer.alloc(0)
}
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This should be done in nextTick (i.e., connectionCorkNT) otherwise, there is no point to all of this... the number of buffered chunks would always be 1.

@@ -1062,7 +1068,6 @@ OutgoingMessage.prototype.end = function end(chunk, encoding, callback) {
this.socket.uncork();
}
this[kCorked] = 0;

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

unnecessary change

})
);

server.listen(3000, () => {});
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This doesn't test anything related to the problem we are trying to solve.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
http Issues or PRs related to the http subsystem. needs-ci PRs that need a full CI run. performance Issues and PRs related to the performance of Node.js.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

7 participants