diff options
Diffstat (limited to 'src/catlfish_web.erl')
-rw-r--r-- | src/catlfish_web.erl | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/src/catlfish_web.erl b/src/catlfish_web.erl new file mode 100644 index 0000000..cdc1a39 --- /dev/null +++ b/src/catlfish_web.erl @@ -0,0 +1,48 @@ +%%% Copyright (c) 2014, NORDUnet A/S. +%%% See LICENSE for licensing information. + +-module(catlfish_web). +-export([start/2, stop/0, loop/2]). + +start(Options, Module) -> + Loop = fun (Req) -> + ?MODULE:loop(Req, Module) + end, + mochiweb_http:start([{name, ?MODULE}, {loop, Loop} | Options]). + +stop() -> + mochiweb_http:stop(?MODULE). + +loop(Req, Module) -> + "/" ++ Path = Req:get(path), + try + case Req:get(method) of + 'GET' -> + Query = Req:parse_qs(), + lager:debug("GET ~p ~p", [Path, Query]), + Result = Module:request(get, Path, Query), + case Result of + none -> + Req:respond({404, [{"Content-Type", "text/plain"}], "Page not found"}); + _ -> + Req:respond(Result) + end; + 'POST' -> + Body = Req:recv_body(), + lager:debug("POST ~p ~p", [Path, Body]), + Result = Module:request(post, Path, Body), + case Result of + none -> + Req:respond({404, [{"Content-Type", "text/plain"}], "Page not found"}); + _ -> + Req:respond(Result) + end; + _ -> + Req:respond({501, [], []}) + end + catch + Type:What -> + lager:error("Crash in ~p for path ~p: ~p ~n~p~n~p~n", [Module, Path, Type, What, erlang:get_stacktrace()]), + Req:respond({500, [{"Content-Type", "text/plain"}], + "Internal Server Error\n"}) + end. |