@@ -129,6 +129,24 @@ describe("Rule event susbcriptions", () => {
129
129
expect ( responseBodyEvent ) . to . deep . equal ( { overridden : false } ) ;
130
130
} ) ;
131
131
132
+ it ( "should fire no events if beforeRequest closes response" , async ( ) => {
133
+ await remoteServer . forAnyRequest ( ) . thenReply ( 200 ) ;
134
+ const forwardingRule = await server . forAnyRequest ( ) . thenForwardTo ( remoteServer . url , {
135
+ beforeRequest : ( ) => ( { response : 'close' } )
136
+ } ) ;
137
+
138
+ const ruleEvents : RuleEvent < any > [ ] = [ ] ;
139
+ await server . on ( 'rule-event' , ( e ) => ruleEvents . push ( e ) ) ;
140
+
141
+ const response = await fetch ( server . url ) . catch ( ( e ) => e ) ;
142
+ expect ( response ) . to . be . instanceOf ( Error ) ;
143
+ expect ( response ) . to . match ( isNode ? / s o c k e t h a n g u p / : / F a i l e d t o f e t c h / ) ;
144
+
145
+ await delay ( 100 ) ;
146
+
147
+ expect ( ruleEvents . length ) . to . equal ( 0 ) ;
148
+ } ) ;
149
+
132
150
it ( "should include upstream-perspective (= unmodified) response bodies" , async ( ) => {
133
151
await remoteServer . forAnyRequest ( ) . thenReply ( 200 , 'Original response body' ) ;
134
152
const forwardingRule = await server . forAnyRequest ( ) . thenForwardTo ( remoteServer . url , {
@@ -171,6 +189,44 @@ describe("Rule event susbcriptions", () => {
171
189
expect ( responseBodyEvent . rawBody . toString ( 'utf8' ) ) . to . equal ( 'Original response body' ) ;
172
190
} ) ;
173
191
192
+ it ( "should include response bodies after beforeResponse 'close'" , async ( ) => {
193
+ await remoteServer . forAnyRequest ( ) . thenReply ( 200 , 'Original response body' ) ;
194
+ const forwardingRule = await server . forAnyRequest ( ) . thenForwardTo ( remoteServer . url , {
195
+ beforeResponse : ( ) => 'close'
196
+ } ) ;
197
+
198
+ const ruleEvents : RuleEvent < any > [ ] = [ ] ;
199
+ await server . on ( 'rule-event' , ( e ) => ruleEvents . push ( e ) ) ;
200
+
201
+ const response = await fetch ( server . url ) . catch ( ( e ) => e ) ;
202
+ expect ( response ) . to . be . instanceOf ( Error ) ;
203
+ expect ( response ) . to . match ( isNode ? / s o c k e t h a n g u p / : / F a i l e d t o f e t c h / ) ;
204
+
205
+ await delay ( 100 ) ;
206
+
207
+ expect ( ruleEvents . length ) . to . equal ( 4 ) ;
208
+
209
+ const requestId = ( await forwardingRule . getSeenRequests ( ) ) [ 0 ] . id ;
210
+ ruleEvents . forEach ( ( event ) => {
211
+ expect ( event . ruleId ) . to . equal ( forwardingRule . id ) ;
212
+ expect ( event . requestId ) . to . equal ( requestId ) ;
213
+ } ) ;
214
+
215
+ expect ( ruleEvents . map ( e => e . eventType ) ) . to . deep . equal ( [
216
+ 'passthrough-request-head' ,
217
+ 'passthrough-request-body' ,
218
+ 'passthrough-response-head' ,
219
+ 'passthrough-response-body'
220
+ ] ) ;
221
+
222
+ const responseHeadEvent = ruleEvents [ 2 ] . eventData ;
223
+ expect ( responseHeadEvent . statusCode ) . to . equal ( 200 ) ; // <-- Original status
224
+
225
+ const responseBodyEvent = ruleEvents [ 3 ] . eventData ;
226
+ expect ( responseBodyEvent . overridden ) . to . equal ( true ) ;
227
+ expect ( responseBodyEvent . rawBody . toString ( 'utf8' ) ) . to . equal ( 'Original response body' ) ;
228
+ } ) ;
229
+
174
230
it ( "should fire for proxied websockets" , async ( ) => {
175
231
await remoteServer . forAnyWebSocket ( ) . thenPassivelyListen ( ) ;
176
232
const forwardingRule = await server . forAnyWebSocket ( ) . thenForwardTo ( remoteServer . url ) ;
0 commit comments