@@ -495,7 +495,9 @@ OutgoingMessage.prototype._send = function(data, encoding) {
495495 // the same packet. Future versions of Node are going to take care of
496496 // this at a lower level and in a more general way.
497497 if ( ! this . _headerSent ) {
498- if ( typeof data === 'string' ) {
498+ if ( typeof data === 'string' &&
499+ encoding !== 'hex' &&
500+ encoding !== 'base64' ) {
499501 data = this . _header + data ;
500502 } else {
501503 this . output . unshift ( this . _header ) ;
@@ -542,25 +544,6 @@ OutgoingMessage.prototype._writeRaw = function(data, encoding) {
542544
543545
544546OutgoingMessage . prototype . _buffer = function ( data , encoding ) {
545- if ( data . length === 0 ) return ;
546-
547- var length = this . output . length ;
548-
549- if ( length === 0 || typeof data != 'string' ) {
550- this . output . push ( data ) ;
551- this . outputEncodings . push ( encoding ) ;
552- return false ;
553- }
554-
555- var lastEncoding = this . outputEncodings [ length - 1 ] ;
556- var lastData = this . output [ length - 1 ] ;
557-
558- if ( ( encoding && lastEncoding === encoding ) ||
559- ( ! encoding && data . constructor === lastData . constructor ) ) {
560- this . output [ length - 1 ] = lastData + data ;
561- return false ;
562- }
563-
564547 this . output . push ( data ) ;
565548 this . outputEncodings . push ( encoding ) ;
566549
@@ -888,8 +871,12 @@ OutgoingMessage.prototype.write = function(chunk, encoding) {
888871 ret = this . _send ( buf , encoding ) ;
889872 } else {
890873 // Non-toString-friendly encoding.
891- len = chunk . length ;
892- this . _send ( len . toString ( 16 ) + CRLF ) ;
874+ if ( typeof chunk === 'string' )
875+ len = Buffer . byteLength ( chunk , encoding ) ;
876+ else
877+ len = chunk . length ;
878+
879+ this . _send ( len . toString ( 16 ) + CRLF , 'ascii' ) ;
893880 this . _send ( chunk , encoding ) ;
894881 ret = this . _send ( CRLF ) ;
895882 }
@@ -957,6 +944,10 @@ OutgoingMessage.prototype.end = function(data, encoding) {
957944 if ( hot && Buffer . isBuffer ( data ) && data . length > 120 * 1024 )
958945 hot = false ;
959946
947+ // Can't concatenate safely with hex or base64 encodings.
948+ if ( encoding === 'hex' || encoding === 'base64' )
949+ hot = false ;
950+
960951 if ( hot ) {
961952 // Hot path. They're doing
962953 // res.writeHead();
@@ -995,7 +986,7 @@ OutgoingMessage.prototype.end = function(data, encoding) {
995986
996987 if ( ! hot ) {
997988 if ( this . chunkedEncoding ) {
998- ret = this . _send ( '0\r\n' + this . _trailer + '\r\n' ) ; // Last chunk.
989+ ret = this . _send ( '0\r\n' + this . _trailer + '\r\n' , 'ascii' ) ;
999990 } else {
1000991 // Force a flush, HACK.
1001992 ret = this . _send ( '' ) ;
0 commit comments