in packages/dubbo-node/src/node-universal-handler.ts [73:129]
export function universalRequestFromNodeRequest(
nodeRequest: NodeServerRequest,
parsedJsonBody: JsonValue | undefined
): UniversalServerRequest {
const encrypted =
"encrypted" in nodeRequest.socket && nodeRequest.socket.encrypted;
const protocol = encrypted ? "https" : "http";
const authority =
"authority" in nodeRequest
? nodeRequest.authority
: nodeRequest.headers.host;
const pathname = nodeRequest.url ?? "";
if (authority === undefined) {
throw new ConnectError(
"unable to determine request authority from Node.js server request",
Code.Internal
);
}
const body =
parsedJsonBody !== undefined
? parsedJsonBody
: asyncIterableFromNodeServerRequest(nodeRequest);
const abortController = new AbortController();
if ("stream" in nodeRequest) {
// HTTP/2 has error codes we want to honor
nodeRequest.once("close", () => {
const err = connectErrorFromH2ResetCode(nodeRequest.stream.rstCode);
if (err !== undefined) {
abortController.abort(err);
} else {
abortController.abort();
}
});
} else {
// HTTP/1.1 does not have error codes, but Node.js has ECONNRESET
const onH1Error = (e: Error) => {
nodeRequest.off("error", onH1Error);
nodeRequest.off("close", onH1Close);
abortController.abort(connectErrorFromNodeReason(e));
};
const onH1Close = () => {
nodeRequest.off("error", onH1Error);
nodeRequest.off("close", onH1Close);
abortController.abort();
};
nodeRequest.once("error", onH1Error);
nodeRequest.once("close", onH1Close);
}
return {
httpVersion: nodeRequest.httpVersion,
method: nodeRequest.method ?? "",
url: new URL(pathname, `${protocol}://${authority}`).toString(),
header: nodeHeaderToWebHeader(nodeRequest.headers),
body,
signal: abortController.signal,
};
}