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

HTTP/2 informational responses don't end the stream

This commit is contained in:
Loïc Hoguin 2018-04-23 15:49:34 +02:00
parent 9af8b0d23a
commit 8b9a09c9fe
No known key found for this signature in database
GPG key ID: 8A9DF795F6FED764
2 changed files with 22 additions and 1 deletions

View file

@ -534,7 +534,7 @@ commands(State, Stream, [{error_response, _, _, _}|Tail]) ->
commands(State, Stream, Tail);
%% Send an informational response.
commands(State0, Stream=#stream{local=idle}, [{inform, StatusCode, Headers}|Tail]) ->
State = send_headers(State0, Stream, StatusCode, Headers, fin),
State = send_headers(State0, Stream, StatusCode, Headers, nofin),
commands(State, Stream, Tail);
%% Send response headers.
%%

View file

@ -2767,6 +2767,27 @@ settings_initial_window_size_reject_overflow(Config) ->
% behavior. These MAY be treated by an implementation as being
% equivalent to INTERNAL_ERROR.
headers_informational_nofin(Config) ->
doc("Informational HEADERS frames must not have the END_STREAM flag set. (RFC7540 8.1)"),
{ok, Socket} = do_handshake(Config),
%% Send a HEADERS frame on an idle stream.
{HeadersBlock, _} = cow_hpack:encode([
{<<":method">>, <<"POST">>},
{<<":scheme">>, <<"http">>},
{<<":authority">>, <<"localhost">>}, %% @todo Correct port number.
{<<":path">>, <<"/echo/read_body">>},
{<<"expect">>, <<"100-continue">>},
{<<"content-length">>, <<"1000000">>}
]),
ok = gen_tcp:send(Socket, cow_http2:headers(1, nofin, HeadersBlock)),
%% Receive an informational HEADERS frame without the END_STREAM flag.
{ok, << Len:24, 1:8, 0:5, 1:1, 0:2, _:32 >>} = gen_tcp:recv(Socket, 9, 6000),
{ok, RespHeadersBlock} = gen_tcp:recv(Socket, Len, 6000),
%% Confirm it has a 100 status code.
{RespHeaders, _} = cow_hpack:decode(RespHeadersBlock),
{_, <<"100">>} = lists:keyfind(<<":status">>, 1, RespHeaders),
ok.
%% (RFC7540 8.1)
% A HEADERS frame (and associated CONTINUATION frames) can only appear
% at the start or end of a stream. An endpoint that receives a HEADERS