function httpInvoke()

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();
      });
    }