From 57badc9082f4052f15bc3a3a432b1cfcee03c745 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Hoguin?= Date: Thu, 3 Oct 2019 11:56:39 +0200 Subject: Add HTTP/2 tests with responses with HTTP/1.1 specific headers --- test/handlers/resp_h.erl | 10 ++++++++++ test/rfc7540_SUITE.erl | 52 ++++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 60 insertions(+), 2 deletions(-) diff --git a/test/handlers/resp_h.erl b/test/handlers/resp_h.erl index bc76d56..5bd4c72 100644 --- a/test/handlers/resp_h.erl +++ b/test/handlers/resp_h.erl @@ -39,6 +39,16 @@ do(<<"set_resp_headers">>, Req0, Opts) -> <<"content-encoding">> => <<"compress">> }, Req0), {ok, cowboy_req:reply(200, #{}, "OK", Req), Opts}; +do(<<"set_resp_headers_http11">>, Req0, Opts) -> + Req = cowboy_req:set_resp_headers(#{ + <<"connection">> => <<"custom-header, close">>, + <<"custom-header">> => <<"value">>, + <<"keep-alive">> => <<"timeout=5, max=1000">>, + <<"proxy-connection">> => <<"close">>, + <<"transfer-encoding">> => <<"chunked">>, + <<"upgrade">> => <<"HTTP/1.1">> + }, Req0), + {ok, cowboy_req:reply(200, #{}, "OK", Req), Opts}; do(<<"resp_header_defined">>, Req0, Opts) -> Req1 = cowboy_req:set_resp_header(<<"content-type">>, <<"text/plain">>, Req0), <<"text/plain">> = cowboy_req:resp_header(<<"content-type">>, Req1), diff --git a/test/rfc7540_SUITE.erl b/test/rfc7540_SUITE.erl index ebd9341..595c6da 100644 --- a/test/rfc7540_SUITE.erl +++ b/test/rfc7540_SUITE.erl @@ -33,11 +33,11 @@ groups() -> [{clear, [parallel], Clear}, {tls, [parallel], TLS}]. init_per_group(Name = clear, Config) -> - cowboy_test:init_http(Name, #{ + [{protocol, http2}|cowboy_test:init_http(Name, #{ env => #{dispatch => cowboy_router:compile(init_routes(Config))}, %% Disable the DATA threshold for this test suite. stream_window_data_threshold => 0 - }, Config); + }, Config)]; init_per_group(Name = tls, Config) -> cowboy_test:init_http2(Name, #{ env => #{dispatch => cowboy_router:compile(init_routes(Config))}, @@ -3643,6 +3643,54 @@ reject_te_header_other_values(Config) -> % Transfer-Encoding, and Upgrade, even if they are not nominated by the % Connection header field. +response_dont_send_header_in_connection(Config) -> + doc("Intermediaries must remove HTTP/1.1 connection headers when " + "transforming an HTTP/1.1 messages to HTTP/2. The server must " + "not send them either. All headers listed in the connection " + "header must be removed. (RFC7540 8.1.2.2)"), + do_response_dont_send_http11_header(Config, <<"custom-header">>). + +response_dont_send_connection_header(Config) -> + doc("Intermediaries must remove HTTP/1.1 connection headers when " + "transforming an HTTP/1.1 messages to HTTP/2. The server must " + "not send them either. The connection header must be removed. (RFC7540 8.1.2.2)"), + do_response_dont_send_http11_header(Config, <<"connection">>). + +response_dont_send_keep_alive_header(Config) -> + doc("Intermediaries must remove HTTP/1.1 connection headers when " + "transforming an HTTP/1.1 messages to HTTP/2. The server must " + "not send them either. The keep-alive header must be removed " + "even if not listed in the connection header. (RFC7540 8.1.2.2)"), + do_response_dont_send_http11_header(Config, <<"keep-alive">>). + +response_dont_send_proxy_connection_header(Config) -> + doc("Intermediaries must remove HTTP/1.1 connection headers when " + "transforming an HTTP/1.1 messages to HTTP/2. The server must " + "not send them either. The proxy-connection header must be removed " + "even if not listed in the connection header. (RFC7540 8.1.2.2)"), + do_response_dont_send_http11_header(Config, <<"proxy-connection">>). + +response_dont_send_transfer_encoding_header(Config) -> + doc("Intermediaries must remove HTTP/1.1 connection headers when " + "transforming an HTTP/1.1 messages to HTTP/2. The server must " + "not send them either. The transfer-encoding header must be removed " + "even if not listed in the connection header. (RFC7540 8.1.2.2)"), + do_response_dont_send_http11_header(Config, <<"transfer-encoding">>). + +response_dont_send_upgrade_header(Config) -> + doc("Intermediaries must remove HTTP/1.1 connection headers when " + "transforming an HTTP/1.1 messages to HTTP/2. The server must " + "not send them either. The upgrade header must be removed " + "even if not listed in the connection header. (RFC7540 8.1.2.2)"), + do_response_dont_send_http11_header(Config, <<"upgrade">>). + +do_response_dont_send_http11_header(Config, Name) -> + ConnPid = gun_open(Config), + Ref = gun:get(ConnPid, "/resp/set_resp_headers_http11"), + {response, nofin, 200, Headers} = gun:await(ConnPid, Ref), + false = lists:keyfind(Name, 1, Headers), + ok. + reject_userinfo(Config) -> doc("An authority containing a userinfo component must be rejected " "with a PROTOCOL_ERROR stream error. (RFC7540 8.1.2.3, RFC7540 8.1.2.6)"), -- cgit v1.2.3