this.flushing = false;
this.headWritten = false;
+ this._hasBody = true;
+
this.finished = false;
}
sys.inherits(OutgoingMessage, events.EventEmitter);
}
if (sentContentLengthHeader == false && sentTransferEncodingHeader == false) {
- if (this.useChunkedEncodingByDefault) {
- messageHeader += "Transfer-Encoding: chunked\r\n";
- this.chunkedEncoding = true;
- }
- else {
- this.closeOnFinish = true;
+ if (this._hasBody) {
+ if (this.useChunkedEncodingByDefault) {
+ messageHeader += "Transfer-Encoding: chunked\r\n";
+ this.chunkedEncoding = true;
+ } else {
+ 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;
}
}
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";
if (this.chunkedEncoding) {
if (typeof chunk == 'string') {
var statusLine = "HTTP/1.1 " + statusCode.toString() + " "
+ 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.headWritten = true;
};
--- /dev/null
+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/')