diff options
Diffstat (limited to 'lib/http.js')
-rw-r--r-- | lib/http.js | 20 |
1 files changed, 18 insertions, 2 deletions
diff --git a/lib/http.js b/lib/http.js index 4a4fe94f3e..bcde516dae 100644 --- a/lib/http.js +++ b/lib/http.js @@ -782,12 +782,28 @@ OutgoingMessage.prototype.write = function(chunk, encoding) { if (chunk.length === 0) return false; + // TODO(bnoordhuis) Temporary optimization hack, remove in v0.11. We only + // want to convert the buffer when we're sending: + // + // a) Transfer-Encoding chunks, because it lets us pack the chunk header + // and the chunk into a single write(), or + // + // b) the first chunk of a fixed-length request, because it lets us pack + // the request headers and the chunk into a single write(). + // + // Converting to strings is expensive, CPU-wise, but reducing the number + // of write() calls more than makes up for that because we're dramatically + // reducing the number of TCP roundtrips. + if (chunk instanceof Buffer && (this.chunkedEncoding || !this._headerSent)) { + chunk = chunk.toString('binary'); + encoding = 'binary'; + } + var len, ret; if (this.chunkedEncoding) { if (typeof(chunk) === 'string' && encoding !== 'hex' && - encoding !== 'base64' && - encoding !== 'binary') { + encoding !== 'base64') { len = Buffer.byteLength(chunk, encoding); chunk = len.toString(16) + CRLF + chunk + CRLF; ret = this._send(chunk, encoding); |