aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLoïc Hoguin <[email protected]>2016-06-20 13:52:52 +0200
committerLoïc Hoguin <[email protected]>2016-06-20 13:52:52 +0200
commitc9972c6b3a9f42a5ef766ed82abbab8acb58b4db (patch)
treee991725fb57bcc886660c4a44639b2153bbc1f95
parentfa13cb4459a8010839db118618a91335179f2978 (diff)
downloadgun-c9972c6b3a9f42a5ef766ed82abbab8acb58b4db.tar.gz
gun-c9972c6b3a9f42a5ef766ed82abbab8acb58b4db.tar.bz2
gun-c9972c6b3a9f42a5ef766ed82abbab8acb58b4db.zip
Send proper scheme for HTTP/2
Clear connections send "http" and TLS connections "https".
-rw-r--r--src/gun_http2.erl13
1 files changed, 7 insertions, 6 deletions
diff --git a/src/gun_http2.erl b/src/gun_http2.erl
index 2b7dbc0..1f852e2 100644
--- a/src/gun_http2.erl
+++ b/src/gun_http2.erl
@@ -200,10 +200,9 @@ keepalive(State=#http2_state{socket=Socket, transport=Transport}) ->
Transport:send(Socket, cow_http2:ping(0)),
State.
-%% @todo Shouldn't always be HTTPS scheme. We need to properly keep track of it.
request(State=#http2_state{socket=Socket, transport=Transport, encode_state=EncodeState0,
stream_id=StreamID}, StreamRef, Method, Host, Port, Path, Headers) ->
- {HeaderBlock, EncodeState} = prepare_headers(EncodeState0, Method, Host, Port, Path, Headers),
+ {HeaderBlock, EncodeState} = prepare_headers(EncodeState0, Transport, Method, Host, Port, Path, Headers),
IsFin = case (false =/= lists:keyfind(<<"content-type">>, 1, Headers))
orelse (false =/= lists:keyfind(<<"content-length">>, 1, Headers)) of
true -> nofin;
@@ -214,12 +213,11 @@ request(State=#http2_state{socket=Socket, transport=Transport, encode_state=Enco
State#http2_state{stream_id=StreamID + 2, encode_state=EncodeState}).
%% @todo Handle Body > 16MB. (split it out into many frames)
-%% @todo Shouldn't always be HTTPS scheme. We need to properly keep track of it.
request(State=#http2_state{socket=Socket, transport=Transport, encode_state=EncodeState0,
stream_id=StreamID}, StreamRef, Method, Host, Port, Path, Headers0, Body) ->
Headers = lists:keystore(<<"content-length">>, 1, Headers0,
{<<"content-length">>, integer_to_binary(iolist_size(Body))}),
- {HeaderBlock, EncodeState} = prepare_headers(EncodeState0, Method, Host, Port, Path, Headers),
+ {HeaderBlock, EncodeState} = prepare_headers(EncodeState0, Transport, Method, Host, Port, Path, Headers),
Transport:send(Socket, [
cow_http2:headers(StreamID, nofin, HeaderBlock),
cow_http2:data(StreamID, fin, Body)
@@ -227,7 +225,7 @@ request(State=#http2_state{socket=Socket, transport=Transport, encode_state=Enco
new_stream(StreamID, StreamRef, nofin, fin,
State#http2_state{stream_id=StreamID + 2, encode_state=EncodeState}).
-prepare_headers(EncodeState, Method, Host, Port, Path, Headers0) ->
+prepare_headers(EncodeState, Transport, Method, Host, Port, Path, Headers0) ->
%% @todo We also must remove any header found in the connection header.
Headers1 =
lists:keydelete(<<"host">>, 1,
@@ -238,7 +236,10 @@ prepare_headers(EncodeState, Method, Host, Port, Path, Headers0) ->
lists:keydelete(<<"upgrade">>, 1, Headers0)))))),
Headers = [
{<<":method">>, Method},
- {<<":scheme">>, <<"https">>},
+ {<<":scheme">>, case Transport:secure() of
+ true -> <<"https">>;
+ false -> <<"http">>
+ end},
{<<":authority">>, [Host, $:, integer_to_binary(Port)]},
{<<":path">>, Path}
|Headers1],