@@ -24,7 +24,9 @@ export class HttpClient implements Server.IHttpClient {
24
24
private $staticConfig : Config . IStaticConfig ) {
25
25
this . cleanupData = [ ] ;
26
26
this . $processService . attachToProcessExitSignals ( this , ( ) => {
27
- this . cleanupData . forEach ( d => this . cleanupAfterRequest ( d ) ) ;
27
+ this . cleanupData . forEach ( d => {
28
+ this . cleanupAfterRequest ( d ) ;
29
+ } ) ;
28
30
} ) ;
29
31
}
30
32
@@ -106,7 +108,7 @@ export class HttpClient implements Server.IHttpClient {
106
108
let timerId : number ;
107
109
let stuckRequestTimerId : number ;
108
110
let hasResponse = false ;
109
- const cleanupRequestData : ICleanupRequestData = { timers : [ ] , stuckResponseIntervalId : null } ;
111
+ const cleanupRequestData : ICleanupRequestData = Object . create ( { timers : [ ] } ) ;
110
112
this . cleanupData . push ( cleanupRequestData ) ;
111
113
112
114
const promiseActions : IPromiseActions < Server . IResponse > = {
@@ -130,12 +132,12 @@ export class HttpClient implements Server.IHttpClient {
130
132
131
133
this . $logger . trace ( "httpRequest: %s" , util . inspect ( options ) ) ;
132
134
const requestObj = request ( options ) ;
135
+ cleanupRequestData . req = requestObj ;
133
136
134
137
stuckRequestTimerId = setTimeout ( ( ) => {
135
138
clearTimeout ( stuckRequestTimerId ) ;
136
139
stuckRequestTimerId = null ;
137
140
if ( ! hasResponse ) {
138
- requestObj . abort ( ) ;
139
141
this . setResponseResult ( promiseActions , cleanupRequestData , { err : new Error ( HttpClient . STUCK_REQUEST_ERROR_MESSAGE ) } ) ;
140
142
}
141
143
} , options . timeout || HttpClient . STUCK_REQUEST_TIMEOUT ) ;
@@ -156,14 +158,11 @@ export class HttpClient implements Server.IHttpClient {
156
158
this . setResponseResult ( promiseActions , cleanupRequestData , { err } ) ;
157
159
} )
158
160
. on ( "response" , ( response : Server . IRequestResponseData ) => {
161
+ cleanupRequestData . res = response ;
159
162
hasResponse = true ;
160
163
let lastChunkTimestamp = Date . now ( ) ;
161
164
cleanupRequestData . stuckResponseIntervalId = setInterval ( ( ) => {
162
165
if ( Date . now ( ) - lastChunkTimestamp > HttpClient . STUCK_RESPONSE_CHECK_INTERVAL ) {
163
- if ( ( < any > response ) . destroy ) {
164
- ( < any > response ) . destroy ( ) ;
165
- }
166
-
167
166
this . setResponseResult ( promiseActions , cleanupRequestData , { err : new Error ( HttpClient . STUCK_RESPONSE_ERROR_MESSAGE ) } ) ;
168
167
}
169
168
} , HttpClient . STUCK_RESPONSE_CHECK_INTERVAL ) ;
@@ -245,8 +244,8 @@ export class HttpClient implements Server.IHttpClient {
245
244
this . cleanupAfterRequest ( cleanupRequestData ) ;
246
245
if ( ! result . isResolved ( ) ) {
247
246
result . isResolved = ( ) => true ;
248
- if ( resultData . err ) {
249
- return result . reject ( resultData . err ) ;
247
+ if ( resultData . err || ! resultData . response . complete ) {
248
+ return result . reject ( resultData . err || new Error ( "Request canceled" ) ) ;
250
249
}
251
250
252
251
const finalResult : any = resultData ;
@@ -327,12 +326,23 @@ export class HttpClient implements Server.IHttpClient {
327
326
clearInterval ( data . stuckResponseIntervalId ) ;
328
327
data . stuckResponseIntervalId = null ;
329
328
}
329
+
330
+ if ( data . req ) {
331
+ data . req . abort ( ) ;
332
+ }
333
+
334
+ if ( data . res ) {
335
+ data . res . destroy ( ) ;
336
+ }
330
337
}
338
+
331
339
}
332
340
333
341
interface ICleanupRequestData {
334
342
timers : number [ ] ;
335
343
stuckResponseIntervalId : NodeJS . Timer ;
344
+ req : request . Request ;
345
+ res : Server . IRequestResponseData ;
336
346
}
337
347
338
348
$injector . register ( "httpClient" , HttpClient ) ;
0 commit comments