/src/mochiweb.erl
http://github.com/basho/mochiweb · Erlang · 101 lines · 55 code · 11 blank · 35 comment · 1 complexity · 7300b773552c4e1404a179f33ef1d2a8 MD5 · raw file
- %% @author Bob Ippolito <bob@mochimedia.com>
- %% @copyright 2007 Mochi Media, Inc.
- %%
- %% Permission is hereby granted, free of charge, to any person obtaining a
- %% copy of this software and associated documentation files (the "Software"),
- %% to deal in the Software without restriction, including without limitation
- %% the rights to use, copy, modify, merge, publish, distribute, sublicense,
- %% and/or sell copies of the Software, and to permit persons to whom the
- %% Software is furnished to do so, subject to the following conditions:
- %%
- %% The above copyright notice and this permission notice shall be included in
- %% all copies or substantial portions of the Software.
- %%
- %% THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- %% IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- %% FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- %% THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- %% LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- %% FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- %% DEALINGS IN THE SOFTWARE.
- %% @doc Start and stop the MochiWeb server.
- -module(mochiweb).
- -author('bob@mochimedia.com').
- -export([new_request/1, new_response/1]).
- -export([all_loaded/0, all_loaded/1, reload/0]).
- -export([ensure_started/1]).
- reload() ->
- [c:l(Module) || Module <- all_loaded()].
- all_loaded() ->
- all_loaded(filename:dirname(code:which(?MODULE))).
- all_loaded(Base) when is_atom(Base) ->
- [];
- all_loaded(Base) ->
- FullBase = Base ++ "/",
- F = fun ({_Module, Loaded}, Acc) when is_atom(Loaded) ->
- Acc;
- ({Module, Loaded}, Acc) ->
- case lists:prefix(FullBase, Loaded) of
- true ->
- [Module | Acc];
- false ->
- Acc
- end
- end,
- lists:foldl(F, [], code:all_loaded()).
- %% See the erlang:decode_packet/3 docs for the full type
- -spec uri(HttpUri :: term()) -> string().
- uri({abs_path, Uri}) ->
- Uri;
- %% TODO:
- %% This makes it hard to implement certain kinds of proxies with mochiweb,
- %% perhaps a field could be added to the mochiweb_request record to preserve
- %% this information in raw_path.
- uri({absoluteURI, _Protocol, _Host, _Port, Uri}) ->
- Uri;
- %% From http://www.w3.org/Protocols/rfc2616/rfc2616-sec5.html#sec5.1.2
- uri('*') ->
- "*";
- %% Erlang decode_packet will return this for requests like `CONNECT host:port`
- uri({scheme, Hostname, Port}) ->
- Hostname ++ ":" ++ Port;
- uri(HttpString) when is_list(HttpString) ->
- HttpString.
- %% @spec new_request( {Socket, Request, Headers}
- %% | {Socket, Opts, Request, Headers} ) -> MochiWebRequest
- %% @doc Return a mochiweb_request data structure.
- new_request({Socket, {Method, HttpUri, Version}, Headers}) ->
- new_request({Socket, [], {Method, HttpUri, Version}, Headers});
- new_request({Socket, Opts, {Method, HttpUri, Version}, Headers}) ->
- mochiweb_request:new(Socket,
- Opts,
- Method,
- uri(HttpUri),
- Version,
- mochiweb_headers:make(Headers)).
- %% @spec new_response({Request, integer(), Headers}) -> MochiWebResponse
- %% @doc Return a mochiweb_response data structure.
- new_response({Request, Code, Headers}) ->
- mochiweb_response:new(Request,
- Code,
- mochiweb_headers:make(Headers)).
- %% @spec ensure_started(App::atom()) -> ok
- %% @doc Start the given App if it has not been started already.
- ensure_started(App) ->
- case application:start(App) of
- ok ->
- ok;
- {error, {already_started, App}} ->
- ok
- end.