| %% @author Bob Ippolito <bob@mochimedia.com> |
| %% @copyright 2007 Mochi Media, Inc. |
| |
| %% @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. |