@@ -26,6 +26,7 @@ import FetchResponseHeaderUtility from './utilities/FetchResponseHeaderUtility.j
26
26
import FetchHTTPSCertificate from './certificate/FetchHTTPSCertificate.js' ;
27
27
import { Buffer } from 'buffer' ;
28
28
import FetchBodyUtility from './utilities/FetchBodyUtility.js' ;
29
+ import IFetchInterceptor from './types/IFetchInterceptor.js' ;
29
30
30
31
const LAST_CHUNK = Buffer . from ( '0\r\n\r\n' ) ;
31
32
@@ -39,7 +40,7 @@ const LAST_CHUNK = Buffer.from('0\r\n\r\n');
39
40
*/
40
41
export default class Fetch {
41
42
private reject : ( reason : Error ) => void | null = null ;
42
- private resolve : ( value : Response | Promise < Response > ) => void | null = null ;
43
+ private resolve : ( value : Response | Promise < Response > ) => Promise < void > = null ;
43
44
private listeners = {
44
45
onSignalAbort : this . onSignalAbort . bind ( this )
45
46
} ;
@@ -50,6 +51,7 @@ export default class Fetch {
50
51
private nodeResponse : IncomingMessage | null = null ;
51
52
private response : Response | null = null ;
52
53
private responseHeaders : Headers | null = null ;
54
+ private interceptor ?: IFetchInterceptor ;
53
55
private request : Request ;
54
56
private redirectCount = 0 ;
55
57
private disableCache : boolean ;
@@ -99,6 +101,7 @@ export default class Fetch {
99
101
options . disableSameOriginPolicy ??
100
102
this . #browserFrame. page . context . browser . settings . fetch . disableSameOriginPolicy ??
101
103
false ;
104
+ this . interceptor = this . #browserFrame. page . context . browser . settings . fetch . interceptor ;
102
105
}
103
106
104
107
/**
@@ -108,6 +111,15 @@ export default class Fetch {
108
111
*/
109
112
public async send ( ) : Promise < Response > {
110
113
FetchRequestReferrerUtility . prepareRequest ( new URL ( this . #window. location . href ) , this . request ) ;
114
+ const beforeRequestResponse = this . interceptor ?. beforeAsyncRequest
115
+ ? await this . interceptor . beforeAsyncRequest ( {
116
+ request : this . request ,
117
+ window : this . #window
118
+ } )
119
+ : undefined ;
120
+ if ( beforeRequestResponse instanceof Response ) {
121
+ return beforeRequestResponse ;
122
+ }
111
123
FetchRequestValidationUtility . validateSchema ( this . request ) ;
112
124
113
125
if ( this . request . signal . aborted ) {
@@ -122,7 +134,14 @@ export default class Fetch {
122
134
this . response = new this . #window. Response ( result . buffer , {
123
135
headers : { 'Content-Type' : result . type }
124
136
} ) ;
125
- return this . response ;
137
+ const interceptedResponse = this . interceptor ?. afterAsyncResponse
138
+ ? await this . interceptor . afterAsyncResponse ( {
139
+ window : this . #window,
140
+ response : this . response ,
141
+ request : this . request
142
+ } )
143
+ : undefined ;
144
+ return interceptedResponse instanceof Response ? interceptedResponse : this . response ;
126
145
}
127
146
128
147
// Security check for "https" to "http" requests.
@@ -365,9 +384,9 @@ export default class Fetch {
365
384
throw new this . #window. Error ( 'Fetch already sent.' ) ;
366
385
}
367
386
368
- this . resolve = ( response : Response | Promise < Response > ) : void => {
387
+ this . resolve = async ( response : Response | Promise < Response > ) : Promise < void > => {
369
388
// We can end up here when closing down the browser frame and there is an ongoing request.
370
- // Therefore we need to check if browserFrame.page.context is still available.
389
+ // Therefore, we need to check if browserFrame.page.context is still available.
371
390
if (
372
391
! this . disableCache &&
373
392
response instanceof Response &&
@@ -382,8 +401,16 @@ export default class Fetch {
382
401
waitingForBody : ! response [ PropertySymbol . buffer ] && ! ! response . body
383
402
} ) ;
384
403
}
404
+
405
+ const interceptedResponse = this . interceptor ?. afterAsyncResponse
406
+ ? await this . interceptor . afterAsyncResponse ( {
407
+ window : this . #window,
408
+ response : await response ,
409
+ request : this . request
410
+ } )
411
+ : undefined ;
385
412
this . #browserFrame[ PropertySymbol . asyncTaskManager ] . endTask ( taskID ) ;
386
- resolve ( response ) ;
413
+ resolve ( interceptedResponse instanceof Response ? interceptedResponse : response ) ;
387
414
} ;
388
415
this . reject = ( error : Error ) : void => {
389
416
this . #browserFrame[ PropertySymbol . asyncTaskManager ] . endTask ( taskID ) ;
0 commit comments