From 5b4e78fac483c5eb277fec4ab7e8c6a62821bf4b Mon Sep 17 00:00:00 2001 From: juhlig Date: Thu, 6 Jun 2019 17:52:34 +0200 Subject: Make Cowboy compatible with upcoming Ranch 2.0 --- src/cowboy_clear.erl | 7 +++++++ src/cowboy_http.erl | 18 +++++++++--------- src/cowboy_http2.erl | 8 ++++---- src/cowboy_tls.erl | 17 ++++++++++++----- 4 files changed, 32 insertions(+), 18 deletions(-) (limited to 'src') 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), -- cgit v1.2.3