-
Notifications
You must be signed in to change notification settings - Fork 30.2k
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_client, errors: migrate to use internal/errors #14423
Conversation
@starkwang thank you so much for helping with this! We recently updated the recommended way to test internal Errors — https://github.com/nodejs/node/pull/14207/files |
E('ERR_INVALID_FD', '"fd" must be a positive integer: %s'); | ||
E('ERR_INVALID_FILE_URL_HOST', | ||
'File URL host must be "localhost" or empty on %s'); | ||
E('ERR_INVALID_FILE_URL_PATH', 'File URL path %s'); | ||
E('ERR_INVALID_HANDLE_TYPE', 'This handle type cannot be sent'); | ||
E('ERR_INVALID_HTTP_TOKEN', (name) => `${name} must be a valid HTTP token`); |
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.
FYI you could just use %s
place holders, but IMHO this way is more readable.
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.
But: consistency 😉
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.
There is none anyway...
I'll open a PR to change them all.
Whoever lands this: I think the subsystem should be |
6031cca
to
4ad89b7
Compare
@refack I've added some tests for the new errors in |
semver-major so pinging @nodejs/ctc for some reviews |
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.
💯
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
@starkwang Sorry to be a bummer, but can you rebase this against |
c54858b
to
4c62748
Compare
@@ -597,6 +597,7 @@ Used when `Console` is instantiated without `stdout` stream or when `stdout` or | |||
Used when the native call from `process.cpuUsage` cannot be processed properly. | |||
|
|||
<a id="ERR_DNS_SET_SERVERS_FAILED"></a> | |||
### ERR_DNS_SET_SERVERS_FAILED |
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.
It seems that I missing some titles for errors.md
in #14212 . So I added the missing titles in this PR
doc/api/errors.md
Outdated
<a id="ERR_INVALID_IP_ADDRESS"></a> | ||
### ERR_INVALID_IP_ADDRESS |
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.
It seems that I missing some titles for errors.md
in #14212 . So I added the missing titles in this PR
@addaleax I've just rebased the branch : ) |
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.
From using-internal-errors.md:
If the error message is not a constant string then tests to validate the formatting of the message based on the parameters used when creating the error should be added to
test/parallel/test-internal-errors.js
. These tests should validate all of the different ways parameters can be used to generate the final message string.
And this section:
In addition, there should also be tests which validate the use of the error based on where it is used in the codebase. For these tests, except in special cases, they should only validate that the expected code is received and NOT validate the message.
I don't exactly care about this, just remember that this PR does not strictly comply with these guidelines.
Thanks for your efforts @starkwang! 😃
}, common.expectsError({ | ||
code: 'ERR_INVALID_ARG_TYPE', | ||
type: TypeError, | ||
message: /The "method" argument must be of type string/ |
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.
Unless I am missing something, it does not appear to be necessary to use a regular expression here, a string literal should work just fine. By the way, if you want to match an exact string using regular expressions, use start (^
) and end markers ($
). Otherwise, the match will succeed even if there is content before or after the expression:
const expr = /The "method" argument must be of type string/;
const str = 'The "method" argument must be of type string. Also, this sentence should not be here';
expr.test(str) === true
code: 'ERR_INVALID_ARG_TYPE', | ||
type: TypeError, | ||
message: new RegExp('The "options\\.hostname" property must be one of ' + | ||
'type string, undefined, or null') |
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.
Same here, why is this a regular expression?
code: 'ERR_INVALID_ARG_TYPE', | ||
type: TypeError, | ||
message: new RegExp('The "options\\.host" property must be one of ' + | ||
'type string, undefined, or null') |
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.
Same here.
58fd145
to
d4c91a7
Compare
doc/api/errors.md
Outdated
<a id="ERR_RENDER_HEADERS_FAILED"></a> | ||
### ERR_RENDER_HEADERS_FAILED | ||
|
||
Used when http headers has been sent before rendering the headers. |
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.
Grammar: have been sent
. Also, http
probably refers to the protocol instead of the module name, so I would prefer HTTP
over http
.
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.
Used when new HTTP headers are added to a response, after the headers part has already been sent.
doc/api/errors.md
Outdated
<a id="ERR_INVALID_HTTP_TOKEN"></a> | ||
### ERR_INVALID_HTTP_TOKEN | ||
|
||
Used when `options.method` received an invalid http token. |
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.
http
probably refers to the protocol instead of the module name, so I would prefer HTTP
over http
.
doc/api/errors.md
Outdated
<a id="ERR_INVALID_DOMAIN_NAME"></a> | ||
### ERR_INVALID_DOMAIN_NAME | ||
|
||
Used when `url.parse()` failed to parse the `host` or `hostname` that be passed to |
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.
Grammar: that be passed
. I would just say "... failed to parse the host
or hostname
option".
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.
Used when `hostname` can not be parsed from a provided URL.
doc/api/errors.md
Outdated
<a id="ERR_UNESCAPED_CHARACTERS"></a> | ||
### ERR_UNESCAPED_CHARACTERS | ||
|
||
Used when receive a string that contains unescaped characters. |
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.
Grammar: when receive
. Should probably be when receiving
.
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.
Used when a string that contains unescaped characters was received.
lib/_http_client.js
Outdated
@@ -303,7 +302,7 @@ ClientRequest.prototype._finish = function _finish() { | |||
|
|||
ClientRequest.prototype._implicitHeader = function _implicitHeader() { | |||
if (this._header) { | |||
throw new Error('Can\'t render headers after they are sent to the client'); | |||
throw new errors.Error('ERR_RENDER_HEADERS_FAILED'); |
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 don't have a strong opinion on this, I would prefer a more meaningful name for this error code. From the error code, the actual reason of the error is unclear, and the message implies that having the headers sent already is the only reason sending headers can fail, ever, and I am not too sure about that. Maybe something like ERR_HEADERS_SENT
? Doesn't sound perfect either... cc @refack
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.
ERR_HTTP_HEADERS_SENT
IMHO the documentation improvements should be non blockers, since simply migrating the |
This PR has http, internal errors, and is semver major. Seems like @jasnell should be all over it. Ping! :-D |
d4c91a7
to
db8fb2a
Compare
Pushed commit to address comments |
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.
💯
Landed in bdfbce9. |
This error code originally landed in a semver-major commit and is used by the ESM implementation. This backport includes the error message and the documentation for the error. I did attempt to write a test for this, but it did not seem possible to catch an exception during import, I was also unable to execute `node --experimental-modules` properly inside of a child_process. I'll dig more into getting a test together, but we should backport this fix in the mean time. Refs: nodejs#14423 Fixes: nodejs#15374
This error code originally landed in a semver-major commit and is used by the ESM implementation. This backport includes the error message and the documentation for the error. I did attempt to write a test for this, but it did not seem possible to catch an exception during import, I was also unable to execute `node --experimental-modules` properly inside of a child_process. I'll dig more into getting a test together, but we should backport this fix in the mean time. Refs: #14423 Fixes: #15374
This error code originally landed in a semver-major commit and is used by the ESM implementation. This backport includes the error message and the documentation for the error. I did attempt to write a test for this, but it did not seem possible to catch an exception during import, I was also unable to execute `node --experimental-modules` properly inside of a child_process. I'll dig more into getting a test together, but we should backport this fix in the mean time. Refs: #14423 Fixes: #15374 PR-URL: #15388 Reviewed-By: Bradley Farias <bradley.meck@gmail.com> Reviewed-By: James M Snell <jasnell@gmail.com>
Ref: #11273
Checklist
make -j4 test
(UNIX), orvcbuild test
(Windows) passesAffected core subsystem(s)
errors, http_client