From f3d6b05b863fe177a34a8a6ba48c5f263ef8cf82 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Hoguin?= Date: Sun, 29 Oct 2017 19:52:27 +0000 Subject: Add cowboy_req:inform/2,3 User code can now send as many 1xx responses as necessary. --- test/handlers/resp_h.erl | 31 +++++++++++++++++++++++++++++++ test/req_SUITE.erl | 41 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 72 insertions(+) (limited to 'test') diff --git a/test/handlers/resp_h.erl b/test/handlers/resp_h.erl index 9b94e3f..94c7f60 100644 --- a/test/handlers/resp_h.erl +++ b/test/handlers/resp_h.erl @@ -100,6 +100,37 @@ do(<<"delete_resp_header">>, Req0, Opts) -> Req = cowboy_req:delete_resp_header(<<"content-type">>, Req1), false = cowboy_req:has_resp_header(<<"content-type">>, Req), {ok, cowboy_req:reply(200, #{}, "OK", Req), Opts}; +do(<<"inform2">>, Req0, Opts) -> + case cowboy_req:binding(arg, Req0) of + <<"binary">> -> + cowboy_req:inform(<<"102 On my way">>, Req0); + <<"error">> -> + ct_helper:ignore(cowboy_req, inform, 3), + cowboy_req:inform(ok, Req0); + <<"twice">> -> + cowboy_req:inform(102, Req0), + cowboy_req:inform(102, Req0); + Status -> + cowboy_req:inform(binary_to_integer(Status), Req0) + end, + Req = cowboy_req:reply(200, Req0), + {ok, Req, Opts}; +do(<<"inform3">>, Req0, Opts) -> + Headers = #{<<"ext-header">> => <<"ext-value">>}, + case cowboy_req:binding(arg, Req0) of + <<"binary">> -> + cowboy_req:inform(<<"102 On my way">>, Headers, Req0); + <<"error">> -> + ct_helper:ignore(cowboy_req, inform, 3), + cowboy_req:inform(ok, Headers, Req0); + <<"twice">> -> + cowboy_req:inform(102, Headers, Req0), + cowboy_req:inform(102, Headers, Req0); + Status -> + cowboy_req:inform(binary_to_integer(Status), Headers, Req0) + end, + Req = cowboy_req:reply(200, Req0), + {ok, Req, Opts}; do(<<"reply2">>, Req0, Opts) -> Req = case cowboy_req:binding(arg, Req0) of <<"binary">> -> diff --git a/test/req_SUITE.erl b/test/req_SUITE.erl index 26ced62..2d1fe38 100644 --- a/test/req_SUITE.erl +++ b/test/req_SUITE.erl @@ -114,6 +114,30 @@ do_get_body(Path, Config) -> do_get_body(Path, Headers, Config) -> do_body("GET", Path, Headers, Config). +do_get_inform(Path, Config) -> + ConnPid = gun_open(Config), + Ref = gun:get(ConnPid, Path, [{<<"accept-encoding">>, <<"gzip">>}]), + case gun:await(ConnPid, Ref) of + {response, _, RespStatus, RespHeaders} -> + %% We don't care about the body. + gun:close(ConnPid), + {RespStatus, RespHeaders}; + {inform, InfoStatus, InfoHeaders} -> + {response, IsFin, RespStatus, RespHeaders} + = case gun:await(ConnPid, Ref) of + {inform, InfoStatus, InfoHeaders} -> + gun:await(ConnPid, Ref); + Response -> + Response + end, + {ok, RespBody} = case IsFin of + nofin -> gun:await_body(ConnPid, Ref); + fin -> {ok, <<>>} + end, + gun:close(ConnPid), + {InfoStatus, InfoHeaders, RespStatus, RespHeaders, do_decode(RespHeaders, RespBody)} + end. + do_decode(Headers, Body) -> case lists:keyfind(<<"content-encoding">>, 1, Headers) of {_, <<"gzip">>} -> zlib:gunzip(Body); @@ -703,6 +727,23 @@ delete_resp_header(Config) -> false = lists:keymember(<<"content-type">>, 1, Headers), ok. +inform2(Config) -> + doc("Informational response(s) without headers, followed by the real response."), + {102, [], 200, _, _} = do_get_inform("/resp/inform2/102", Config), + {102, [], 200, _, _} = do_get_inform("/resp/inform2/binary", Config), + {500, _} = do_get_inform("/resp/inform2/error", Config), + {102, [], 200, _, _} = do_get_inform("/resp/inform2/twice", Config), + ok. + +inform3(Config) -> + doc("Informational response(s) with headers, followed by the real response."), + Headers = [{<<"ext-header">>, <<"ext-value">>}], + {102, Headers, 200, _, _} = do_get_inform("/resp/inform3/102", Config), + {102, Headers, 200, _, _} = do_get_inform("/resp/inform3/binary", Config), + {500, _} = do_get_inform("/resp/inform3/error", Config), + {102, Headers, 200, _, _} = do_get_inform("/resp/inform3/twice", Config), + ok. + reply2(Config) -> doc("Response with default headers and no body."), {200, _, _} = do_get("/resp/reply2/200", Config), -- cgit v1.2.3