From 675cffb33e6d8b89672892b431c2ac4258f06593 Mon Sep 17 00:00:00 2001 From: Christian Tellnes Date: Fri, 13 Feb 2015 03:20:06 +0100 Subject: [PATCH] http: don't confuse automatic headers for others If you set a custom http header which includes eg. the string `Date`, then http will not automatically send the `Date` header. This is also true for other automatic http headers. PR-URL: https://github.com/iojs/io.js/pull/828 Reviewed-By: Brendan Ashworth Reviewed-By: Jeremiah Senkpiel --- lib/_http_outgoing.js | 10 +++---- test/parallel/test-http-automatic-headers.js | 30 ++++++++++++++++++++ test/parallel/test-tls-over-http-tunnel.js | 3 +- 3 files changed, 37 insertions(+), 6 deletions(-) create mode 100644 test/parallel/test-http-automatic-headers.js diff --git a/lib/_http_outgoing.js b/lib/_http_outgoing.js index 25157d34a44298..de977eb19c4cb5 100644 --- a/lib/_http_outgoing.js +++ b/lib/_http_outgoing.js @@ -10,12 +10,12 @@ const CRLF = common.CRLF; const chunkExpression = common.chunkExpression; const debug = common.debug; -const connectionExpression = /Connection/i; -const transferEncodingExpression = /Transfer-Encoding/i; +const connectionExpression = /^Connection$/i; +const transferEncodingExpression = /^Transfer-Encoding$/i; const closeExpression = /close/i; -const contentLengthExpression = /Content-Length/i; -const dateExpression = /Date/i; -const expectExpression = /Expect/i; +const contentLengthExpression = /^Content-Length$/i; +const dateExpression = /^Date$/i; +const expectExpression = /^Expect$/i; const automaticHeaders = { connection: true, diff --git a/test/parallel/test-http-automatic-headers.js b/test/parallel/test-http-automatic-headers.js new file mode 100644 index 00000000000000..cc71cb7f35cd29 --- /dev/null +++ b/test/parallel/test-http-automatic-headers.js @@ -0,0 +1,30 @@ +var common = require('../common'); +var assert = require('assert'); +var http = require('http'); + +var server = http.createServer(function(req, res) { + res.setHeader('X-Date', 'foo'); + res.setHeader('X-Connection', 'bar'); + res.setHeader('X-Transfer-Encoding', 'baz'); + res.end(); +}); +server.listen(common.PORT); + +server.on('listening', function() { + var agent = new http.Agent({ port: common.PORT, maxSockets: 1 }); + http.get({ + port: common.PORT, + path: '/hello', + agent: agent + }, function(res) { + assert.equal(res.statusCode, 200); + assert.equal(res.headers['x-date'], 'foo'); + assert.equal(res.headers['x-connection'], 'bar'); + assert.equal(res.headers['x-transfer-encoding'], 'baz'); + assert(res.headers['date']); + assert.equal(res.headers['connection'], 'keep-alive'); + assert.equal(res.headers['transfer-encoding'], 'chunked'); + server.close(); + agent.destroy(); + }); +}); diff --git a/test/parallel/test-tls-over-http-tunnel.js b/test/parallel/test-tls-over-http-tunnel.js index 224e90a861fe6f..ff567dc672308c 100644 --- a/test/parallel/test-tls-over-http-tunnel.js +++ b/test/parallel/test-tls-over-http-tunnel.js @@ -41,7 +41,8 @@ var proxy = net.createServer(function(clientSocket) { // Verify the CONNECT request assert.equal('CONNECT localhost:' + common.PORT + ' HTTP/1.1\r\n' + 'Proxy-Connections: keep-alive\r\n' + - 'Host: localhost:' + proxyPort + '\r\n\r\n', + 'Host: localhost:' + proxyPort + '\r\n' + + 'Connection: close\r\n\r\n', chunk); console.log('PROXY: got CONNECT request');