-module(aws@internal@http_request). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]). -define(FILEPATH, "src/aws/internal/http_request.gleam"). -export([parse/1]). -export_type([http_request/0, header/0, parse_error/0]). -type http_request() :: {http_request, binary(), binary(), binary(), list(header()), bitstring()}. -type header() :: {header, binary(), binary()}. -type parse_error() :: {malformed_request_line, binary()} | {malformed_header, binary()}. -file("src/aws/internal/http_request.gleam", 104). -spec is_continuation(binary()) -> boolean(). is_continuation(Line) -> gleam_stdlib:string_starts_with(Line, <<" "/utf8>>) orelse gleam_stdlib:string_starts_with( Line, <<"\t"/utf8>> ). -file("src/aws/internal/http_request.gleam", 80). -spec do_parse_headers(list(binary()), list(header())) -> {ok, list(header())} | {error, parse_error()}. do_parse_headers(Lines, Acc) -> case Lines of [] -> {ok, lists:reverse(Acc)}; [Line | Rest] -> case {is_continuation(Line), Acc} of {true, [{header, Name, Value} | Tail]} -> Merged = {header, Name, <<<>/binary, (gleam@string:trim(Line))/binary>>}, do_parse_headers(Rest, [Merged | Tail]); {true, []} -> {error, {malformed_header, Line}}; {false, _} -> case gleam@string:split_once(Line, <<":"/utf8>>) of {ok, {Name@1, Value@1}} -> do_parse_headers( Rest, [{header, Name@1, Value@1} | Acc] ); {error, _} -> {error, {malformed_header, Line}} end end end. -file("src/aws/internal/http_request.gleam", 76). -spec parse_headers(list(binary())) -> {ok, list(header())} | {error, parse_error()}. parse_headers(Lines) -> do_parse_headers(Lines, []). -file("src/aws/internal/http_request.gleam", 53). -spec parse_request_line(binary()) -> {ok, {binary(), binary(), binary()}} | {error, parse_error()}. parse_request_line(Line) -> case gleam@string:split(Line, <<" "/utf8>>) of [Method | Rest] -> case lists:reverse(Rest) of [_ | Target_parts_rev] -> Target = begin _pipe = Target_parts_rev, _pipe@1 = lists:reverse(_pipe), gleam@string:join(_pipe@1, <<" "/utf8>>) end, {Path, Query} = case gleam@string:split_once( Target, <<"?"/utf8>> ) of {ok, {P, Q}} -> {P, Q}; {error, _} -> {Target, <<""/utf8>>} end, {ok, {Method, Path, Query}}; [] -> {error, {malformed_request_line, Line}} end; [] -> {error, {malformed_request_line, Line}} end. -file("src/aws/internal/http_request.gleam", 43). -spec split_head_body(binary()) -> {binary(), binary()}. split_head_body(Text) -> Normalized = gleam@string:replace(Text, <<"\r\n"/utf8>>, <<"\n"/utf8>>), case gleam@string:split_once(Normalized, <<"\n\n"/utf8>>) of {ok, {Head, Body}} -> {Head, Body}; {error, _} -> {gleam@string:trim_end(Normalized), <<""/utf8>>} end. -file("src/aws/internal/http_request.gleam", 25). -spec parse(binary()) -> {ok, http_request()} | {error, parse_error()}. parse(Text) -> {Head, Body} = split_head_body(Text), case gleam@string:split(Head, <<"\n"/utf8>>) of [] -> {error, {malformed_request_line, <<""/utf8>>}}; [Request_line | Header_lines] -> gleam@result:'try'( parse_request_line(Request_line), fun(_use0) -> {Method, Path, Query} = _use0, gleam@result:'try'( parse_headers(Header_lines), fun(Headers) -> {ok, {http_request, Method, Path, Query, Headers, gleam_stdlib:identity(Body)}} end ) end ) end.