diff options
author | juhlig <[email protected]> | 2019-06-06 17:52:34 +0200 |
---|---|---|
committer | Loïc Hoguin <[email protected]> | 2019-07-16 15:35:45 +0200 |
commit | 5b4e78fac483c5eb277fec4ab7e8c6a62821bf4b (patch) | |
tree | bb06aa4e6b00901da26e44f546f97f447e995f18 | |
parent | 7708fc77cd95768aef65bd0eb366ee300cc0515f (diff) | |
download | cowboy-5b4e78fac483c5eb277fec4ab7e8c6a62821bf4b.tar.gz cowboy-5b4e78fac483c5eb277fec4ab7e8c6a62821bf4b.tar.bz2 cowboy-5b4e78fac483c5eb277fec4ab7e8c6a62821bf4b.zip |
Make Cowboy compatible with upcoming Ranch 2.0
-rw-r--r-- | src/cowboy_clear.erl | 7 | ||||
-rw-r--r-- | src/cowboy_http.erl | 18 | ||||
-rw-r--r-- | src/cowboy_http2.erl | 8 | ||||
-rw-r--r-- | src/cowboy_tls.erl | 17 |
4 files changed, 32 insertions, 18 deletions
diff --git a/src/cowboy_clear.erl b/src/cowboy_clear.erl index 7bb1a35..0af734f 100644 --- a/src/cowboy_clear.erl +++ b/src/cowboy_clear.erl @@ -15,11 +15,18 @@ -module(cowboy_clear). -behavior(ranch_protocol). +-export([start_link/3]). -export([start_link/4]). -export([connection_process/4]). +%% Ranch 1. -spec start_link(ranch:ref(), inet:socket(), module(), cowboy:opts()) -> {ok, pid()}. start_link(Ref, _Socket, Transport, Opts) -> + start_link(Ref, Transport, Opts). + +%% Ranch 2. +-spec start_link(ranch:ref(), module(), cowboy:opts()) -> {ok, pid()}. +start_link(Ref, Transport, Opts) -> Pid = proc_lib:spawn_link(?MODULE, connection_process, [self(), Ref, Transport, Opts]), {ok, Pid}. diff --git a/src/cowboy_http.erl b/src/cowboy_http.erl index 15a08db..5b07a4c 100644 --- a/src/cowboy_http.erl +++ b/src/cowboy_http.erl @@ -196,24 +196,24 @@ before_loop(State=#state{socket=Socket, transport=Transport}, Buffer) -> loop(State=#state{parent=Parent, socket=Socket, transport=Transport, opts=Opts, timer=TimerRef, children=Children, in_streamid=InStreamID, last_streamid=LastStreamID, streams=Streams}, Buffer) -> - {OK, Closed, Error} = Transport:messages(), + Messages = Transport:messages(), InactivityTimeout = maps:get(inactivity_timeout, Opts, 300000), receive %% Discard data coming in after the last request %% we want to process was received fully. - {OK, Socket, _} when InStreamID > LastStreamID -> + {OK, Socket, _} when OK =:= element(1, Messages), InStreamID > LastStreamID -> before_loop(State, Buffer); %% Socket messages. - {OK, Socket, Data} -> + {OK, Socket, Data} when OK =:= element(1, Messages) -> %% Only reset the timeout if it is idle_timeout (active streams). State1 = case Streams of [] -> State; _ -> set_timeout(State) end, parse(<< Buffer/binary, Data/binary >>, State1); - {Closed, Socket} -> + {Closed, Socket} when Closed =:= element(2, Messages) -> terminate(State, {socket_error, closed, 'The socket has been closed.'}); - {Error, Socket, Reason} -> + {Error, Socket, Reason} when Error =:= element(3, Messages) -> terminate(State, {socket_error, Reason, 'An error has occurred on the socket.'}); %% Timeouts. {timeout, Ref, {shutdown, Pid}} -> @@ -1406,17 +1406,17 @@ terminate_linger(State=#state{socket=Socket, transport=Transport, opts=Opts}) -> end. terminate_linger_loop(State=#state{socket=Socket, transport=Transport}, TimerRef) -> - {OK, Closed, Error} = Transport:messages(), + Messages = Transport:messages(), %% We may already have a message in the mailbox when we do this %% but it's OK because we are shutting down anyway. case Transport:setopts(Socket, [{active, once}]) of ok -> receive - {OK, Socket, _} -> + {OK, Socket, _} when OK =:= element(1, Messages) -> terminate_linger_loop(State, TimerRef); - {Closed, Socket} -> + {Closed, Socket} when Closed =:= element(2, Messages) -> ok; - {Error, Socket, _} -> + {Error, Socket, _} when Error =:= element(3, Messages) -> ok; {timeout, TimerRef, linger_timeout} -> ok; diff --git a/src/cowboy_http2.erl b/src/cowboy_http2.erl index 36aea0c..3f45670 100644 --- a/src/cowboy_http2.erl +++ b/src/cowboy_http2.erl @@ -169,15 +169,15 @@ loop(State=#state{parent=Parent, socket=Socket, transport=Transport, opts=Opts, timer=TimerRef, children=Children}, Buffer) -> %% @todo This should only be called when data was read. Transport:setopts(Socket, [{active, once}]), - {OK, Closed, Error} = Transport:messages(), + Messages = Transport:messages(), InactivityTimeout = maps:get(inactivity_timeout, Opts, 300000), receive %% Socket messages. - {OK, Socket, Data} -> + {OK, Socket, Data} when OK =:= element(1, Messages) -> parse(set_timeout(State), << Buffer/binary, Data/binary >>); - {Closed, Socket} -> + {Closed, Socket} when Closed =:= element(2, Messages) -> terminate(State, {socket_error, closed, 'The socket has been closed.'}); - {Error, Socket, Reason} -> + {Error, Socket, Reason} when Error =:= element(3, Messages) -> terminate(State, {socket_error, Reason, 'An error has occurred on the socket.'}); %% System messages. {'EXIT', Parent, Reason} -> diff --git a/src/cowboy_tls.erl b/src/cowboy_tls.erl index 864a613..c049ecb 100644 --- a/src/cowboy_tls.erl +++ b/src/cowboy_tls.erl @@ -15,17 +15,24 @@ -module(cowboy_tls). -behavior(ranch_protocol). +-export([start_link/3]). -export([start_link/4]). --export([connection_process/5]). +-export([connection_process/4]). +%% Ranch 1. -spec start_link(ranch:ref(), ssl:sslsocket(), module(), cowboy:opts()) -> {ok, pid()}. -start_link(Ref, Socket, Transport, Opts) -> +start_link(Ref, _Socket, Transport, Opts) -> + start_link(Ref, Transport, Opts). + +%% Ranch 2. +-spec start_link(ranch:ref(), module(), cowboy:opts()) -> {ok, pid()}. +start_link(Ref, Transport, Opts) -> Pid = proc_lib:spawn_link(?MODULE, connection_process, - [self(), Ref, Socket, Transport, Opts]), + [self(), Ref, Transport, Opts]), {ok, Pid}. --spec connection_process(pid(), ranch:ref(), ssl:sslsocket(), module(), cowboy:opts()) -> ok. -connection_process(Parent, Ref, Socket, Transport, Opts) -> +-spec connection_process(pid(), ranch:ref(), module(), cowboy:opts()) -> ok. +connection_process(Parent, Ref, Transport, Opts) -> ProxyInfo = case maps:get(proxy_header, Opts, false) of true -> {ok, ProxyInfo0} = ranch:recv_proxy_header(Ref, 1000), |