Refactor HTTP connection requests

This commit is contained in:
Zaid Abdulla committed 2020-12-04 15:33:35 -08:00
1 parent fa1e40e370
commit bded263adf
3 files changed
+53 -15

No files matched your search

+30 -15
View File
@@ -62,7 +62,6 @@ async function extractAuth(
function httpGet(
options: http.RequestOptions,
timeout,
_debug: boolean,
deviceId: string
): Promise<{ statusCode: number; headers: http.IncomingHttpHeaders }> {
@@ -77,15 +76,12 @@ function httpGet(
}
})
.on("error", (err) => {
req.abort();
reject(new Error("Device is offline"));
req.destroy();
reject(err);
if (_debug) debug.outgoingHttpRequestError(req, deviceId, options, err);
})
.on("socket", (socket) => {
socket.setTimeout(timeout);
socket.on("timeout", () => {
req.abort();
});
.on("timeout", () => {
req.destroy();
});
});
}
@@ -105,6 +101,7 @@ export async function httpConnectionRequest(
options.agent = new http.Agent({
maxSockets: 1,
keepAlive: true,
timeout: timeout,
});
let authHeader: Record<string, string>;
@@ -146,24 +143,42 @@ export async function httpConnectionRequest(
}
}
let res = await httpGet(opts, timeout, _debug, deviceId);
let res: { statusCode: number; headers: http.IncomingHttpHeaders };
try {
res = await httpGet(opts, _debug, deviceId);
} catch (err) {
// Workaround for some devices unexpectedly closing the connection
if (authHeader) {
try {
res = await httpGet(opts, _debug, deviceId);
} catch (err) {
return `Connection request error: ${err.message}`;
}
}
if (err["code"] === "ECONNRESET" || err["code"] === "ECONNREFUSED")
return "Device is offline";
return `Connection request error: ${err.message}`;
}
// Workaround for some devices unexpectedly closing the connection
if (res.statusCode === 0 && authHeader)
res = await httpGet(opts, timeout, _debug, deviceId);
if (res.statusCode === 0) return "Device is offline";
if (res.statusCode === 200 || res.statusCode === 204) return "";
// When a Connection Request is received for the Virtual CWMP Device and the Proxied
// Device is offline the CPE Proxier MUST respond with an HTTP 503 failure
if (res.statusCode === 503) return "Device is offline";
if (res.statusCode === 401 && res.headers["www-authenticate"]) {
authHeader = auth.parseWwwAuthenticateHeader(
res.headers["www-authenticate"]
);
[username, password, authExp] = await extractAuth(authExp, false);
} else {
return `Unexpected response code from device: ${res.statusCode}`;
return `Connection request error: Unexpected status code ${res.statusCode}`;
}
}
return "Incorrect connection request credentials";
return "Connection request error: Incorrect connection request credentials";
}
export async function udpConnectionRequest(