in src/Sfx-Standalone/modules/http/request-handlers/electron.ts [56:153]
function handleRequestAsync(
serverCertValidator: ServerCertValidator,
pipeline: IHttpPipeline,
request: IHttpRequest): Promise<IHttpResponse> {
return new Promise((resolve, reject) => {
try {
const session = electron.session.fromPartition(uuidv4(), {
cache: false
});
if (serverCertValidator) {
session.setCertificateVerifyProc((request, callback) => {
if (request.errorCode === 0) {
callback(request.errorCode);
} else if (serverCertValidator(request.hostname, toCertificateInfo(request.certificate))) {
callback(0);
} else {
callback(-2);
}
});
}
session.allowNTLMCredentialsForDomains("*");
session.webRequest.onErrorOccurred((details) => {
if (details.error === "net::ERR_SSL_CLIENT_AUTH_CERT_NEEDED") {
resolve({
httpVersion: "1.1",
statusCode: 403,
statusMessage: "Client certificate required",
data: undefined,
headers: [],
body: undefined
});
return;
}
reject(new Error(details.error));
});
const options: any = Object.assign(Object.create(null));
let body: string | Buffer;
if (Buffer.isBuffer(request.body) || typeof request.body === "string") {
body = request.body;
} else {
body = JSON.stringify(request.body);
const headerIndex = request.headers.findIndex((value) => value.name === "Content-Type");
const contentTypeHeader: IHttpHeader = headerIndex < 0 ? Object.create(null) : request.headers[headerIndex];
contentTypeHeader.name = "Content-Type";
contentTypeHeader.value = "application/json; charset=utf-8";
if (headerIndex >= 0) {
request.headers[headerIndex] = contentTypeHeader;
} else {
request.headers.push(contentTypeHeader);
}
}
options.url = request.url;
options.method = request.method;
options.session = session;
options.redirect = "manual";
const httpRequest = electron.net.request(options);
if (request.headers) {
applyHeaders(httpRequest, request.headers);
}
httpRequest.on("response", async (response: electron.IncomingMessage & NodeJS.ReadableStream) => {
const httpResponse: IHttpResponse = Object.create(null);
httpResponse.httpVersion = response.httpVersion;
httpResponse.statusCode = response.statusCode;
httpResponse.statusMessage = response.statusMessage;
httpResponse.headers = generateHeaders(response.headers);
httpResponse.body = await generateBodyAsync(response);
resolve(httpResponse);
});
httpRequest.on("error", (error) => reject(error));
if (body) {
httpRequest.write(body);
}
httpRequest.end();
} catch (err) {
reject(err);
}
});
}