From 10962bc44117df4d3ffcd894ea670268f7e1aa6f Mon Sep 17 00:00:00 2001 From: himself65 Date: Sat, 21 Mar 2020 11:31:05 +0800 Subject: [PATCH] lib: refactor ServerResponse.prototype.writeHead --- lib/_http_server.js | 38 ++++++++++++---------- test/parallel/test-http-mutable-headers.js | 2 +- 2 files changed, 21 insertions(+), 19 deletions(-) diff --git a/lib/_http_server.js b/lib/_http_server.js index 3f9c98e8380363..793e0f80044631 100644 --- a/lib/_http_server.js +++ b/lib/_http_server.js @@ -237,8 +237,11 @@ ServerResponse.prototype._implicitHeader = function _implicitHeader() { this.writeHead(this.statusCode); }; -ServerResponse.prototype.writeHead = writeHead; -function writeHead(statusCode, reason, obj) { +ServerResponse.prototype.writeHead = function( + statusCode, + statusMessage, + headers +) { const originalStatusCode = statusCode; statusCode |= 0; @@ -246,39 +249,38 @@ function writeHead(statusCode, reason, obj) { throw new ERR_HTTP_INVALID_STATUS_CODE(originalStatusCode); } - - if (typeof reason === 'string') { - // writeHead(statusCode, reasonPhrase[, headers]) - this.statusMessage = reason; - } else { + if (headers === undefined && typeof statusMessage === 'object') { // writeHead(statusCode[, headers]) - if (!this.statusMessage) - this.statusMessage = STATUS_CODES[statusCode] || 'unknown'; - obj = reason; + headers = statusMessage; + } else if (typeof statusMessage === 'string') { + // writeHead(statusCode, reasonPhrase[, headers]) + this.statusMessage = statusMessage; } + if (this.statusMessage == null) + this.statusMessage = STATUS_CODES[statusCode] || 'unknown'; this.statusCode = statusCode; - let headers; + let _headers; if (this[kOutHeaders]) { // Slow-case: when progressive API and header fields are passed. let k; - if (obj) { - const keys = ObjectKeys(obj); + if (headers) { + const keys = ObjectKeys(headers); // Retain for(;;) loop for performance reasons // Refs: https://github.com/nodejs/node/pull/30958 for (let i = 0; i < keys.length; i++) { k = keys[i]; - if (k) this.setHeader(k, obj[k]); + if (k) this.setHeader(k, headers[k]); } } if (k === undefined && this._header) { throw new ERR_HTTP_HEADERS_SENT('render'); } // Only progressive api is used - headers = this[kOutHeaders]; + _headers = this[kOutHeaders]; } else { // Only writeHead() called - headers = obj; + _headers = headers; } if (checkInvalidHeaderChar(this.statusMessage)) @@ -307,10 +309,10 @@ function writeHead(statusCode, reason, obj) { this.shouldKeepAlive = false; } - this._storeHeader(statusLine, headers); + this._storeHeader(statusLine, _headers); return this; -} +}; // Docs-only deprecated: DEP0063 ServerResponse.prototype.writeHeader = ServerResponse.prototype.writeHead; diff --git a/test/parallel/test-http-mutable-headers.js b/test/parallel/test-http-mutable-headers.js index c9f63acf4433f4..af72ed25d7c2b9 100644 --- a/test/parallel/test-http-mutable-headers.js +++ b/test/parallel/test-http-mutable-headers.js @@ -150,7 +150,7 @@ const s = http.createServer(common.mustCall((req, res) => { case 'writeHead': res.statusCode = 404; res.setHeader('x-foo', 'keyboard cat'); - res.writeHead(200, { 'x-foo': 'bar', 'x-bar': 'baz' }); + res.writeHead(200, undefined, { 'x-foo': 'bar', 'x-bar': 'baz' }); break; default: