From 28a800209c8525eab19f992374dacdaa51656a78 Mon Sep 17 00:00:00 2001 From: Ian Kronquist Date: Mon, 15 Dec 2014 18:14:33 -0800 Subject: [PATCH 1/2] http: introduce `getAllHeaders()` Users should not have to access private attributes like res._headers in order to get all the headers in a request. Define a method getAllHeaders to return an object which is a copy of res._headers Fixes: https://github.com/joyent/node/issues/3992 PR-URL: https://github.com/iojs/io.js/pull/170 Reviewed-By: Jeremiah Senkpiel Reviewed-By: Chris Dickinson --- doc/api/http.markdown | 9 +++++++++ lib/_http_outgoing.js | 8 ++++++++ test/parallel/test-http-header-get-all.js | 23 +++++++++++++++++++++++ 3 files changed, 40 insertions(+) create mode 100644 test/parallel/test-http-header-get-all.js diff --git a/doc/api/http.markdown b/doc/api/http.markdown index f5811e4a476628..c5f160c9b7accd 100644 --- a/doc/api/http.markdown +++ b/doc/api/http.markdown @@ -381,6 +381,15 @@ Example: var contentType = response.getHeader('content-type'); +### response.getAllHeaders() + +Reads out all headers that are already been queued but not yet sent to the +client. This can only be called before headers get implicitly flushed. + +Example: + + var headers = response.getAllHeaders(); + ### response.removeHeader(name) Removes a header that's queued for implicit sending. diff --git a/lib/_http_outgoing.js b/lib/_http_outgoing.js index 25157d34a44298..7c1c9503a6eb09 100644 --- a/lib/_http_outgoing.js +++ b/lib/_http_outgoing.js @@ -337,6 +337,14 @@ OutgoingMessage.prototype.getHeader = function(name) { }; +OutgoingMessage.prototype.getAllHeaders = function() { + if (!this._headers) + return; + else + return util._extend({}, this._headers); +}; + + OutgoingMessage.prototype.removeHeader = function(name) { if (arguments.length < 1) { throw new Error('`name` is required for removeHeader(name).'); diff --git a/test/parallel/test-http-header-get-all.js b/test/parallel/test-http-header-get-all.js new file mode 100644 index 00000000000000..b8f3de6055dffc --- /dev/null +++ b/test/parallel/test-http-header-get-all.js @@ -0,0 +1,23 @@ +var common = require('../common'); +var assert = require('assert'); +var http = require('http'); + +// Verify that ServerResponse.getHeader() works correctly even after +// the response header has been sent. Issue 752 on github. + +var rando = Math.random(); +var expected = util._extend({}, { + 'X-Random-Thing': rando, +}); +var server = http.createServer(function(req, res) { + res.setHeader('X-Random-Thing', rando); + headers = res.getAllHeaders(); + res.end('hello'); + assert.strictEqual(res.getAllHeaders(), null); +}); +server.listen(common.PORT, function() { + http.get({port: common.PORT}, function(resp) { + assert.deepEqual(response.headers, expected); + server.close(); + }); +}); From 7d76ff121a5fb447ef9e57e9d05fccca88c2fe31 Mon Sep 17 00:00:00 2001 From: Jeremiah Senkpiel Date: Mon, 9 Feb 2015 13:03:49 -0500 Subject: [PATCH 2/2] test: replace faulty test-http-header-get-all This replaces the faulty test with a modified version of test-http-header-read. --- test/parallel/test-http-header-get-all.js | 42 ++++++++++++++--------- 1 file changed, 25 insertions(+), 17 deletions(-) diff --git a/test/parallel/test-http-header-get-all.js b/test/parallel/test-http-header-get-all.js index b8f3de6055dffc..40305a3570f6ec 100644 --- a/test/parallel/test-http-header-get-all.js +++ b/test/parallel/test-http-header-get-all.js @@ -2,22 +2,30 @@ var common = require('../common'); var assert = require('assert'); var http = require('http'); -// Verify that ServerResponse.getHeader() works correctly even after -// the response header has been sent. Issue 752 on github. - -var rando = Math.random(); -var expected = util._extend({}, { - 'X-Random-Thing': rando, -}); -var server = http.createServer(function(req, res) { - res.setHeader('X-Random-Thing', rando); - headers = res.getAllHeaders(); - res.end('hello'); - assert.strictEqual(res.getAllHeaders(), null); +var s = http.createServer(function(req, res) { + var contentType = 'content-type'; + var plain = 'text/plain'; + res.setHeader(contentType, plain); + assert.ok(!res.headersSent); + res.writeHead(200); + assert.ok(res.headersSent); + res.end('hello world\n'); + // This checks that after the headers have been sent, getHeader works + // and does not throw an exception (joyent/node Issue 752) + assert.doesNotThrow( + function() { + assert.deepStrictEqual({ 'content-type': 'text/plain' }, res.getAllHeaders()); + } + ); }); -server.listen(common.PORT, function() { - http.get({port: common.PORT}, function(resp) { - assert.deepEqual(response.headers, expected); - server.close(); + +s.listen(common.PORT, runTest); + +function runTest() { + http.get({ port: common.PORT }, function(response) { + response.on('end', function() { + s.close(); + }); + response.resume(); }); -}); +}