diff options
author | Joyee Cheung <joyeec9h3@gmail.com> | 2017-11-03 20:04:12 +0800 |
---|---|---|
committer | Joyee Cheung <joyeec9h3@gmail.com> | 2017-11-06 18:24:34 +0800 |
commit | 0a84e95cd9293bfcf1e746857921684f0732dd60 (patch) | |
tree | 719f4113cd1c7dad36b324ef075ed069fc2f8b45 /lib/_http_outgoing.js | |
parent | 11a9f36cae0d1e6e11c9f40ec82d9f887aa0a911 (diff) | |
download | android-node-v8-0a84e95cd9293bfcf1e746857921684f0732dd60.tar.gz android-node-v8-0a84e95cd9293bfcf1e746857921684f0732dd60.tar.bz2 android-node-v8-0a84e95cd9293bfcf1e746857921684f0732dd60.zip |
http: improve errors thrown in header validation
PR-URL: https://github.com/nodejs/node/pull/16719
Fixes: https://github.com/nodejs/node/issues/16714
Reviewed-By: Anatoli Papirovski <apapirovski@mac.com>
Reviewed-By: James M Snell <jasnell@gmail.com>
Diffstat (limited to 'lib/_http_outgoing.js')
-rw-r--r-- | lib/_http_outgoing.js | 38 |
1 files changed, 18 insertions, 20 deletions
diff --git a/lib/_http_outgoing.js b/lib/_http_outgoing.js index 76d83b1921..b4cfe61d86 100644 --- a/lib/_http_outgoing.js +++ b/lib/_http_outgoing.js @@ -437,16 +437,7 @@ function _storeHeader(firstLine, headers) { function storeHeader(self, state, key, value, validate) { if (validate) { - if (typeof key !== 'string' || !key || !checkIsHttpToken(key)) { - throw new errors.TypeError( - 'ERR_INVALID_HTTP_TOKEN', 'Header name', key); - } - if (value === undefined) { - throw new errors.TypeError('ERR_MISSING_ARGS', `header "${key}"`); - } else if (checkInvalidHeaderChar(value)) { - debug('Header "%s" contains invalid characters', key); - throw new errors.TypeError('ERR_INVALID_CHAR', 'header content', key); - } + validateHeader(key, value); } state.header += key + ': ' + escapeHeaderValue(value) + CRLF; matchHeader(self, state, key, value); @@ -494,20 +485,27 @@ function matchHeader(self, state, field, value) { } } -function validateHeader(msg, name, value) { - if (typeof name !== 'string' || !name || !checkIsHttpToken(name)) - throw new errors.TypeError('ERR_INVALID_HTTP_TOKEN', 'Header name', name); - if (value === undefined) - throw new errors.TypeError('ERR_MISSING_ARGS', 'value'); - if (msg._header) - throw new errors.Error('ERR_HTTP_HEADERS_SENT', 'set'); - if (checkInvalidHeaderChar(value)) { +function validateHeader(name, value) { + let err; + if (typeof name !== 'string' || !name || !checkIsHttpToken(name)) { + err = new errors.TypeError('ERR_INVALID_HTTP_TOKEN', 'Header name', name); + } else if (value === undefined) { + err = new errors.TypeError('ERR_HTTP_INVALID_HEADER_VALUE', value, name); + } else if (checkInvalidHeaderChar(value)) { debug('Header "%s" contains invalid characters', name); - throw new errors.TypeError('ERR_INVALID_CHAR', 'header content', name); + err = new errors.TypeError('ERR_INVALID_CHAR', 'header content', name); + } + if (err !== undefined) { + Error.captureStackTrace(err, validateHeader); + throw err; } } + OutgoingMessage.prototype.setHeader = function setHeader(name, value) { - validateHeader(this, name, value); + if (this._header) { + throw new errors.Error('ERR_HTTP_HEADERS_SENT', 'set'); + } + validateHeader(name, value); if (!this[outHeadersKey]) this[outHeadersKey] = {}; |