33const Readable = require ( './readable' )
44const {
55 InvalidArgumentError,
6- RequestAbortedError,
7- ResponseStatusCodeError
6+ RequestAbortedError
87} = require ( '../core/errors' )
98const util = require ( '../core/util' )
9+ const { getResolveErrorBodyCallback } = require ( './util' )
1010const { AsyncResource } = require ( 'async_hooks' )
1111const { addSignal, removeSignal } = require ( './abort-signal' )
1212
@@ -16,13 +16,17 @@ class RequestHandler extends AsyncResource {
1616 throw new InvalidArgumentError ( 'invalid opts' )
1717 }
1818
19- const { signal, method, opaque, body, onInfo, responseHeaders, throwOnError } = opts
19+ const { signal, method, opaque, body, onInfo, responseHeaders, throwOnError, highWaterMark } = opts
2020
2121 try {
2222 if ( typeof callback !== 'function' ) {
2323 throw new InvalidArgumentError ( 'invalid callback' )
2424 }
2525
26+ if ( highWaterMark && ( typeof highWaterMark !== 'number' || highWaterMark < 0 ) ) {
27+ throw new InvalidArgumentError ( 'invalid highWaterMark' )
28+ }
29+
2630 if ( signal && typeof signal . on !== 'function' && typeof signal . addEventListener !== 'function' ) {
2731 throw new InvalidArgumentError ( 'signal must be an EventEmitter or EventTarget' )
2832 }
@@ -53,6 +57,7 @@ class RequestHandler extends AsyncResource {
5357 this . context = null
5458 this . onInfo = onInfo || null
5559 this . throwOnError = throwOnError
60+ this . highWaterMark = highWaterMark
5661
5762 if ( util . isStream ( body ) ) {
5863 body . on ( 'error' , ( err ) => {
@@ -73,40 +78,39 @@ class RequestHandler extends AsyncResource {
7378 }
7479
7580 onHeaders ( statusCode , rawHeaders , resume , statusMessage ) {
76- const { callback, opaque, abort, context } = this
81+ const { callback, opaque, abort, context, responseHeaders, highWaterMark } = this
82+
83+ const headers = responseHeaders === 'raw' ? util . parseRawHeaders ( rawHeaders ) : util . parseHeaders ( rawHeaders )
7784
7885 if ( statusCode < 200 ) {
7986 if ( this . onInfo ) {
80- const headers = this . responseHeaders === 'raw' ? util . parseRawHeaders ( rawHeaders ) : util . parseHeaders ( rawHeaders )
8187 this . onInfo ( { statusCode, headers } )
8288 }
8389 return
8490 }
8591
86- const parsedHeaders = util . parseHeaders ( rawHeaders )
92+ const parsedHeaders = responseHeaders === 'raw' ? util . parseHeaders ( rawHeaders ) : headers
8793 const contentType = parsedHeaders [ 'content-type' ]
88- const body = new Readable ( resume , abort , contentType )
94+ const body = new Readable ( { resume, abort, contentType, highWaterMark } )
8995
9096 this . callback = null
9197 this . res = body
92- const headers = this . responseHeaders === 'raw' ? util . parseRawHeaders ( rawHeaders ) : util . parseHeaders ( rawHeaders )
9398
9499 if ( callback !== null ) {
95100 if ( this . throwOnError && statusCode >= 400 ) {
96101 this . runInAsyncScope ( getResolveErrorBodyCallback , null ,
97102 { callback, body, contentType, statusCode, statusMessage, headers }
98103 )
99- return
104+ } else {
105+ this . runInAsyncScope ( callback , null , null , {
106+ statusCode,
107+ headers,
108+ trailers : this . trailers ,
109+ opaque,
110+ body,
111+ context
112+ } )
100113 }
101-
102- this . runInAsyncScope ( callback , null , null , {
103- statusCode,
104- headers,
105- trailers : this . trailers ,
106- opaque,
107- body,
108- context
109- } )
110114 }
111115 }
112116
@@ -153,33 +157,6 @@ class RequestHandler extends AsyncResource {
153157 }
154158}
155159
156- async function getResolveErrorBodyCallback ( { callback, body, contentType, statusCode, statusMessage, headers } ) {
157- if ( statusCode === 204 || ! contentType ) {
158- body . dump ( )
159- process . nextTick ( callback , new ResponseStatusCodeError ( `Response status code ${ statusCode } ${ statusMessage ? `: ${ statusMessage } ` : '' } ` , statusCode , headers ) )
160- return
161- }
162-
163- try {
164- if ( contentType . startsWith ( 'application/json' ) ) {
165- const payload = await body . json ( )
166- process . nextTick ( callback , new ResponseStatusCodeError ( `Response status code ${ statusCode } ${ statusMessage ? `: ${ statusMessage } ` : '' } ` , statusCode , headers , payload ) )
167- return
168- }
169-
170- if ( contentType . startsWith ( 'text/' ) ) {
171- const payload = await body . text ( )
172- process . nextTick ( callback , new ResponseStatusCodeError ( `Response status code ${ statusCode } ${ statusMessage ? `: ${ statusMessage } ` : '' } ` , statusCode , headers , payload ) )
173- return
174- }
175- } catch ( err ) {
176- // Process in a fallback if error
177- }
178-
179- body . dump ( )
180- process . nextTick ( callback , new ResponseStatusCodeError ( `Response status code ${ statusCode } ${ statusMessage ? `: ${ statusMessage } ` : '' } ` , statusCode , headers ) )
181- }
182-
183160function request ( opts , callback ) {
184161 if ( callback === undefined ) {
185162 return new Promise ( ( resolve , reject ) => {
0 commit comments