summaryrefslogtreecommitdiff
path: root/src/catlfish_web.erl
diff options
context:
space:
mode:
Diffstat (limited to 'src/catlfish_web.erl')
-rw-r--r--src/catlfish_web.erl48
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.