Skip to content

Commit 0c28b3f

Browse files
authored
Merge pull request #4426 from NativeScript/tivanova/fix-sporadic-hang-cloud-builds
fix: retry stuck requests
2 parents 497a071 + 6ffba37 commit 0c28b3f

File tree

1 file changed

+15
-14
lines changed

1 file changed

+15
-14
lines changed

lib/common/http-client.ts

+15-14
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import * as url from "url";
22
import { EOL } from "os";
3+
import { TLSSocket } from "tls";
34
import * as helpers from "./helpers";
45
import * as zlib from "zlib";
56
import * as util from "util";
@@ -105,8 +106,6 @@ export class HttpClient implements Server.IHttpClient {
105106

106107
const result = new Promise<Server.IResponse>((resolve, reject) => {
107108
let timerId: number;
108-
let stuckRequestTimerId: number;
109-
let hasResponse = false;
110109
const cleanupRequestData: ICleanupRequestData = Object.create({ timers: [] });
111110
this.cleanupData.push(cleanupRequestData);
112111

@@ -133,17 +132,6 @@ export class HttpClient implements Server.IHttpClient {
133132
const requestObj = request(options);
134133
cleanupRequestData.req = requestObj;
135134

136-
if (options.method !== "PUT" && options.method !== "POST") {
137-
stuckRequestTimerId = setTimeout(() => {
138-
clearTimeout(stuckRequestTimerId);
139-
stuckRequestTimerId = null;
140-
if (!hasResponse) {
141-
this.setResponseResult(promiseActions, cleanupRequestData, { err: new Error(HttpClient.STUCK_REQUEST_ERROR_MESSAGE) });
142-
}
143-
}, options.timeout || HttpClient.STUCK_REQUEST_TIMEOUT);
144-
cleanupRequestData.timers.push(stuckRequestTimerId);
145-
}
146-
147135
requestObj
148136
.on("error", (err: IHttpRequestError) => {
149137
this.$logger.trace("An error occurred while sending the request:", err);
@@ -158,9 +146,22 @@ export class HttpClient implements Server.IHttpClient {
158146
err.message = errorMessage || err.message;
159147
this.setResponseResult(promiseActions, cleanupRequestData, { err });
160148
})
149+
.on("socket", (s: TLSSocket) => {
150+
let stuckRequestTimerId: number;
151+
152+
stuckRequestTimerId = setTimeout(() => {
153+
this.setResponseResult(promiseActions, cleanupRequestData, { err: new Error(HttpClient.STUCK_REQUEST_ERROR_MESSAGE) });
154+
}, options.timeout || HttpClient.STUCK_REQUEST_TIMEOUT);
155+
156+
cleanupRequestData.timers.push(stuckRequestTimerId);
157+
158+
s.once("secureConnect", () => {
159+
clearTimeout(stuckRequestTimerId);
160+
stuckRequestTimerId = null;
161+
});
162+
})
161163
.on("response", (response: Server.IRequestResponseData) => {
162164
cleanupRequestData.res = response;
163-
hasResponse = true;
164165
let lastChunkTimestamp = Date.now();
165166
cleanupRequestData.stuckResponseIntervalId = setInterval(() => {
166167
if (Date.now() - lastChunkTimestamp > HttpClient.STUCK_RESPONSE_CHECK_INTERVAL) {

0 commit comments

Comments
 (0)