"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.parseURL = void 0; const types_1 = require("@aws-sdk/types"); const isIpAddress_1 = require("./isIpAddress"); const DEFAULT_PORTS = { [types_1.EndpointURLScheme.HTTP]: 80, [types_1.EndpointURLScheme.HTTPS]: 443, }; const parseURL = (value) => { const whatwgURL = (() => { try { if (value instanceof URL) { return value; } if (typeof value === "object" && "hostname" in value) { const { hostname, port, protocol = "", path = "", query = {} } = value; const url = new URL(`${protocol}//${hostname}${port ? `:${port}` : ""}${path}`); url.search = Object.entries(query) .map(([k, v]) => `${k}=${v}`) .join("&"); return url; } return new URL(value); } catch (error) { return null; } })(); if (!whatwgURL) { console.error(`Unable to parse ${JSON.stringify(value)} as a whatwg URL.`); return null; } const urlString = whatwgURL.href; const { host, hostname, pathname, protocol, search } = whatwgURL; if (search) { return null; } const scheme = protocol.slice(0, -1); if (!Object.values(types_1.EndpointURLScheme).includes(scheme)) { return null; } const isIp = (0, isIpAddress_1.isIpAddress)(hostname); const inputContainsDefaultPort = urlString.includes(`${host}:${DEFAULT_PORTS[scheme]}`) || (typeof value === "string" && value.includes(`${host}:${DEFAULT_PORTS[scheme]}`)); const authority = `${host}${inputContainsDefaultPort ? `:${DEFAULT_PORTS[scheme]}` : ``}`; return { scheme, authority, path: pathname, normalizedPath: pathname.endsWith("/") ? pathname : `${pathname}/`, isIp, }; }; exports.parseURL = parseURL;