mirror of
https://github.com/ninenines/cowboy.git
synced 2025-07-16 05:00:24 +00:00
Add cowboy_req:inform/2,3
User code can now send as many 1xx responses as necessary.
This commit is contained in:
parent
f4331f7c16
commit
f3d6b05b86
11 changed files with 206 additions and 1 deletions
|
@ -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">> ->
|
||||
|
|
|
@ -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),
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue