Current section

Files

Jump to
gleamrpc_http_server src gleamrpc@http@server.erl
Raw

src/gleamrpc@http@server.erl

-module(gleamrpc@http@server).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch]).
-export([http_server/0, init_mist/2, cors_middleware/1]).
-export_type([http_server_error/0, cors_origins/0]).
-type http_server_error() :: {method_unsupported, gleam@http:method()} |
no_name_error |
{wrong_prefix, binary()}.
-type cors_origins() :: all_origins | {cors_origins, list(binary())}.
-file("/home/runner/work/gleamrpc_http_server/gleamrpc_http_server/src/gleamrpc/http/server.gleam", 52).
-spec extract_procedure_type(gleam@http@request:request(any())) -> {ok,
gleamrpc:procedure_type()} |
{error, gleamrpc:gleam_rpc_server_error(http_server_error())}.
extract_procedure_type(In_request) ->
case erlang:element(2, In_request) of
get ->
{ok, 'query'};
post ->
{ok, mutation};
_ = Method ->
{error, {get_identity_error, {method_unsupported, Method}}}
end.
-file("/home/runner/work/gleamrpc_http_server/gleamrpc_http_server/src/gleamrpc/http/server.gleam", 77).
-spec build_name_and_router(
list(binary()),
gleam@option:option(gleamrpc:router())
) -> {ok, {binary(), gleam@option:option(gleamrpc:router())}} |
{error, gleamrpc:gleam_rpc_server_error(http_server_error())}.
build_name_and_router(Segments, Router) ->
case Segments of
[Name] ->
{ok, {Name, Router}};
[Name@1 | Rest] ->
build_name_and_router(Rest, {some, {router, Name@1, Router}});
[] ->
{error, {get_identity_error, no_name_error}}
end.
-file("/home/runner/work/gleamrpc_http_server/gleamrpc_http_server/src/gleamrpc/http/server.gleam", 65).
-spec extract_procedure_name_and_router(gleam@http@request:request(any())) -> {ok,
{binary(), gleam@option:option(gleamrpc:router())}} |
{error, gleamrpc:gleam_rpc_server_error(http_server_error())}.
extract_procedure_name_and_router(In_request) ->
case begin
_pipe = In_request,
gleam@http@request:path_segments(_pipe)
end of
[<<"api"/utf8>>, <<"gleamRPC"/utf8>> | Rest] ->
build_name_and_router(Rest, none);
_ ->
{error,
{get_identity_error,
{wrong_prefix, erlang:element(8, In_request)}}}
end.
-file("/home/runner/work/gleamrpc_http_server/gleamrpc_http_server/src/gleamrpc/http/server.gleam", 39).
-spec get_identity(gleam@http@request:request(any())) -> {ok,
gleamrpc:procedure_identity()} |
{error, gleamrpc:gleam_rpc_server_error(http_server_error())}.
get_identity(In_request) ->
gleam@result:'try'(
extract_procedure_type(In_request),
fun(Type_) ->
gleam@result:'try'(
extract_procedure_name_and_router(In_request),
fun(_use0) ->
{Name, Router} = _use0,
{ok, {procedure_identity, Name, Router, Type_}}
end
)
end
).
-file("/home/runner/work/gleamrpc_http_server/gleamrpc_http_server/src/gleamrpc/http/server.gleam", 105).
-spec get_params_query(
gleam@http@request:request(mist@internal@http:connection()),
convert:glitr_type()
) -> {ok, convert:glitr_value()} |
{error, gleamrpc:gleam_rpc_server_error(http_server_error())}.
get_params_query(Request, Params_type) ->
_pipe = gleam@http@request:get_query(Request),
_pipe@1 = gleam@result:replace_error(
_pipe,
{get_params_error,
[{decode_error, <<"A valid query"/utf8>>, <<""/utf8>>, []}]}
),
gleam@result:then(_pipe@1, fun(Query_value) -> _pipe@2 = Query_value,
_pipe@3 = (convert@http@query:decode_value(Params_type))(_pipe@2),
gleam@result:map_error(
_pipe@3,
fun(Field@0) -> {get_params_error, Field@0} end
) end).
-file("/home/runner/work/gleamrpc_http_server/gleamrpc_http_server/src/gleamrpc/http/server.gleam", 130).
-spec mist_read_error_to_get_params_error(mist:read_error()) -> gleamrpc:gleam_rpc_server_error(any()).
mist_read_error_to_get_params_error(Err) ->
case Err of
excess_body ->
{get_params_error,
[{decode_error, <<"Body size <= 65000"/utf8>>, <<""/utf8>>, []}]};
malformed_body ->
{get_params_error,
[{decode_error,
<<"A valid body"/utf8>>,
<<"Malformed body"/utf8>>,
[]}]}
end.
-file("/home/runner/work/gleamrpc_http_server/gleamrpc_http_server/src/gleamrpc/http/server.gleam", 145).
-spec decode_bit_array_request(
gleam@http@request:request(bitstring()),
convert:glitr_type()
) -> {ok, convert:glitr_value()} |
{error, gleamrpc:gleam_rpc_server_error(http_server_error())}.
decode_bit_array_request(Request, Params_type) ->
_pipe = erlang:element(4, Request),
_pipe@1 = gleam@json:decode_bits(
_pipe,
convert@json:decode_value(Params_type)
),
gleam@result:map_error(_pipe@1, fun(Err) -> case Err of
{unable_to_decode, Decode_err} ->
_pipe@2 = Decode_err,
_pipe@3 = gleam@list:map(
_pipe@2,
fun(Err@1) ->
{decode_error,
erlang:element(2, Err@1),
erlang:element(3, Err@1),
erlang:element(4, Err@1)}
end
),
{get_params_error, _pipe@3};
{unexpected_byte, Byte} ->
{get_params_error,
[{decode_error,
<<"A valid JSON"/utf8>>,
<<"Unexpected byte : "/utf8, Byte/binary>>,
[]}]};
unexpected_end_of_input ->
{get_params_error,
[{decode_error,
<<"A valid JSON"/utf8>>,
<<"Unexpected end of input"/utf8>>,
[]}]};
{unexpected_format, Decode_err@1} ->
{get_params_error, Decode_err@1};
{unexpected_sequence, Seq} ->
{get_params_error,
[{decode_error,
<<"A valid JSON"/utf8>>,
<<"Unexpected sequence : "/utf8, Seq/binary>>,
[]}]}
end end).
-file("/home/runner/work/gleamrpc_http_server/gleamrpc_http_server/src/gleamrpc/http/server.gleam", 120).
-spec get_params_mutation(
gleam@http@request:request(mist@internal@http:connection()),
convert:glitr_type()
) -> {ok, convert:glitr_value()} |
{error, gleamrpc:gleam_rpc_server_error(http_server_error())}.
get_params_mutation(Request, Params_type) ->
_pipe = Request,
_pipe@1 = mist:read_body(_pipe, 65000),
_pipe@2 = gleam@result:map_error(
_pipe@1,
fun mist_read_error_to_get_params_error/1
),
gleam@result:then(
_pipe@2,
fun(_capture) -> decode_bit_array_request(_capture, Params_type) end
).
-file("/home/runner/work/gleamrpc_http_server/gleamrpc_http_server/src/gleamrpc/http/server.gleam", 93).
-spec get_params(gleam@http@request:request(mist@internal@http:connection())) -> fun((gleamrpc:procedure_type(), convert:glitr_type()) -> {ok,
convert:glitr_value()} |
{error, gleamrpc:gleam_rpc_server_error(http_server_error())}).
get_params(Request) ->
fun(Procedure_type, Params_type) -> case Procedure_type of
mutation ->
get_params_mutation(Request, Params_type);
'query' ->
get_params_query(Request, Params_type)
end end.
-file("/home/runner/work/gleamrpc_http_server/gleamrpc_http_server/src/gleamrpc/http/server.gleam", 221).
-spec response_from_string(integer(), binary()) -> gleam@http@response:response(mist:response_data()).
response_from_string(Response_code, Body) ->
{response,
Response_code,
[],
{bytes,
begin
_pipe = Body,
gleam_stdlib:wrap_list(_pipe)
end}}.
-file("/home/runner/work/gleamrpc_http_server/gleamrpc_http_server/src/gleamrpc/http/server.gleam", 191).
-spec recover_http_server_error(http_server_error()) -> gleam@http@response:response(mist:response_data()).
recover_http_server_error(Error) ->
case Error of
{method_unsupported, Method} ->
response_from_string(
405,
<<(begin
_pipe = Method,
gleam@http:method_to_string(_pipe)
end)/binary,
" not allowed"/utf8>>
);
no_name_error ->
response_from_string(
400,
<<"Couldn't extract procedure name"/utf8>>
);
{wrong_prefix, Path} ->
response_from_string(400, <<"Wrong prefix: "/utf8, Path/binary>>)
end.
-file("/home/runner/work/gleamrpc_http_server/gleamrpc_http_server/src/gleamrpc/http/server.gleam", 205).
-spec recover_decode_errors(list(gleam@dynamic:decode_error())) -> gleam@http@response:response(mist:response_data()).
recover_decode_errors(Errors) ->
_pipe = Errors,
_pipe@1 = gleam@list:map(
_pipe,
fun(Error) ->
<<<<<<<<<<"Expected : "/utf8, (erlang:element(2, Error))/binary>>/binary,
", got : "/utf8>>/binary,
(erlang:element(3, Error))/binary>>/binary,
" at "/utf8>>/binary,
(gleam@string:join(erlang:element(4, Error), <<"."/utf8>>))/binary>>
end
),
_pipe@2 = gleam@string:join(_pipe@1, <<"\n"/utf8>>),
response_from_string(400, _pipe@2).
-file("/home/runner/work/gleamrpc_http_server/gleamrpc_http_server/src/gleamrpc/http/server.gleam", 180).
-spec recover_error(gleamrpc:gleam_rpc_server_error(http_server_error())) -> gleam@http@response:response(mist:response_data()).
recover_error(Error) ->
case Error of
{get_identity_error, Err} ->
recover_http_server_error(Err);
{get_params_error, Errors} ->
recover_decode_errors(Errors);
{procedure_exec_error, Err@1} ->
response_from_string(500, erlang:element(2, Err@1));
wrong_procedure ->
response_from_string(404, <<"Procedure not found"/utf8>>)
end.
-file("/home/runner/work/gleamrpc_http_server/gleamrpc_http_server/src/gleamrpc/http/server.gleam", 232).
-spec encode_result(convert:glitr_value()) -> gleam@http@response:response(mist:response_data()).
encode_result(Result) ->
Body = begin
_pipe = convert@json:encode_value(Result),
_pipe@1 = gleam@json:to_string(_pipe),
_pipe@2 = gleam_stdlib:wrap_list(_pipe@1),
{bytes, _pipe@2}
end,
_pipe@3 = gleam@http@response:new(200),
gleam@http@response:set_body(_pipe@3, Body).
-file("/home/runner/work/gleamrpc_http_server/gleamrpc_http_server/src/gleamrpc/http/server.gleam", 26).
-spec http_server() -> gleamrpc:procedure_server(gleam@http@request:request(mist@internal@http:connection()), gleam@http@response:response(mist:response_data()), http_server_error()).
http_server() ->
{procedure_server,
fun get_identity/1,
fun get_params/1,
fun recover_error/1,
fun encode_result/1}.
-file("/home/runner/work/gleamrpc_http_server/gleamrpc_http_server/src/gleamrpc/http/server.gleam", 256).
-spec init_mist(
gleamrpc:procedure_server_instance(gleam@http@request:request(mist@internal@http:connection()), gleam@http@response:response(mist:response_data()), any(), http_server_error()),
integer()
) -> mist:builder(mist@internal@http:connection(), mist:response_data()).
init_mist(Server, Port) ->
_pipe = Server,
_pipe@1 = gleamrpc:serve(_pipe),
_pipe@2 = mist:new(_pipe@1),
mist:port(_pipe@2, Port).
-file("/home/runner/work/gleamrpc_http_server/gleamrpc_http_server/src/gleamrpc/http/server.gleam", 279).
-spec cors_middleware(cors_origins()) -> fun((gleam@http@request:request(mist@internal@http:connection()), fun((gleam@http@request:request(mist@internal@http:connection())) -> gleam@http@response:response(mist:response_data()))) -> gleam@http@response:response(mist:response_data())).
cors_middleware(Origins) ->
fun(In, Next) ->
Response = Next(In),
case Origins of
all_origins ->
_pipe = Response,
gleam@http@response:set_header(
_pipe,
<<"Access-Control-Allow-Origin"/utf8>>,
<<"*"/utf8>>
);
{cors_origins, Origins@1} ->
case {gleam@list:key_find(
erlang:element(3, In),
<<"origin"/utf8>>
),
gleam@list:key_find(
erlang:element(3, In),
<<"Origin"/utf8>>
)} of
{{error, _}, {error, _}} ->
Response;
{{ok, Origin}, _} ->
case gleam@list:contains(Origins@1, Origin) of
false ->
Response;
true ->
_pipe@1 = Response,
gleam@http@response:set_header(
_pipe@1,
<<"Access-Control-Allow-Origin"/utf8>>,
Origin
)
end;
{_, {ok, Origin}} ->
case gleam@list:contains(Origins@1, Origin) of
false ->
Response;
true ->
_pipe@1 = Response,
gleam@http@response:set_header(
_pipe@1,
<<"Access-Control-Allow-Origin"/utf8>>,
Origin
)
end
end
end
end.