From 183b62b054f6eede37c71e9b7c454d6985baf089 Mon Sep 17 00:00:00 2001 From: Bert Belder Date: Thu, 12 Mar 2015 21:21:48 -0700 Subject: [PATCH] Revert "http: send Content-Length when possible" This reverts commit 4874182065655dcf8a39bfa3e4c9b47bfb9e0f75. --- lib/_http_outgoing.js | 35 ++------ test/parallel/test-http-automatic-headers.js | 6 +- .../test-http-client-default-headers-exist.js | 4 +- test/parallel/test-http-content-length.js | 89 ------------------- test/parallel/test-http-raw-headers.js | 6 +- .../test-http-remove-header-stays-removed.js | 1 - 6 files changed, 12 insertions(+), 129 deletions(-) delete mode 100644 test/parallel/test-http-content-length.js diff --git a/lib/_http_outgoing.js b/lib/_http_outgoing.js index f6144ba6a63910..2e64632a73fbf2 100644 --- a/lib/_http_outgoing.js +++ b/lib/_http_outgoing.js @@ -16,7 +16,6 @@ const closeExpression = /close/i; const contentLengthExpression = /^Content-Length$/i; const dateExpression = /^Date$/i; const expectExpression = /^Expect$/i; -const trailerExpression = /^Trailer$/i; const automaticHeaders = { connection: true, @@ -57,7 +56,6 @@ function OutgoingMessage() { this.sendDate = false; this._removedHeader = {}; - this._contentLength = null; this._hasBody = true; this._trailer = ''; @@ -187,7 +185,6 @@ OutgoingMessage.prototype._storeHeader = function(firstLine, headers) { sentTransferEncodingHeader: false, sentDateHeader: false, sentExpect: false, - sentTrailer: false, messageHeader: firstLine }; @@ -260,26 +257,16 @@ OutgoingMessage.prototype._storeHeader = function(firstLine, headers) { if (state.sentContentLengthHeader === false && state.sentTransferEncodingHeader === false) { - if (!this._hasBody) { - // Make sure we don't end the 0\r\n\r\n at the end of the message. - this.chunkedEncoding = false; - } else if (!this.useChunkedEncodingByDefault) { - this._last = true; - } else { - if (!state.sentTrailer && - !this._removedHeader['content-length'] && - typeof this._contentLength === 'number') { - state.messageHeader += 'Content-Length: ' + this._contentLength + - '\r\n'; - } else if (!this._removedHeader['transfer-encoding']) { + if (this._hasBody && !this._removedHeader['transfer-encoding']) { + if (this.useChunkedEncodingByDefault) { state.messageHeader += 'Transfer-Encoding: chunked\r\n'; this.chunkedEncoding = true; } else { - // We should only be able to get here if both Content-Length and - // Transfer-Encoding are removed by the user. - // See: test/parallel/test-http-remove-header-stays-removed.js - debug('Both Content-Length and Transfer-Encoding are removed'); + this._last = true; } + } else { + // Make sure we don't end the 0\r\n\r\n at the end of the message. + this.chunkedEncoding = false; } } @@ -317,8 +304,6 @@ function storeHeader(self, state, field, value) { state.sentDateHeader = true; } else if (expectExpression.test(field)) { state.sentExpect = true; - } else if (trailerExpression.test(field)) { - state.sentTrailer = true; } } @@ -524,14 +509,6 @@ OutgoingMessage.prototype.end = function(data, encoding, callback) { this.once('finish', callback); if (!this._header) { - if (data) { - if (typeof data === 'string') - this._contentLength = Buffer.byteLength(data, encoding); - else - this._contentLength = data.length; - } else { - this._contentLength = 0; - } this._implicitHeader(); } diff --git a/test/parallel/test-http-automatic-headers.js b/test/parallel/test-http-automatic-headers.js index 76e5a61318c75d..cc71cb7f35cd29 100644 --- a/test/parallel/test-http-automatic-headers.js +++ b/test/parallel/test-http-automatic-headers.js @@ -5,7 +5,7 @@ var http = require('http'); var server = http.createServer(function(req, res) { res.setHeader('X-Date', 'foo'); res.setHeader('X-Connection', 'bar'); - res.setHeader('X-Content-Length', 'baz'); + res.setHeader('X-Transfer-Encoding', 'baz'); res.end(); }); server.listen(common.PORT); @@ -20,10 +20,10 @@ server.on('listening', function() { assert.equal(res.statusCode, 200); assert.equal(res.headers['x-date'], 'foo'); assert.equal(res.headers['x-connection'], 'bar'); - assert.equal(res.headers['x-content-length'], 'baz'); + assert.equal(res.headers['x-transfer-encoding'], 'baz'); assert(res.headers['date']); assert.equal(res.headers['connection'], 'keep-alive'); - assert.equal(res.headers['content-length'], '0'); + assert.equal(res.headers['transfer-encoding'], 'chunked'); server.close(); agent.destroy(); }); diff --git a/test/parallel/test-http-client-default-headers-exist.js b/test/parallel/test-http-client-default-headers-exist.js index 02175384970de1..85ef2ac9f5758b 100644 --- a/test/parallel/test-http-client-default-headers-exist.js +++ b/test/parallel/test-http-client-default-headers-exist.js @@ -7,8 +7,8 @@ var expectedHeaders = { 'GET': ['host', 'connection'], 'HEAD': ['host', 'connection'], 'OPTIONS': ['host', 'connection'], - 'POST': ['host', 'connection', 'content-length'], - 'PUT': ['host', 'connection', 'content-length'] + 'POST': ['host', 'connection', 'transfer-encoding'], + 'PUT': ['host', 'connection', 'transfer-encoding'] }; var expectedMethods = Object.keys(expectedHeaders); diff --git a/test/parallel/test-http-content-length.js b/test/parallel/test-http-content-length.js deleted file mode 100644 index f986a2a53541c4..00000000000000 --- a/test/parallel/test-http-content-length.js +++ /dev/null @@ -1,89 +0,0 @@ -var common = require('../common'); -var assert = require('assert'); -var http = require('http'); - -var expectedHeadersMultipleWrites = { - 'connection': 'close', - 'transfer-encoding': 'chunked', -}; - -var expectedHeadersEndWithData = { - 'connection': 'close', - 'content-length': 'hello world'.length, -}; - -var expectedHeadersEndNoData = { - 'connection': 'close', - 'content-length': '0', -}; - -var receivedRequests = 0; -var totalRequests = 2; - -var server = http.createServer(function(req, res) { - res.removeHeader('Date'); - - switch (req.url.substr(1)) { - case 'multiple-writes': - assert.deepEqual(req.headers, expectedHeadersMultipleWrites); - res.write('hello'); - res.end('world'); - break; - case 'end-with-data': - assert.deepEqual(req.headers, expectedHeadersEndWithData); - res.end('hello world'); - break; - case 'empty': - assert.deepEqual(req.headers, expectedHeadersEndNoData); - res.end(); - break; - default: - throw new Error('Unreachable'); - break; - } - - receivedRequests++; - if (totalRequests === receivedRequests) server.close(); -}); - -server.listen(common.PORT, function() { - var req; - - req = http.request({ - port: common.PORT, - method: 'POST', - path: '/multiple-writes' - }); - req.removeHeader('Date'); - req.removeHeader('Host'); - req.write('hello '); - req.end('world'); - req.on('response', function(res) { - assert.deepEqual(res.headers, expectedHeadersMultipleWrites); - }); - - req = http.request({ - port: common.PORT, - method: 'POST', - path: '/end-with-data' - }); - req.removeHeader('Date'); - req.removeHeader('Host'); - req.end('hello world'); - req.on('response', function(res) { - assert.deepEqual(res.headers, expectedHeadersEndWithData); - }); - - req = http.request({ - port: common.PORT, - method: 'POST', - path: '/empty' - }); - req.removeHeader('Date'); - req.removeHeader('Host'); - req.end(); - req.on('response', function(res) { - assert.deepEqual(res.headers, expectedHeadersEndNoData); - }); - -}); diff --git a/test/parallel/test-http-raw-headers.js b/test/parallel/test-http-raw-headers.js index b4c1401872ae8a..76447c65abca14 100644 --- a/test/parallel/test-http-raw-headers.js +++ b/test/parallel/test-http-raw-headers.js @@ -44,7 +44,6 @@ http.createServer(function(req, res) { }); req.resume(); - res.setHeader('Trailer', 'x-foo'); res.addTrailers([ ['x-fOo', 'xOxOxOx'], ['x-foO', 'OxOxOxO'], @@ -73,8 +72,6 @@ http.createServer(function(req, res) { req.end('y b a r'); req.on('response', function(res) { var expectRawHeaders = [ - 'Trailer', - 'x-foo', 'Date', null, 'Connection', @@ -83,12 +80,11 @@ http.createServer(function(req, res) { 'chunked' ]; var expectHeaders = { - trailer: 'x-foo', date: null, connection: 'close', 'transfer-encoding': 'chunked' }; - res.rawHeaders[3] = null; + res.rawHeaders[1] = null; res.headers.date = null; assert.deepEqual(res.rawHeaders, expectRawHeaders); assert.deepEqual(res.headers, expectHeaders); diff --git a/test/parallel/test-http-remove-header-stays-removed.js b/test/parallel/test-http-remove-header-stays-removed.js index e963989385b336..a9a5f04fc17790 100644 --- a/test/parallel/test-http-remove-header-stays-removed.js +++ b/test/parallel/test-http-remove-header-stays-removed.js @@ -8,7 +8,6 @@ var server = http.createServer(function(request, response) { // to the output: response.removeHeader('connection'); response.removeHeader('transfer-encoding'); - response.removeHeader('content-length'); // make sure that removing and then setting still works: response.removeHeader('date');