Browse Source

Force no body on http 204 and 304

Thanks to tjholowayhuk@gmail.com for the test case.
v0.7.4-release
Ryan Dahl 15 years ago
parent
commit
3934cb5485
  1. 26
      lib/http.js
  2. 19
      test/simple/test-http-304.js

26
lib/http.js

@ -228,6 +228,8 @@ function OutgoingMessage (socket) {
this.flushing = false; this.flushing = false;
this.headWritten = false; this.headWritten = false;
this._hasBody = true;
this.finished = false; this.finished = false;
} }
sys.inherits(OutgoingMessage, events.EventEmitter); sys.inherits(OutgoingMessage, events.EventEmitter);
@ -309,13 +311,17 @@ OutgoingMessage.prototype.sendHeaderLines = function (firstLine, headers) {
} }
if (sentContentLengthHeader == false && sentTransferEncodingHeader == false) { if (sentContentLengthHeader == false && sentTransferEncodingHeader == false) {
if (this._hasBody) {
if (this.useChunkedEncodingByDefault) { if (this.useChunkedEncodingByDefault) {
messageHeader += "Transfer-Encoding: chunked\r\n"; messageHeader += "Transfer-Encoding: chunked\r\n";
this.chunkedEncoding = true; this.chunkedEncoding = true;
} } else {
else {
this.closeOnFinish = true; this.closeOnFinish = true;
} }
} else {
// Make sure we don't end the 0\r\n\r\n at the end of the message.
this.chunkedEncoding = false;
}
} }
messageHeader += CRLF; messageHeader += CRLF;
@ -337,6 +343,10 @@ OutgoingMessage.prototype.write = function (chunk, encoding) {
throw new Error("writeHead() must be called before write()") throw new Error("writeHead() must be called before write()")
} }
if (!this._hasBody) {
throw new Error("This type of response MUST NOT have a body.");
}
encoding = encoding || "ascii"; encoding = encoding || "ascii";
if (this.chunkedEncoding) { if (this.chunkedEncoding) {
if (typeof chunk == 'string') { if (typeof chunk == 'string') {
@ -415,6 +425,18 @@ ServerResponse.prototype.writeHead = function (statusCode) {
var statusLine = "HTTP/1.1 " + statusCode.toString() + " " var statusLine = "HTTP/1.1 " + statusCode.toString() + " "
+ reasonPhrase + CRLF; + reasonPhrase + CRLF;
if (statusCode === 204 || statusCode === 304) {
// RFC 2616, 10.2.5:
// The 204 response MUST NOT include a message-body, and thus is always
// terminated by the first empty line after the header fields.
// RFC 2616, 10.3.5:
// The 304 response MUST NOT contain a message-body, and thus is always
// terminated by the first empty line after the header fields.
this._hasBody = false;
}
this.sendHeaderLines(statusLine, headers); this.sendHeaderLines(statusLine, headers);
this.headWritten = true; this.headWritten = true;
}; };

19
test/simple/test-http-304.js

@ -0,0 +1,19 @@
require('../common');
var sys = require('sys'),
http = require('http'),
childProcess = require('child_process');
s = http.createServer(function (request, response) {
response.writeHead(304);
response.end();
})
s.listen(8000);
childProcess.exec('curl http://127.0.0.1:8000/', function (err, stdout, stderr) {
if (err) throw err;
s.close();
sys.puts('curled response correctly');
});
sys.puts('Server running at http://127.0.0.1:8000/')
Loading…
Cancel
Save