@@ -9,6 +9,7 @@ import MitmRequestContext from '../lib/MitmRequestContext';
99import { parseRawHeaders } from '../lib/Utils' ;
1010import BaseHttpHandler from './BaseHttpHandler' ;
1111import HttpResponseCache from '../lib/HttpResponseCache' ;
12+ import ResourceState from '../interfaces/ResourceState' ;
1213
1314const { log } = Log ( module ) ;
1415const redirectCodes = new Set ( [ 300 , 301 , 302 , 303 , 305 , 307 , 308 ] ) ;
@@ -23,23 +24,25 @@ export default class HttpRequestHandler extends BaseHttpHandler {
2324 > ,
2425 ) {
2526 super ( request , false , HttpRequestHandler . responseCache ) ;
27+ this . context . setState ( ResourceState . ClientToProxyRequest ) ;
28+
29+ // register error listeners first
30+ const { clientToProxyRequest, proxyToClientResponse } = request ;
31+ clientToProxyRequest . on ( 'error' , this . onError . bind ( this , 'ClientToProxy.RequestError' ) ) ;
32+ if ( clientToProxyRequest instanceof Http2ServerRequest ) {
33+ const http2Session = clientToProxyRequest . stream . session ;
34+ if ( ! http2Session . listenerCount ( 'error' ) ) {
35+ http2Session . on ( 'error' , this . onError . bind ( this , 'ClientToProxy.Http2SessionError' ) ) ;
36+ }
37+ }
38+ proxyToClientResponse . on ( 'error' , this . onError . bind ( this , 'ProxyToClient.ResponseError' ) ) ;
2639 }
2740
2841 public async onRequest ( ) {
29- const { clientToProxyRequest, proxyToClientResponse } = this . context ;
42+ const { clientToProxyRequest } = this . context ;
3043
3144 try {
3245 clientToProxyRequest . pause ( ) ;
33- clientToProxyRequest . on ( 'error' , this . onError . bind ( this , 'ClientToProxy.RequestError' ) ) ;
34- if ( clientToProxyRequest instanceof Http2ServerRequest ) {
35- if ( clientToProxyRequest . stream . session . listenerCount ( 'error' ) === 0 ) {
36- clientToProxyRequest . stream . session . on (
37- 'error' ,
38- this . onError . bind ( this , 'ClientToProxy.SessionError' ) ,
39- ) ;
40- }
41- }
42- proxyToClientResponse . on ( 'error' , this . onError . bind ( this , 'ProxyToClient.ResponseError' ) ) ;
4346
4447 const proxyToServerRequest = await this . createProxyToServerRequest ( ) ;
4548 if ( ! proxyToServerRequest ) return ;
@@ -61,6 +64,8 @@ export default class HttpRequestHandler extends BaseHttpHandler {
6164 rawHeaders ?: string [ ] ,
6265 ) {
6366 const context = this . context ;
67+ context . setState ( ResourceState . ServerToProxyOnResponse ) ;
68+
6469 if ( response instanceof http . IncomingMessage ) {
6570 MitmRequestContext . readHttp1Response ( context , response ) ;
6671 } else {
@@ -91,6 +96,8 @@ export default class HttpRequestHandler extends BaseHttpHandler {
9196
9297 await this . writeResponse ( ) ;
9398
99+ context . setState ( ResourceState . End ) ;
100+
94101 process . nextTick ( agent => agent . freeSocket ( context ) , context . requestSession . requestAgent ) ;
95102 }
96103
@@ -99,7 +106,8 @@ export default class HttpRequestHandler extends BaseHttpHandler {
99106 const { method, requestSession, proxyToClientResponse } = this . context ;
100107 const sessionId = requestSession . sessionId ;
101108
102- requestSession . emit ( 'httpError' , {
109+ this . context . setState ( ResourceState . Error ) ;
110+ requestSession . emit ( 'http-error' , {
103111 request : MitmRequestContext . toEmittedResource ( this . context ) ,
104112 error,
105113 } ) ;
@@ -120,6 +128,7 @@ export default class HttpRequestHandler extends BaseHttpHandler {
120128 }
121129
122130 private async writeRequest ( ) {
131+ this . context . setState ( ResourceState . WriteProxyToServerRequestBody ) ;
123132 const { proxyToServerRequest, clientToProxyRequest } = this . context ;
124133
125134 const onWriteError = error => {
@@ -142,6 +151,7 @@ export default class HttpRequestHandler extends BaseHttpHandler {
142151 log . warn ( 'Error.NoProxyToClientResponse' , {
143152 sessionId : context . requestSession . sessionId ,
144153 } ) ;
154+ context . setState ( ResourceState . PrematurelyClosed ) ;
145155 return ;
146156 }
147157
@@ -157,6 +167,7 @@ export default class HttpRequestHandler extends BaseHttpHandler {
157167 context . responseTrailers = headers ;
158168 } ) ;
159169
170+ context . setState ( ResourceState . WriteProxyToClientResponseBody ) ;
160171 for await ( const chunk of serverToProxyResponse ) {
161172 const data = context . cacheHandler . onResponseData ( chunk as Buffer ) ;
162173 if ( data && ! ( proxyToClientResponse as Http2ServerResponse ) . stream ?. destroyed ) {
0 commit comments