53 lines
1.7 KiB
JavaScript
53 lines
1.7 KiB
JavaScript
|
import { Readable } from "stream";
|
||
|
const MIN_WAIT_TIME = 1000;
|
||
|
export async function writeRequestBody(httpRequest, request, maxContinueTimeoutMs = MIN_WAIT_TIME) {
|
||
|
const headers = request.headers ?? {};
|
||
|
const expect = headers["Expect"] || headers["expect"];
|
||
|
let timeoutId = -1;
|
||
|
let hasError = false;
|
||
|
if (expect === "100-continue") {
|
||
|
await Promise.race([
|
||
|
new Promise((resolve) => {
|
||
|
timeoutId = Number(setTimeout(resolve, Math.max(MIN_WAIT_TIME, maxContinueTimeoutMs)));
|
||
|
}),
|
||
|
new Promise((resolve) => {
|
||
|
httpRequest.on("continue", () => {
|
||
|
clearTimeout(timeoutId);
|
||
|
resolve();
|
||
|
});
|
||
|
httpRequest.on("error", () => {
|
||
|
hasError = true;
|
||
|
clearTimeout(timeoutId);
|
||
|
resolve();
|
||
|
});
|
||
|
}),
|
||
|
]);
|
||
|
}
|
||
|
if (!hasError) {
|
||
|
writeBody(httpRequest, request.body);
|
||
|
}
|
||
|
}
|
||
|
function writeBody(httpRequest, body) {
|
||
|
if (body instanceof Readable) {
|
||
|
body.pipe(httpRequest);
|
||
|
return;
|
||
|
}
|
||
|
if (body) {
|
||
|
if (Buffer.isBuffer(body) || typeof body === "string") {
|
||
|
httpRequest.end(body);
|
||
|
return;
|
||
|
}
|
||
|
const uint8 = body;
|
||
|
if (typeof uint8 === "object" &&
|
||
|
uint8.buffer &&
|
||
|
typeof uint8.byteOffset === "number" &&
|
||
|
typeof uint8.byteLength === "number") {
|
||
|
httpRequest.end(Buffer.from(uint8.buffer, uint8.byteOffset, uint8.byteLength));
|
||
|
return;
|
||
|
}
|
||
|
httpRequest.end(Buffer.from(body));
|
||
|
return;
|
||
|
}
|
||
|
httpRequest.end();
|
||
|
}
|