%% @author Bob Ippolito %% @copyright 2007 Mochi Media, Inc. %% @doc Start and stop the MochiWeb server. -module(mochiweb). -author('bob@mochimedia.com'). -export([start/0, stop/0]). -export([new_request/1, new_response/1]). -export([all_loaded/0, all_loaded/1, reload/0]). -export([test/0]). %% @spec start() -> ok %% @doc Start the MochiWeb server. start() -> ensure_started(crypto), application:start(mochiweb). %% @spec stop() -> ok %% @doc Stop the MochiWeb server. stop() -> Res = application:stop(mochiweb), application:stop(crypto), Res. %% @spec test() -> ok %% @doc Run all of the tests for MochiWeb. test() -> mochiweb_util:test(), mochiweb_headers:test(), mochiweb_cookies:test(), mochihex:test(), mochinum:test(), mochijson:test(), mochiweb_charref:test(), mochiweb_html:test(), mochifmt:test(), test_request(), ok. 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()). %% @spec new_request({Socket, Request, Headers}) -> MochiWebRequest %% @doc Return a mochiweb_request data structure. new_request({Socket, {Method, {abs_path, Uri}, Version}, Headers}) -> mochiweb_request:new(Socket, Method, Uri, Version, mochiweb_headers:make(Headers)); % this case probably doesn't "exist". new_request({Socket, {Method, {absoluteURI, _Protocol, _Host, _Port, Uri}, Version}, Headers}) -> mochiweb_request:new(Socket, Method, Uri, Version, mochiweb_headers:make(Headers)); %% Request-URI is "*" %% From http://www.w3.org/Protocols/rfc2616/rfc2616-sec5.html#sec5.1.2 new_request({Socket, {Method, '*'=Uri, Version}, Headers}) -> mochiweb_request:new(Socket, Method, Uri, 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)). %% Internal API test_request() -> R = mochiweb_request:new(z, z, "/foo/bar/baz%20wibble+quux?qs=2", z, []), "/foo/bar/baz wibble quux" = R:get(path), ok. ensure_started(App) -> case application:start(App) of ok -> ok; {error, {already_started, App}} -> ok end.