http: don't confuse automatic headers for others
authorChristian Tellnes <christian@tellnes.no>
Fri, 13 Feb 2015 02:20:06 +0000 (03:20 +0100)
committerBrendan Ashworth <brendan.ashworth@me.com>
Sat, 28 Feb 2015 05:47:39 +0000 (21:47 -0800)
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 <brendan.ashworth@me.com>
Reviewed-By: Jeremiah Senkpiel <fishrock123@rocketmail.com>
lib/_http_outgoing.js
test/parallel/test-http-automatic-headers.js [new file with mode: 0644]
test/parallel/test-tls-over-http-tunnel.js

index 25157d3..de977eb 100644 (file)
@@ -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 (file)
index 0000000..cc71cb7
--- /dev/null
@@ -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();
+  });
+});
index 224e90a..ff567dc 100644 (file)
@@ -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');