2323
2424const {
2525 ArrayIsArray,
26+ Boolean,
2627 Error,
2728 MathMin,
2829 NumberIsFinite,
@@ -32,6 +33,7 @@ const {
3233 Symbol,
3334 SymbolAsyncDispose,
3435 SymbolFor,
36+ globalThis,
3537} = primordials ;
3638
3739const net = require ( 'net' ) ;
@@ -105,6 +107,7 @@ const onResponseFinishChannel = dc.channel('http.server.response.finish');
105107
106108const kServerResponse = Symbol ( 'ServerResponse' ) ;
107109const kServerResponseStatistics = Symbol ( 'ServerResponseStatistics' ) ;
110+ const kDumpGet = Symbol ( 'kDumpGet' ) ;
108111
109112const {
110113 hasObserver,
@@ -447,6 +450,8 @@ function storeHTTPOptions(options) {
447450 this [ kIncomingMessage ] = options . IncomingMessage || IncomingMessage ;
448451 this [ kServerResponse ] = options . ServerResponse || ServerResponse ;
449452
453+ this [ kDumpGet ] = Boolean ( options . dumpGETBody ?? globalThis . IS_NODE_TEST ) ;
454+
450455 const maxHeaderSize = options . maxHeaderSize ;
451456 if ( maxHeaderSize !== undefined )
452457 validateInteger ( maxHeaderSize , 'maxHeaderSize' , 0 ) ;
@@ -1102,6 +1107,24 @@ function parserOnIncoming(server, socket, state, req, keepAlive) {
11021107 } ) ;
11031108 }
11041109
1110+ if ( req [ kDumpGet ] ) {
1111+ if ( req . method === 'HEAD' || req . method === 'GET' ) {
1112+ // Fast dump where request "has" already emitted all lifecycle events.
1113+ // This avoid a lot of unnecessary overhead otherwise introduced by
1114+ // stream.Readable life cycle rules. The downside is that this will
1115+ // break some servers that read GET bodies.
1116+
1117+ req . _dumped = true ;
1118+ req . _readableState . ended = true ;
1119+ req . _readableState . endEmitted = true ;
1120+ req . _readableState . destroyed = true ;
1121+ req . _readableState . closed = true ;
1122+ req . _readableState . closeEmitted = true ;
1123+
1124+ req . _read ( ) ;
1125+ }
1126+ }
1127+
11051128 if ( socket . _httpMessage ) {
11061129 // There are already pending outgoing res, append.
11071130 state . outgoing . push ( res ) ;
0 commit comments