aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorFredrik Enestad <[email protected]>2019-01-22 17:50:40 +0100
committerLoïc Hoguin <[email protected]>2019-04-01 15:04:33 +0200
commit7ff9e963b89c50f29a33e3e72bbea16d0f26affa (patch)
tree16565ff4c2b501e9df67b5923ba760f3ae30dd6d /src
parent705fa9755fb683673c9fd089a22f25163cb8e520 (diff)
downloadcowboy-7ff9e963b89c50f29a33e3e72bbea16d0f26affa.tar.gz
cowboy-7ff9e963b89c50f29a33e3e72bbea16d0f26affa.tar.bz2
cowboy-7ff9e963b89c50f29a33e3e72bbea16d0f26affa.zip
Fallback to host header if authority is missing
Diffstat (limited to 'src')
-rw-r--r--src/cowboy_http2.erl17
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),