/* * Copyright (c) 2021, Max Wipfli * Copyright (c) 2023-2026, Shannon Booth * * SPDX-License-Identifier: BSD-2-Clause */ #include #include #include #include #include #include namespace URL { // https://url.spec.whatwg.org/#concept-host-parser Optional Parser::parse_host(StringView input, bool is_opaque) { return RustIntegration::parse_host(input, is_opaque); } // https://url.spec.whatwg.org/#string-percent-encode-after-encoding String Parser::percent_encode_after_encoding(TextCodec::Encoder& encoder, StringView input, PercentEncodeSet percent_encode_set, bool space_as_plus) { // 1. Let encodeOutput be an empty I/O queue. StringBuilder output; // 2. Set potentialError to the result of running encode or fail with inputQueue, encoder, and encodeOutput. MUST(encoder.process( Utf8View(input), // 3. For each byte of encodeOutput converted to a byte sequence: [&](u8 byte) -> ErrorOr { // 1. If spaceAsPlus is true and byte is 0x20 (SP), then append U+002B (+) to output and continue. if (space_as_plus && byte == ' ') { output.append('+'); return {}; } // 2. Let isomorph be a code point whose value is byte’s value. u32 isomorph = byte; // 3. Assert: percentEncodeSet includes all non-ASCII code points. // 4. If isomorphic is not in percentEncodeSet, then append isomorph to output. if (!code_point_is_in_percent_encode_set(isomorph, percent_encode_set)) { output.append_code_point(isomorph); } // 5. Otherwise, percent-encode byte and append the result to output. else { output.appendff("%{:02X}", byte); } return {}; }, // 4. If potentialError is non-null, then append "%26%23", followed by the shortest sequence of ASCII digits // representing potentialError in base ten, followed by "%3B", to output. [&](u32 error) -> ErrorOr { output.appendff("%26%23{}%3B", error); return {}; })); // 6. Return output. return MUST(output.to_string()); } Optional Parser::basic_parse(StringView raw_input, Optional base_url, URL* url, Optional state_override, Optional encoding) { return RustIntegration::parse_basic_url(raw_input, base_url, url, state_override, encoding); } }