-
-
Notifications
You must be signed in to change notification settings - Fork 34.2k
http: DRY ClientRequest.prototype._deferToConnect #2769
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
Conversation
Logic for calling the passed in socket method and/or callback was duplicated.
lib/_http_client.js
Outdated
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Can you make this function callSocketMethod()
|
Comments have been addressed. Of course, any more are welcome. |
|
🍇 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
While you're here, self doesn't seem to be necessary. Mind removing it? It can be replaced with, as far as I can tell, a var socket = this.socket. The bottom reference to self can just be used as this.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I converted the code as you suggested (good catch btw), and that caused the error
cannot read property 'writable' of null
if (socket.writable) { // socket used to be self.socket
...This seems to stem from the initial _deferToConnect call, where this.socket is undefined. When the ClientRequest catches the 'socket' event, the socket variable in onSocket() refers to the initial undefined value which was scoped in. As a result, everything blows up when trying to read the writable property of that.
A work around that I found was to have onSocket() accept a sock argument (given by the socket event), and update socket with that parameter. So this piece of code works:
ClientRequest.prototype._deferToConnect = function(method, arguments_, cb) {
// ...
var socket = this.socket;
function callSocketMethod() {
if (method)
socket[method].apply(socket, arguments_);
if (typeof cb === 'function')
cb();
}
var onSocket = function(sock) { // Now accepts the socket from the 'socket' event.
socket = sock || socket; // Update socket reference.
if (socket.writable) {
callSocketMethod();
} else {
socket.once('connect', callSocketMethod);
}
};
if (!socket) {
this.once('socket', onSocket);
} else {
onSocket();
}
};However I'm not completely sure on the repercussions of this. Maybe leaving the existing implementation would be for the better? I'm interested in what you think
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Hmm, you're right, that is something I missed originally. I'd say let's keep the current implementation, as that new one wouldn't really improve the quality of the code. Sorry about the run around!
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Sounds good, then I'll leave this PR as it is. And no need to apologize, we got some documentation and a deeper understanding of the code here 😄
|
Seems like the build failed? Looks like only the |
|
https://ci.nodejs.org/job/node-test-pull-request/302/ those arm errors were fixed yesterday |
|
CI is happy, this LGTM. @cjihrig ? |
|
Yep, LGTM |
|
Bump |
Logic for calling the passed in socket method and/or callback was duplicated. This commit refactors the relevant code to remove the redundancy. PR-URL: #2769 Reviewed-By: Colin Ihrig <[email protected]> Reviewed-By: Brendan Ashworth <[email protected]>
|
Thanks! Landed in 79d2c4e after squashing. |
Logic for calling the passed in socket method and/or callback was duplicated. This commit refactors the relevant code to remove the redundancy. PR-URL: #2769 Reviewed-By: Colin Ihrig <[email protected]> Reviewed-By: Brendan Ashworth <[email protected]>
Came across some repetitive lines when reviewing code.
Logic for calling the passed in socket
methodand/orcbwas duplicated. Extracted these calls into a separate function,callSocketMethod, and invoked this new function in place of the replaced code.