@@ -34,7 +34,15 @@ exports.send = function (request, callback) {
34
34
return internals . fail ( request , err , callback ) ;
35
35
}
36
36
37
- return internals . transmit ( response , callback ) ;
37
+ return internals . transmit ( response , ( err ) => {
38
+
39
+ if ( err ) {
40
+ request . _setResponse ( err ) ;
41
+ return internals . fail ( request , err , callback ) ;
42
+ }
43
+
44
+ return callback ( ) ;
45
+ } ) ;
38
46
} ) ;
39
47
} ;
40
48
@@ -274,23 +282,19 @@ internals.transmit = function (response, callback) {
274
282
response . headers . etag = response . headers . etag . slice ( 0 , - 1 ) + '-' + ( response . headers [ 'content-encoding' ] || encoding ) + '"' ;
275
283
}
276
284
277
- // Write headers
278
-
279
- const headers = Object . keys ( response . headers ) ;
280
- for ( let i = 0 ; i < headers . length ; ++ i ) {
281
- const header = headers [ i ] ;
282
- const value = response . headers [ header ] ;
283
- if ( value !== undefined ) {
284
- request . raw . res . setHeader ( header , value ) ;
285
- }
286
- }
285
+ // Connection: close
287
286
288
287
const isInjection = Shot . isInjection ( request . raw . req ) ;
289
288
if ( ! isInjection && ! request . connection . _started ) {
290
- request . raw . res . setHeader ( 'connection' , 'close' ) ;
289
+ response . _header ( 'connection' , 'close' ) ;
291
290
}
292
291
293
- request . raw . res . writeHead ( response . statusCode ) ;
292
+ // Write headers
293
+
294
+ const res = internals . writeHead ( response ) ;
295
+ if ( res ) {
296
+ return process . nextTick ( callback , res ) ;
297
+ }
294
298
295
299
// Write payload
296
300
@@ -369,6 +373,34 @@ internals.transmit = function (response, callback) {
369
373
} ;
370
374
371
375
376
+ internals . writeHead = function ( response ) {
377
+
378
+ const res = response . request . raw . res ;
379
+
380
+ try {
381
+ const headers = Object . keys ( response . headers ) ;
382
+ for ( let i = 0 ; i < headers . length ; ++ i ) {
383
+ const header = headers [ i ] ;
384
+ const value = response . headers [ header ] ;
385
+ if ( value !== undefined ) {
386
+ res . setHeader ( header , value ) ;
387
+ }
388
+ }
389
+
390
+ res . writeHead ( response . statusCode ) ;
391
+ }
392
+ catch ( err ) {
393
+
394
+ // Reset headers and return err
395
+
396
+ res . _headers = null ;
397
+ res . _headerNames = { } ;
398
+
399
+ return Boom . wrap ( err ) ;
400
+ }
401
+ } ;
402
+
403
+
372
404
internals . Empty = function ( ) {
373
405
374
406
Stream . Readable . call ( this ) ;
0 commit comments