Current section

Files

Jump to
mochicow src mochicow_protocol.erl
Raw

src/mochicow_protocol.erl

%M% -*- tab-width: 4;erlang-indent-level: 4;indent-tabs-mode: nil -*-
%%% ex: ft=erlang ts=4 sw=4 et
%%%
%%% This file is part of mochicow released under the MIT license.
%%% See the NOTICE for more information.
-module(mochicow_protocol).
-behaviour(ranch_protocol).
-export([start_link/4]).
-export([remove_connection/1]).
-export([init/4]).
-export([mochiweb_socket/2]).
-export([ensure_started/1]).
%% @doc Start a mochiweb process
-spec start_link(pid(), inet:socket(), module(), any()) -> {ok, pid()}.
start_link(Ref, Socket, Transport, Opts) ->
ok = ensure_started(mochiweb_clock),
Pid = spawn_link(?MODULE, init, [Ref, Socket, Transport, Opts]),
{ok, Pid}.
%% @doc remove the connection
remove_connection(MochiReq) ->
Ref = proplists:get_value(ranch_ref, MochiReq:get(opts)),
ranch:remove_connection(Ref).
%% @private
-spec init(pid(), inet:socket(), module(), any()) -> ok | none().
init(Ref, Socket, Transport, Opts) ->
{loop, HttpLoop} = proplists:lookup(loop, Opts),
ok = ranch:accept_ack(Ref),
mochiweb_http:loop(mochiweb_socket(Transport, Socket), [{ranch_ref, Ref} |Opts], HttpLoop).
mochiweb_socket(ranch_ssl, Socket) -> {ssl, Socket};
mochiweb_socket(_Transport, Socket) -> Socket.
ensure_started(M) ->
case M:start() of
{ok, _Pid} -> ok;
{error, {already_started, _Pid}} -> ok
end.