diff options
author | Fredrik Enestad <[email protected]> | 2019-01-22 17:50:40 +0100 |
---|---|---|
committer | Loïc Hoguin <[email protected]> | 2019-04-01 15:04:33 +0200 |
commit | 7ff9e963b89c50f29a33e3e72bbea16d0f26affa (patch) | |
tree | 16565ff4c2b501e9df67b5923ba760f3ae30dd6d /src/cowboy_http2.erl | |
parent | 705fa9755fb683673c9fd089a22f25163cb8e520 (diff) | |
download | cowboy-7ff9e963b89c50f29a33e3e72bbea16d0f26affa.tar.gz cowboy-7ff9e963b89c50f29a33e3e72bbea16d0f26affa.tar.bz2 cowboy-7ff9e963b89c50f29a33e3e72bbea16d0f26affa.zip |
Fallback to host header if authority is missing
Diffstat (limited to 'src/cowboy_http2.erl')
-rw-r--r-- | src/cowboy_http2.erl | 17 |
1 files changed, 14 insertions, 3 deletions
diff --git a/src/cowboy_http2.erl b/src/cowboy_http2.erl index 5070bd4..d6f80e6 100644 --- a/src/cowboy_http2.erl +++ b/src/cowboy_http2.erl @@ -315,9 +315,20 @@ headers_frame(State, StreamID, IsFin, Headers, PseudoHeaders=#{method := <<"TRACE">>}, _) -> early_error(State, StreamID, IsFin, Headers, PseudoHeaders, 501, 'The TRACE method is currently not implemented. (RFC7231 4.3.8)'); -headers_frame(State=#state{ref=Ref, peer=Peer, sock=Sock, cert=Cert, proxy_header=ProxyHeader}, - StreamID, IsFin, Headers, PseudoHeaders=#{method := Method, scheme := Scheme, - authority := Authority, path := PathWithQs}, BodyLen) -> +headers_frame(State, StreamID, IsFin, Headers, PseudoHeaders=#{authority := Authority}, BodyLen) -> + headers_frame_parse_host(State, StreamID, IsFin, Headers, PseudoHeaders, BodyLen, Authority); +headers_frame(State, StreamID, IsFin, Headers, PseudoHeaders, BodyLen) -> + case lists:keyfind(<<"host">>, 1, Headers) of + {_, Authority} -> + headers_frame_parse_host(State, StreamID, IsFin, Headers, PseudoHeaders, BodyLen, Authority); + _ -> + reset_stream(State, StreamID, {stream_error, protocol_error, + 'Requests translated from HTTP/1.1 must include a host header. (RFC7540 8.1.2.3, RFC7230 5.4)'}) + end. + +headers_frame_parse_host(State=#state{ref=Ref, peer=Peer, sock=Sock, cert=Cert, proxy_header=ProxyHeader}, + StreamID, IsFin, Headers, PseudoHeaders=#{method := Method, scheme := Scheme, path := PathWithQs}, + BodyLen, Authority) -> try cow_http_hd:parse_host(Authority) of {Host, Port0} -> Port = ensure_port(Scheme, Port0), |