111 lines
3.1 KiB
Erlang
111 lines
3.1 KiB
Erlang
%% @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([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.
|