import { CBurpastateWrapper } from "./burpastate.js"; import { HostName } from "../Independents/DNS/HostName.js"; import { CRequest } from "../Independents/Datagram/datagram.js"; import { RequestInitObject, RequestInfo, RequestInit, Request, Response } from "../Independents/Datagram/datagram-types.js"; import { Subscription } from "../Independents/util/Subscription.js"; import { url } from "inspector"; export async function burpaFetchSubscribed(state: CBurpastateWrapper, input: RequestInfo, init?: RequestInit): Promise> { let gw = state.LocalGateway(); let request = burpaRequestFromFetchInfo(state, input, init); //await gw.registerAtUpstream(request.to); request.from = gw.alias.name; let embedded = state.findLocalHost(request.to); if (embedded) { return gw.sendRequest(request); } gw.sendDatagram(request); let response = gw.getResponse(request.reqno); return response; } function burpaRequestFromFetchInfo(state: CBurpastateWrapper, input: RequestInfo, init?: RequestInit): Request { let initObj: RequestInitObject; let preInit = typeof (init) == "object" ? init : {} let bias: string | null; let host: string; let search: string; let pathname: string; let searchParams: string; let url: string | undefined; if (typeof input == "string") { if (input.startsWith(".")) { host = "external"; search = ""; pathname = ""; searchParams = ""; bias = null; url = input; } else { let hasBias = input.indexOf("//") == -1; let fixedUrlStr = hasBias ? "http://" + input : input; //console.warn("Parsing url",fixedUrlStr); let purl: URL; try { purl = new URL(fixedUrlStr); } catch { throw `Invalid URL ${fixedUrlStr}`; } bias = hasBias ? purl.protocol : null; host = purl.host; search = purl.search; searchParams = purl.searchParams.toString(); pathname = purl.pathname; url = undefined; //fixedUrlStr; } let to = state.hostName(host).name; initObj = { ...preInit, url, to, path: `${pathname}${(search) ? `?${searchParams}` : ""}`, bias } if (!initObj.from) { initObj.from = state.LocalGateway().alias.name; } } else { initObj = input; } return new CRequest(initObj); }