-module(aws@internal@uri). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]). -define(FILEPATH, "src/aws/internal/uri.gleam"). -export([encode_segment/1, encode_component/1]). -if(?OTP_RELEASE >= 27). -define(MODULEDOC(Str), -moduledoc(Str)). -define(DOC(Str), -doc(Str)). -else. -define(MODULEDOC(Str), -compile([])). -define(DOC(Str), -compile([])). -endif. ?MODULEDOC( " Percent-encoding helpers shared by SigV4 canonical-URI/query encoding and\n" " by HTTP-form encoding in the STS Web Identity provider. Kept in its own\n" " module so SigV4 and the STS provider can both depend on it without\n" " creating an import cycle through `aws/credentials`.\n" ). -file("src/aws/internal/uri.gleam", 57). -spec hex_digit(integer()) -> binary(). hex_digit(N) -> case N of 0 -> <<"0"/utf8>>; 1 -> <<"1"/utf8>>; 2 -> <<"2"/utf8>>; 3 -> <<"3"/utf8>>; 4 -> <<"4"/utf8>>; 5 -> <<"5"/utf8>>; 6 -> <<"6"/utf8>>; 7 -> <<"7"/utf8>>; 8 -> <<"8"/utf8>>; 9 -> <<"9"/utf8>>; 10 -> <<"A"/utf8>>; 11 -> <<"B"/utf8>>; 12 -> <<"C"/utf8>>; 13 -> <<"D"/utf8>>; 14 -> <<"E"/utf8>>; _ -> <<"F"/utf8>> end. -file("src/aws/internal/uri.gleam", 51). -spec hex_byte(integer()) -> binary(). hex_byte(B) -> High = B div 16, Low = B rem 16, <<(hex_digit(High))/binary, (hex_digit(Low))/binary>>. -file("src/aws/internal/uri.gleam", 43). -spec byte_to_string(integer()) -> binary(). byte_to_string(B) -> Bits = <>, case gleam@bit_array:to_string(Bits) of {ok, S} -> S; {error, _} -> <<""/utf8>> end. -file("src/aws/internal/uri.gleam", 33). -spec is_unreserved(integer()) -> boolean(). is_unreserved(B) -> (((((((B >= 16#41) andalso (B =< 16#5A)) orelse ((B >= 16#61) andalso (B =< 16#7A))) orelse ((B >= 16#30) andalso (B =< 16#39))) orelse (B =:= 16#2D)) orelse (B =:= 16#5F)) orelse (B =:= 16#2E)) orelse (B =:= 16#7E). -file("src/aws/internal/uri.gleam", 21). -spec encode_bytes(bitstring(), binary()) -> binary(). encode_bytes(Bits, Acc) -> case Bits of <<>> -> Acc; <> -> case is_unreserved(B) of true -> encode_bytes( Rest, <> ); false -> encode_bytes( Rest, <<<>/binary, (hex_byte(B))/binary>> ) end; _ -> Acc end. -file("src/aws/internal/uri.gleam", 10). ?DOC( " Percent-encode a single URI path segment. RFC 3986 unreserved characters\n" " (`A-Za-z0-9-_.~`) pass through; everything else becomes `%HH`.\n" ). -spec encode_segment(binary()) -> binary(). encode_segment(S) -> encode_bytes(gleam_stdlib:identity(S), <<""/utf8>>). -file("src/aws/internal/uri.gleam", 98). -spec hex_value(integer()) -> {ok, integer()} | {error, nil}. hex_value(B) -> case B of _ when (B >= 16#30) andalso (B =< 16#39) -> {ok, B - 16#30}; _ when (B >= 16#41) andalso (B =< 16#46) -> {ok, (B - 16#41) + 10}; _ when (B >= 16#61) andalso (B =< 16#66) -> {ok, (B - 16#61) + 10}; _ -> {error, nil} end. -file("src/aws/internal/uri.gleam", 82). -spec do_percent_decode(bitstring(), bitstring()) -> bitstring(). do_percent_decode(Bits, Acc) -> case Bits of <<>> -> Acc; <<16#25, H, L, Rest/bitstring>> -> case {hex_value(H), hex_value(L)} of {{ok, Hv}, {ok, Lv}} -> Byte = (Hv * 16) + Lv, do_percent_decode( Rest, gleam@bit_array:append(Acc, <>) ); {_, _} -> do_percent_decode( Rest, gleam@bit_array:append(Acc, <<16#25, H, L>>) ) end; <> -> do_percent_decode(Rest@1, gleam@bit_array:append(Acc, <>)); _ -> Acc end. -file("src/aws/internal/uri.gleam", 78). -spec percent_decode_bytes(bitstring()) -> bitstring(). percent_decode_bytes(Bits) -> do_percent_decode(Bits, <<>>). -file("src/aws/internal/uri.gleam", 17). ?DOC( " Percent-encode a URI component, first decoding any pre-existing\n" " percent-escapes so callers can pass values that may or may not already\n" " be encoded.\n" ). -spec encode_component(binary()) -> binary(). encode_component(S) -> encode_bytes(percent_decode_bytes(gleam_stdlib:identity(S)), <<""/utf8>>).