@@ -111,19 +111,40 @@ const pump = require('pump')
111
111
const toArray = require (' stream-to-array' )
112
112
113
113
const onResponse = async (req , res , stream ) => {
114
- if (! res .hasHeader (' content-length' )) {
114
+ const TRANSFER_ENCODING_HEADER_NAME = ' transfer-encoding'
115
+ const chunked = stream .headers [TRANSFER_ENCODING_HEADER_NAME ]
116
+ ? stream .headers [TRANSFER_ENCODING_HEADER_NAME ].endsWith (' chunked' )
117
+ : false
118
+
119
+ if (req .headers .connection === ' close' && chunked) {
115
120
try {
116
- const resBuffer = Buffer .concat (await toArray (stream))
117
- res .statusCode = stream .statusCode
118
- res .setHeader (' content-length' , ' ' + Buffer .byteLength (resBuffer))
119
- res .end (resBuffer)
121
+ // remove transfer-encoding header
122
+ const transferEncoding = stream .headers [TRANSFER_ENCODING_HEADER_NAME ].replace (/ (,( )? )? chunked/ , ' ' )
123
+ if (transferEncoding) {
124
+ res .setHeader (TRANSFER_ENCODING_HEADER_NAME , transferEncoding)
125
+ } else {
126
+ res .removeHeader (TRANSFER_ENCODING_HEADER_NAME )
127
+ }
128
+
129
+ if (! stream .headers [' content-length' ]) {
130
+ // pack all pieces into 1 buffer to calculate content length
131
+ const resBuffer = Buffer .concat (await toArray (stream))
132
+
133
+ // add content-length header and send the merged response buffer
134
+ res .setHeader (' content-length' , ' ' + Buffer .byteLength (resBuffer))
135
+ res .statusCode = stream .statusCode
136
+ res .end (resBuffer)
137
+
138
+ return
139
+ }
120
140
} catch (err) {
121
- res .send (err)
141
+ res .statusCode = 500
142
+ res .end (err .message )
122
143
}
123
- } else {
124
- res .statusCode = stream .statusCode
125
- pump (stream, res)
126
144
}
145
+
146
+ res .statusCode = stream .statusCode
147
+ pump (stream, res)
127
148
}
128
149
```
129
150
## The "* GET /services.json* " endpoint
0 commit comments