diff options
Diffstat (limited to 'test/handlers/echo_h.erl')
-rw-r--r-- | test/handlers/echo_h.erl | 46 |
1 files changed, 34 insertions, 12 deletions
diff --git a/test/handlers/echo_h.erl b/test/handlers/echo_h.erl index fd45c5f..fb7d8a8 100644 --- a/test/handlers/echo_h.erl +++ b/test/handlers/echo_h.erl @@ -12,10 +12,30 @@ init(Req, Opts) -> echo_arg(Arg, Req, Opts) end. -echo(<<"body">>, Req0, Opts) -> - {ok, Body, Req} = cowboy_req:read_body(Req0), - cowboy_req:reply(200, #{}, Body, Req), - {ok, Req, Opts}; +echo(<<"read_body">>, Req0, Opts) -> + case Opts of + #{crash := true} -> ct_helper:ignore(cowboy_req, read_body, 2); + _ -> ok + end, + {_, Body, Req} = case cowboy_req:path(Req0) of + <<"/full", _/bits>> -> read_body(Req0, <<>>); + <<"/opts", _/bits>> -> cowboy_req:read_body(Req0, Opts); + _ -> cowboy_req:read_body(Req0) + end, + {ok, cowboy_req:reply(200, #{}, Body, Req), Opts}; +echo(<<"read_urlencoded_body">>, Req0, Opts) -> + Path = cowboy_req:path(Req0), + case {Path, Opts} of + {<<"/opts", _/bits>>, #{crash := true}} -> ct_helper:ignore(cowboy_req, read_body, 2); + {_, #{crash := true}} -> ct_helper:ignore(cowboy_req, read_urlencoded_body, 2); + _ -> ok + end, + {ok, Body, Req} = case Path of + <<"/opts", _/bits>> -> cowboy_req:read_urlencoded_body(Req0, Opts); + <<"/crash", _/bits>> -> cowboy_req:read_urlencoded_body(Req0, Opts); + _ -> cowboy_req:read_urlencoded_body(Req0) + end, + {ok, cowboy_req:reply(200, #{}, value_to_iodata(Body), Req), Opts}; echo(<<"uri">>, Req, Opts) -> Value = case cowboy_req:path_info(Req) of [<<"origin">>] -> cowboy_req:uri(Req, #{host => undefined}); @@ -25,8 +45,7 @@ echo(<<"uri">>, Req, Opts) -> [<<"set-port">>] -> cowboy_req:uri(Req, #{port => 123}); [] -> cowboy_req:uri(Req) end, - cowboy_req:reply(200, #{}, Value, Req), - {ok, Req, Opts}; + {ok, cowboy_req:reply(200, #{}, Value, Req), Opts}; echo(<<"match">>, Req, Opts) -> [Type|Fields0] = cowboy_req:path_info(Req), Fields = [binary_to_atom(F, latin1) || F <- Fields0], @@ -34,13 +53,11 @@ echo(<<"match">>, Req, Opts) -> <<"qs">> -> cowboy_req:match_qs(Fields, Req); <<"cookies">> -> cowboy_req:match_cookies(Fields, Req) end, - cowboy_req:reply(200, #{}, value_to_iodata(Value), Req), - {ok, Req, Opts}; + {ok, cowboy_req:reply(200, #{}, value_to_iodata(Value), Req), Opts}; echo(What, Req, Opts) -> F = binary_to_atom(What, latin1), Value = cowboy_req:F(Req), - cowboy_req:reply(200, #{}, value_to_iodata(Value), Req), - {ok, Req, Opts}. + {ok, cowboy_req:reply(200, #{}, value_to_iodata(Value), Req), Opts}. echo_arg(Arg0, Req, Opts) -> F = binary_to_atom(cowboy_req:binding(key, Req), latin1), @@ -52,8 +69,13 @@ echo_arg(Arg0, Req, Opts) -> undefined -> cowboy_req:F(Arg, Req); Default -> cowboy_req:F(Arg, Req, Default) end, - cowboy_req:reply(200, #{}, value_to_iodata(Value), Req), - {ok, Req, Opts}. + {ok, cowboy_req:reply(200, #{}, value_to_iodata(Value), Req), Opts}. + +read_body(Req0, Acc) -> + case cowboy_req:read_body(Req0) of + {ok, Data, Req} -> {ok, << Acc/binary, Data/binary >>, Req}; + {more, Data, Req} -> read_body(Req, << Acc/binary, Data/binary >>) + end. value_to_iodata(V) when is_integer(V) -> integer_to_binary(V); value_to_iodata(V) when is_atom(V) -> atom_to_binary(V, latin1); |