123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081 |
- import { assert, makeError } from "./errors.js";
- import type {
- FetchGetUrlFunc, FetchRequest, FetchCancelSignal, GetUrlResponse
- } from "./fetch.js";
- export function createGetUrl(options?: Record<string, any>): FetchGetUrlFunc {
- async function getUrl(req: FetchRequest, _signal?: FetchCancelSignal): Promise<GetUrlResponse> {
- assert(_signal == null || !_signal.cancelled, "request cancelled before sending", "CANCELLED");
- const protocol = req.url.split(":")[0].toLowerCase();
- assert(protocol === "http" || protocol === "https", `unsupported protocol ${ protocol }`, "UNSUPPORTED_OPERATION", {
- info: { protocol },
- operation: "request"
- });
- assert(protocol === "https" || !req.credentials || req.allowInsecureAuthentication, "insecure authorized connections unsupported", "UNSUPPORTED_OPERATION", {
- operation: "request"
- });
- let error: null | Error = null;
- const controller = new AbortController();
- const timer = setTimeout(() => {
- error = makeError("request timeout", "TIMEOUT");
- controller.abort();
- }, req.timeout);
- if (_signal) {
- _signal.addListener(() => {
- error = makeError("request cancelled", "CANCELLED");
- controller.abort();
- });
- }
- const init = {
- method: req.method,
- headers: new Headers(Array.from(req)),
- body: req.body || undefined,
- signal: controller.signal
- };
- let resp: Awaited<ReturnType<typeof fetch>>;
- try {
- resp = await fetch(req.url, init);
- } catch (_error) {
- clearTimeout(timer);
- if (error) { throw error; }
- throw _error;
- }
- clearTimeout(timer);
- const headers: Record<string, string> = { };
- resp.headers.forEach((value, key) => {
- headers[key.toLowerCase()] = value;
- });
- const respBody = await resp.arrayBuffer();
- const body = (respBody == null) ? null: new Uint8Array(respBody);
- return {
- statusCode: resp.status,
- statusMessage: resp.statusText,
- headers, body
- };
- }
- return getUrl;
- }
- // @TODO: remove in v7; provided for backwards compat
- const defaultGetUrl: FetchGetUrlFunc = createGetUrl({ });
- export async function getUrl(req: FetchRequest, _signal?: FetchCancelSignal): Promise<GetUrlResponse> {
- return defaultGetUrl(req, _signal);
- }
|