1
1
/**
2
- * Copyright 2022 Optimizely
2
+ * Copyright 2022-2023 Optimizely
3
3
*
4
4
* Licensed under the Apache License, Version 2.0 (the "License");
5
5
* you may not use this file except in compliance with the License.
13
13
* See the License for the specific language governing permissions and
14
14
* limitations under the License.
15
15
*/
16
-
17
16
import http from 'http' ;
18
17
import https from 'https' ;
19
18
import url from 'url' ;
@@ -62,17 +61,14 @@ export class NodeRequestHandler implements RequestHandler {
62
61
} ,
63
62
timeout : this . timeout ,
64
63
} ) ;
65
- const responsePromise = this . getResponseFromRequest ( request ) ;
64
+ const abortableRequest = this . getAbortableRequestFromRequest ( request ) ;
66
65
67
66
if ( data ) {
68
67
request . write ( data ) ;
69
68
}
70
69
request . end ( ) ;
71
70
72
- return {
73
- abort : ( ) => request . destroy ( ) ,
74
- responsePromise,
75
- } ;
71
+ return abortableRequest ;
76
72
}
77
73
78
74
/**
@@ -119,11 +115,19 @@ export class NodeRequestHandler implements RequestHandler {
119
115
* Sends a built request handling response, errors, and events around the transmission
120
116
* @param request Request to send
121
117
* @private
122
- * @returns Response Promise-wrapped, simplified response object
118
+ * @returns AbortableRequest with simplified response promise
123
119
*/
124
- private getResponseFromRequest ( request : http . ClientRequest ) : Promise < Response > {
125
- return new Promise ( ( resolve , reject ) => {
120
+ private getAbortableRequestFromRequest ( request : http . ClientRequest ) : AbortableRequest {
121
+ let aborted = false ;
122
+
123
+ const abort = ( ) => {
124
+ aborted = true ;
125
+ request . destroy ( ) ;
126
+ } ;
127
+
128
+ const responsePromise : Promise < Response > = new Promise ( ( resolve , reject ) => {
126
129
request . on ( 'timeout' , ( ) => {
130
+ aborted = true ;
127
131
request . destroy ( ) ;
128
132
reject ( new Error ( 'Request timed out' ) ) ;
129
133
} ) ;
@@ -140,7 +144,7 @@ export class NodeRequestHandler implements RequestHandler {
140
144
} ) ;
141
145
142
146
request . once ( 'response' , ( incomingMessage : http . IncomingMessage ) => {
143
- if ( request . destroyed ) {
147
+ if ( aborted ) {
144
148
return ;
145
149
}
146
150
@@ -150,13 +154,13 @@ export class NodeRequestHandler implements RequestHandler {
150
154
151
155
let responseData = '' ;
152
156
response . on ( 'data' , ( chunk : string ) => {
153
- if ( ! request . destroyed ) {
157
+ if ( ! aborted ) {
154
158
responseData += chunk ;
155
159
}
156
160
} ) ;
157
161
158
162
response . on ( 'end' , ( ) => {
159
- if ( request . destroyed ) {
163
+ if ( aborted ) {
160
164
return ;
161
165
}
162
166
@@ -168,5 +172,7 @@ export class NodeRequestHandler implements RequestHandler {
168
172
} ) ;
169
173
} ) ;
170
174
} ) ;
175
+
176
+ return { abort, responsePromise } ;
171
177
}
172
178
}
0 commit comments