summaryrefslogtreecommitdiff
path: root/lib/http.js
diff options
context:
space:
mode:
Diffstat (limited to 'lib/http.js')
-rw-r--r--lib/http.js20
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);