0
Fork 0
mirror of https://github.com/ninenines/cowboy.git synced 2025-07-14 12:20:24 +00:00

Make stream_error early_error reasons consistent

Now both HTTP/1.1 and HTTP/2 follow the documented format.
HTTP/1.1 was including an extra element containing the
StreamID before, which was unnecessary because it is also
given as argument to the callback.

HTTP/2 early_error will now include headers in its PartialReq.
This commit is contained in:
Loïc Hoguin 2019-10-03 15:42:58 +02:00
parent 57badc9082
commit 1ba48c58b1
No known key found for this signature in database
GPG key ID: 8A9DF795F6FED764
4 changed files with 41 additions and 13 deletions

View file

@ -314,7 +314,7 @@ do_early_error(Config) ->
ref := _,
pid := From,
streamid := 1,
reason := {stream_error, 1, protocol_error, _},
reason := {stream_error, protocol_error, _},
partial_req := #{},
resp_status := 400,
resp_headers := ExpectedRespHeaders,

View file

@ -248,6 +248,34 @@ do_crash_in_early_error_fatal(Config) ->
%% Confirm the connection gets closed.
gun_down(ConnPid).
early_error_stream_error_reason(Config) ->
doc("Confirm that the stream_error given to early_error/5 is consistent between protocols."),
Self = self(),
ConnPid = gun_open(Config),
%% We must use different solutions to hit early_error with a stream_error
%% reason in both protocols.
{Method, Headers, Status, Error} = case config(protocol, Config) of
http -> {<<"GET">>, [{<<"host">>, <<"host:port">>}], 400, protocol_error};
http2 -> {<<"TRACE">>, [], 501, no_error}
end,
Ref = gun:request(ConnPid, Method, "/long_polling", [
{<<"accept-encoding">>, <<"gzip">>},
{<<"x-test-case">>, <<"early_error_stream_error_reason">>},
{<<"x-test-pid">>, pid_to_list(Self)}
|Headers], <<>>),
%% Confirm init/3 is NOT called. The error occurs before we reach this step.
receive {Self, _, init, _, _, _} -> error(init) after 1000 -> ok end,
%% Confirm terminate/3 is NOT called. We have no state to give to it.
receive {Self, _, terminate, _, _, _} -> error(terminate) after 1000 -> ok end,
%% Confirm early_error/5 is called.
Reason = receive {Self, _, early_error, _, R, _, _, _} -> R after 1000 -> error(timeout) end,
%% Confirm that the Reason is a {stream_error, Reason, Human}.
{stream_error, Error, HumanReadable} = Reason,
true = is_atom(HumanReadable),
%% Receive a 400 or 501 error response.
{response, fin, Status, _} = gun:await(ConnPid, Ref),
ok.
set_options_ignore_unknown(Config) ->
doc("Confirm that unknown options are ignored when using the set_options commands."),
Self = self(),