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

fix: wrap net.connect failed in node.js 8+ #129

Merged
merged 3 commits into from
Dec 21, 2017
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 10 additions & 3 deletions index.js
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ var shimmer = require('shimmer')

var v6plus = semver.gte(process.version, '6.0.0');
var v7plus = semver.gte(process.version, '7.0.0');
var v8plus = semver.gte(process.version, '8.0.0');

var net = require('net');

Expand Down Expand Up @@ -105,10 +106,16 @@ function patchOnRead(ctx) {

wrap(net.Socket.prototype, 'connect', function (original) {
return function () {
var args;
if (v8plus && Array.isArray(arguments[0])) {
Copy link
Collaborator

Choose a reason for hiding this comment

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

Here's the related code in Node 8:

https://github.com/nodejs/node/blob/0d8021e5a4cf0a6aa3a700a361f6d42c2894f2ba/lib/net.js#L943-L951

As you can see Node core uses an internal symbol referenced by normalizedArgsSymbol (which we don't have access to) as an extra guard in case someone actually by a error passes in an array as the first argument. First I thought we couldn't check for at as the normalizedArgsSymbol symbol isn't available to us, but I just realized that we could add a check for if there's a symbol or not - which might be better than nothing:

if (v8plus && Array.isArray(arguments[0]) && Object.getOwnPropertySymbols(arguments[0]).length > 0) {

We could also go all the way to to a string comparison, but I feel that's way too dirty:

Object.getOwnPropertySymbols(arguments[0]).toString() === 'Symbol(normalizedArgs)'

I could also be fine with just merging the PR as is. But I just wanted to follow this train of thoughts 😅

@Qard what do you think?

Copy link
Collaborator

Choose a reason for hiding this comment

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

I think it might have Symbol.iterator on it, so just checking for presence of any symbols probably won't be helpful. We can probably just drop that check and just go by if it's an array.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

so, just keep it the same as this is acceptable?

if(v8plus && Array.isArray(arguments[0])) {

Copy link
Collaborator

@watson watson Dec 21, 2017

Choose a reason for hiding this comment

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

A normal array will not have a Symbol, so this should still guard against that case. So I think I'll merge this PR in as is and then add a comment about the Symbol gotcha next to the if-sentence. Thanks for the patience 😄

// already normalized
args = arguments[0];
} else {
// From Node.js v7.0.0, net._normalizeConnectArgs have been renamed net._normalizeArgs
var args = v7plus
? net._normalizeArgs(arguments)
: net._normalizeConnectArgs(arguments);
args = v7plus
? net._normalizeArgs(arguments)
: net._normalizeConnectArgs(arguments);
}
if (args[1]) args[1] = wrapCallback(args[1]);
var result = original.apply(this, args);
patchOnRead(this);
Expand Down
2 changes: 1 addition & 1 deletion test/http-request.tap.js
Original file line number Diff line number Diff line change
Expand Up @@ -157,7 +157,7 @@ test('http.Agent socket reuse works', function(t){
})
];

if (nodeVersion[0] > 4 && nodeVersion[0] < 8) {
if (nodeVersion[0] > 4) {
firstImmediateChildren.push(make('ping #0 request'));
};

Expand Down