diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/cowboy.erl | 7 | ||||
-rw-r--r-- | src/cowboy_spdy.erl | 13 |
2 files changed, 14 insertions, 6 deletions
diff --git a/src/cowboy.erl b/src/cowboy.erl index 16445e1..abc7911 100644 --- a/src/cowboy.erl +++ b/src/cowboy.erl @@ -39,7 +39,7 @@ %% @doc Start an HTTP listener. -spec start_http(ranch:ref(), non_neg_integer(), ranch_tcp:opts(), - cowboy_protocol:opts()) -> {ok, pid()}. + cowboy_protocol:opts()) -> {ok, pid()} | {error, any()}. start_http(Ref, NbAcceptors, TransOpts, ProtoOpts) when is_integer(NbAcceptors), NbAcceptors > 0 -> ranch:start_listener(Ref, NbAcceptors, @@ -47,14 +47,15 @@ start_http(Ref, NbAcceptors, TransOpts, ProtoOpts) %% @doc Start an HTTPS listener. -spec start_https(ranch:ref(), non_neg_integer(), ranch_ssl:opts(), - cowboy_protocol:opts()) -> {ok, pid()}. + cowboy_protocol:opts()) -> {ok, pid()} | {error, any()}. start_https(Ref, NbAcceptors, TransOpts, ProtoOpts) when is_integer(NbAcceptors), NbAcceptors > 0 -> ranch:start_listener(Ref, NbAcceptors, ranch_ssl, TransOpts, cowboy_protocol, ProtoOpts). %% @doc Start a SPDY listener. --spec start_spdy(any(), non_neg_integer(), any(), any()) -> {ok, pid()}. +-spec start_spdy(ranch:ref(), non_neg_integer(), ranch_ssl:opts(), + cowboy_spdy:opts()) -> {ok, pid()} | {error, any()}. start_spdy(Ref, NbAcceptors, TransOpts, ProtoOpts) when is_integer(NbAcceptors), NbAcceptors > 0 -> TransOpts2 = [ diff --git a/src/cowboy_spdy.erl b/src/cowboy_spdy.erl index d605331..182e6da 100644 --- a/src/cowboy_spdy.erl +++ b/src/cowboy_spdy.erl @@ -221,12 +221,14 @@ system_code_change(Misc, _, _, _) -> {ok, Misc}. %% We do not support SYN_STREAM with FLAG_UNIDIRECTIONAL set. -control_frame(State, << _:38, 1:1, _:26, StreamID:31, _/bits >>) -> +control_frame(State, << 1:1, 3:15, 1:16, _:6, 1:1, _:26, + StreamID:31, _/bits >>) -> rst_stream(State, StreamID, internal_error), loop(State); %% We do not support Associated-To-Stream-ID and CREDENTIAL Slot. -control_frame(State, << _:65, StreamID:31, _:1, AssocToStreamID:31, - _:8, Slot:8, _/bits >>) when AssocToStreamID =/= 0; Slot =/= 0 -> +control_frame(State, << 1:1, 3:15, 1:16, _:33, StreamID:31, _:1, + AssocToStreamID:31, _:8, Slot:8, _/bits >>) + when AssocToStreamID =/= 0; Slot =/= 0 -> rst_stream(State, StreamID, internal_error), loop(State); %% SYN_STREAM @@ -256,6 +258,9 @@ control_frame(State=#state{middlewares=Middlewares, env=Env, loop(State#state{last_streamid=StreamID, children=[#child{streamid=StreamID, pid=Pid, input=IsFin, output=nofin}|Children]}); + {error, badname} -> + rst_stream(State, StreamID, protocol_error), + loop(State#state{last_streamid=StreamID}); {error, special} -> rst_stream(State, StreamID, protocol_error), loop(State#state{last_streamid=StreamID}) @@ -353,6 +358,8 @@ syn_stream_headers(<<>>, 0, Acc, Special=#special_headers{ true -> {ok, lists:reverse(Acc), Special} end; +syn_stream_headers(<< 0:32, _Rest/bits >>, _NbHeaders, _Acc, _Special) -> + {error, badname}; syn_stream_headers(<< NameLen:32, Rest/bits >>, NbHeaders, Acc, Special) -> << Name:NameLen/binary, ValueLen:32, Rest2/bits >> = Rest, << Value:ValueLen/binary, Rest3/bits >> = Rest2, |