http: Support write(data, 'hex')

We were assuming that any string can be concatenated safely to
CRLF.  However, for hex, base64, or binary encoded writes, this
is not the case, and results in sending the incorrect response.

An unusual edge case, but certainly a bug.
This commit is contained in:
isaacs 2013-04-08 08:46:51 -07:00
parent 037bcac7ba
commit e4b716efaa
2 changed files with 10 additions and 5 deletions

View File

@ -772,15 +772,18 @@ OutgoingMessage.prototype.write = function(chunk, encoding) {
var len, ret; var len, ret;
if (this.chunkedEncoding) { if (this.chunkedEncoding) {
if (typeof(chunk) === 'string') { if (typeof(chunk) === 'string' &&
encoding !== 'hex' &&
encoding !== 'base64' &&
encoding !== 'binary') {
len = Buffer.byteLength(chunk, encoding); len = Buffer.byteLength(chunk, encoding);
chunk = len.toString(16) + CRLF + chunk + CRLF; chunk = len.toString(16) + CRLF + chunk + CRLF;
ret = this._send(chunk, encoding); ret = this._send(chunk, encoding);
} else { } else {
// buffer // buffer, or a non-toString-friendly encoding
len = chunk.length; len = chunk.length;
this._send(len.toString(16) + CRLF); this._send(len.toString(16) + CRLF);
this._send(chunk); this._send(chunk, encoding);
ret = this._send(CRLF); ret = this._send(CRLF);
} }
} else { } else {

View File

@ -35,10 +35,12 @@ var httpServer = http.createServer(function(req, res) {
}); });
res.writeHead(200, { 'Content-Type': 'text/plain' }); res.writeHead(200, { 'Content-Type': 'text/plain' });
// Write 1mb to cause some requests to buffer // Write 1.5mb to cause some requests to buffer
var chunk = new Array(1024).join('A'); // Also, mix up the encodings a bit.
var chunk = new Array(1024 + 1).join('7');
for (var i = 0; i < 1024; i++) { for (var i = 0; i < 1024; i++) {
res.write(chunk); res.write(chunk);
res.write(chunk, 'hex');
} }
// Get .bytesWritten while buffer is not empty // Get .bytesWritten while buffer is not empty
assert(res.connection.bytesWritten > 0); assert(res.connection.bytesWritten > 0);