-
Notifications
You must be signed in to change notification settings - Fork 29.8k
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
lib/querystring: convert to using internal/errors #15565
Conversation
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.
This needs a test and the error type should not change.
lib/querystring.js
Outdated
@@ -178,7 +179,7 @@ function qsEscape(str) { | |||
if (i < str.length) | |||
c2 = str.charCodeAt(i) & 0x3FF; | |||
else | |||
throw new URIError('URI malformed'); | |||
throw new errors.TypeError('ERR_QUERYSTRING_URI_INVALID', 'URI malformed'); |
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.
The error type URIError
should stay as it is. If that type does not yet exist in the internal/errors
it has to be created.
Out of my perspective a better name for the internal type would also be ERR_INVALID_URI
(I am still thinking about if it would be a good idea to combine this with the existing ERR_INVALID_URL
type or not) and the error message itself should be moved in the internal errors as static value.
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.
As a temporary workaround this could be done with:
else {
const e = new URIError('URI malformed');
e.code = 'ERR_INVALID_URI';
throw e;
}
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.
Since this is the only place in /lib/
where URIError
is used, I'm not sure it should not be changed...
/cc @jasnell
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.
This recommendation is bad out of my perspective. It is not similar to the internal/errors
by just adding the error code. It is neither a NodeError
, nor would it receive any further changes in case something changes in the internal/errors
.
I would also like to keep the error type as URIError
even if it is the only occurrence in lib. It is a single line that has to be added to the internal/errors
to add that type and use it from then on.
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.
@ramimoshe Thanks a lot for your PR! This goes in the right direction and just needs a bit more work 😃 |
thanks, |
lib/internal/errors.js
Outdated
@@ -261,7 +261,7 @@ E('ERR_NO_LONGER_SUPPORTED', '%s is no longer supported'); | |||
E('ERR_OUT_OF_RANGE', 'The "%s" argument is out of range'); | |||
E('ERR_OUTOFMEMORY', 'Out of memory'); | |||
E('ERR_PARSE_HISTORY_DATA', 'Could not parse history data in %s'); | |||
E('ERR_QUERYSTRING_URI_INVALID', '%s'); | |||
E('ERR_INVALID_URL', 'URI malformed'); |
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.
So we have a new lint rule that makes sure the error code are sorted in ASCIIbetical order.
It would have made you notice https://github.com/nodejs/node/blob/4518d94e6104323b06781ba608e59208d35a6129/lib/internal/errors.js#L243
So IMHO make this ERR_INVALID_URI
(so that we can keep the message text the same), and move it to L243 above the previous ERR_INVALID_URL
Thanks for following up. common.expectsError(
() => qs.stringify({ foo: '\udc00' }),
{
code: 'ERR_INVALID_URI',
type: TypeError,
message: 'URI malformed'
}
); or just as the validator for common.expectsError({
code: 'ERR_INVALID_URI',
type: TypeError,
message: 'URI malformed'
});
👍 |
if (i < str.length) | ||
c2 = str.charCodeAt(i) & 0x3FF; | ||
else | ||
throw new URIError('URI malformed'); |
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'm not sure if this should to be changed to use internal/errors. URIError
seems fine to me.
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 would definitely recommend to change this to use internal/errors
but it should be kept as URIError as I mentioned above (#15565 (comment)).
@refack // invalid surrogate pair throws URIError
assert.throws(function() {
qs.stringify({ foo: '\udc00' });
}, /^URIError: URI malformed$/); StackTrace from the test (after changing):
|
@ramimoshe you can not update the The error type should definitely not be changed because it would be inconsistent in that case what error we might return. Please switch back to the |
Ping @ramimoshe |
This is how you can add the URIError to the module.exports = exports = {
message,
Error: makeNodeError(Error),
TypeError: makeNodeError(TypeError),
RangeError: makeNodeError(RangeError),
URIError: makeNodeError(URIError), // <----
AssertionError,
E // This is exported only to facilitate testing.
}; And this is how you would use it in a different file. const errors = require('internal/errors');
// ...
throw new errors.URIError('ERR_INVALID_URI'); |
I think I have brought this up in a URL PR before but couldn't find the link. The ECMAScript spec says (Going to board so no time to dig the link to spec) |
I couldn't find a reference in the ECMAScript spec (image because the spec takes a while to load) The Web IDL spec only excludes |
@ramimoshe, sorry for the delay.
Use node/test/parallel/test-zlib-not-string-or-buffer.js Lines 10 to 18 in b050c14
|
@refack IMO
means it excludes user land methods from throwing a Anyway, I am still fine with throwing |
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.
This would need to update test/parallel/test-querystring.js
tests in order to pass the tests...
Also, |
@joyeecheung do you know the issue with ubuntu1404-64 build? |
@ramimoshe Nope, looks like a flake because the failing test should not go through the query string module. |
@joyeecheung do i have to do something or just wait to approving? |
@ramimoshe This is semver-major so needs at least 2 TSC approvals... @nodejs/tsc |
CI before landing: https://ci.nodejs.org/job/node-test-pull-request/11040/ |
https://ci.nodejs.org/job/node-test-linter/13033/console
@ramimoshe Do you have time to document this error code? If not I can do that, just don't want to delay this PR for too long. |
@joyeecheung - yes, i will fix it |
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.
LGTM if CI is green: https://ci.nodejs.org/job/node-test-pull-request/11053/
PR-URL: nodejs#15565 Reviewed-By: Refael Ackermann <[email protected]> Reviewed-By: James M Snell <[email protected]> Reviewed-By: Joyee Cheung <[email protected]> Reviewed-By: Gireesh Punathil <[email protected]>
@ramimoshe Thanks! |
PR-URL: nodejs/node#15565 Reviewed-By: Refael Ackermann <[email protected]> Reviewed-By: James M Snell <[email protected]> Reviewed-By: Joyee Cheung <[email protected]> Reviewed-By: Gireesh Punathil <[email protected]>
PR-URL: nodejs/node#15565 Reviewed-By: Refael Ackermann <[email protected]> Reviewed-By: James M Snell <[email protected]> Reviewed-By: Joyee Cheung <[email protected]> Reviewed-By: Gireesh Punathil <[email protected]>
PR-URL: nodejs/node#15565 Reviewed-By: Refael Ackermann <[email protected]> Reviewed-By: James M Snell <[email protected]> Reviewed-By: Joyee Cheung <[email protected]> Reviewed-By: Gireesh Punathil <[email protected]>
covert lib/querystring.js over to using lib/internal/errors.js
ref: #11273