echo_h.erl 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. %% This module echoes back the value the test is interested in.
  2. -module(echo_h).
  3. -export([init/2]).
  4. init(Req, Opts) ->
  5. case cowboy_req:binding(arg, Req) of
  6. undefined ->
  7. echo(cowboy_req:binding(key, Req), Req, Opts);
  8. Arg ->
  9. echo_arg(Arg, Req, Opts)
  10. end.
  11. echo(<<"body">>, Req0, Opts) ->
  12. {ok, Body, Req} = cowboy_req:read_body(Req0),
  13. cowboy_req:reply(200, #{}, Body, Req),
  14. {ok, Req, Opts};
  15. echo(<<"uri">>, Req, Opts) ->
  16. Value = case cowboy_req:path_info(Req) of
  17. [<<"origin">>] -> cowboy_req:uri(Req, #{host => undefined});
  18. [<<"protocol-relative">>] -> cowboy_req:uri(Req, #{scheme => undefined});
  19. [<<"no-qs">>] -> cowboy_req:uri(Req, #{qs => undefined});
  20. [<<"no-path">>] -> cowboy_req:uri(Req, #{path => undefined, qs => undefined});
  21. [<<"set-port">>] -> cowboy_req:uri(Req, #{port => 123});
  22. [] -> cowboy_req:uri(Req)
  23. end,
  24. cowboy_req:reply(200, #{}, Value, Req),
  25. {ok, Req, Opts};
  26. echo(<<"match">>, Req, Opts) ->
  27. [Type|Fields0] = cowboy_req:path_info(Req),
  28. Fields = [binary_to_atom(F, latin1) || F <- Fields0],
  29. Value = case Type of
  30. <<"qs">> -> cowboy_req:match_qs(Fields, Req);
  31. <<"cookies">> -> cowboy_req:match_cookies(Fields, Req)
  32. end,
  33. cowboy_req:reply(200, #{}, value_to_iodata(Value), Req),
  34. {ok, Req, Opts};
  35. echo(What, Req, Opts) ->
  36. F = binary_to_atom(What, latin1),
  37. Value = cowboy_req:F(Req),
  38. cowboy_req:reply(200, #{}, value_to_iodata(Value), Req),
  39. {ok, Req, Opts}.
  40. echo_arg(Arg0, Req, Opts) ->
  41. F = binary_to_atom(cowboy_req:binding(key, Req), latin1),
  42. Arg = case F of
  43. binding -> binary_to_atom(Arg0, latin1);
  44. _ -> Arg0
  45. end,
  46. Value = case cowboy_req:binding(default, Req) of
  47. undefined -> cowboy_req:F(Arg, Req);
  48. Default -> cowboy_req:F(Arg, Req, Default)
  49. end,
  50. cowboy_req:reply(200, #{}, value_to_iodata(Value), Req),
  51. {ok, Req, Opts}.
  52. value_to_iodata(V) when is_integer(V) -> integer_to_binary(V);
  53. value_to_iodata(V) when is_atom(V) -> atom_to_binary(V, latin1);
  54. value_to_iodata(V) when is_list(V); is_tuple(V); is_map(V) -> io_lib:format("~p", [V]);
  55. value_to_iodata(V) -> V.