in sdk/server-proxies/src/HttpServerProxy.ts [99:146]
function httpInvoke(url: URL, request: TunnelIncomingMessage, abortSignal?: AbortSignalLike): Promise<TunnelOutgoingMessage> {
// always resolve, never reject
function errorResponse(message: string) {
return {
StatusCode: 500,
Headers: {},
Content: new TextEncoder().encode(message),
};
}
return new Promise<TunnelOutgoingMessage>((resolve, reject) => {
const req = http.request(
url,
{
method: request.HttpMethod,
headers: request.Headers,
},
(res) => {
const chunks: Uint8Array[] = [];
res.on("data", (chunk) => {
chunks.push(chunk);
});
res.on("end", () => {
logger.info(`Received proxied response for '${getDisplayUrl(url)}: status code:${res.statusCode ?? 0}'`);
const tunnelResponse = {
StatusCode: res.statusCode ?? 0,
Headers: convertHeaders(res.headers),
Content: new Uint8Array(Buffer.concat(chunks)),
};
resolve(tunnelResponse);
});
},
);
req.on("error", (err) => {
logger.error(`Error forwarding request '${getDisplayUrl(url)}': ${err}`);
resolve(errorResponse(err.message));
});
abortSignal?.addEventListener("abort", () => resolve(errorResponse("Request cancelled")));
if (request.Content) {
// Java getBody() relies on Content-Length header
req.setHeader("Content-Length", request.Content.byteLength.toString());
req.write(Buffer.from(request.Content));
}
req.end();
});
}