blob: 7ffb44dbc615e7dd6ab424b30a8b80fbc7d44bb7 [file] [log] [blame]
%% @author {{author}}
%% @copyright {{year}} {{author}}
%% @doc Web server for {{appid}}.
-module({{appid}}_web).
-author("{{author}}").
-compile(tuple_calls).
-export([start/1, stop/0, loop/2]).
%% External API
start(Options) ->
{DocRoot, Options1} = get_option(docroot, Options),
Loop = fun (Req) ->
?MODULE:loop(Req, DocRoot)
end,
mochiweb_http:start([{name, ?MODULE}, {loop, Loop} | Options1]).
stop() ->
mochiweb_http:stop(?MODULE).
loop(Req, DocRoot) ->
"/" ++ Path = Req:get(path),
try
case Req:get(method) of
Method when Method =:= 'GET'; Method =:= 'HEAD' ->
case Path of
"hello_world" ->
Req:respond({200, [{"Content-Type", "text/plain"}],
"Hello world!\n"});
_ ->
Req:serve_file(Path, DocRoot)
end;
'POST' ->
case Path of
_ ->
Req:not_found()
end;
_ ->
Req:respond({501, [], []})
end
catch
Type:What ->
Report = ["web request failed",
{path, Path},
{type, Type}, {what, What},
{trace, erlang:get_stacktrace()}],
error_logger:error_report(Report),
Req:respond({500, [{"Content-Type", "text/plain"}],
"request failed, sorry\n"})
end.
%% Internal API
get_option(Option, Options) ->
{proplists:get_value(Option, Options), proplists:delete(Option, Options)}.
%%
%% Tests
%%
-ifdef(TEST).
-include_lib("eunit/include/eunit.hrl").
you_should_write_a_test() ->
?assertEqual(
"No, but I will!",
"Have you written any tests?"),
ok.
-endif.