--- Revision None +++ Revision 306437326561 @@ -0,0 +1,65 @@ +%% @author author +%% @copyright YYYY author. + +%% @doc Web server for myapp. + +-module(myapp_web). +-author('author '). + +-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), + case Req:get(method) of + Method when Method =:= 'GET'; Method =:= 'HEAD' -> + case Path of + "captcha" -> + {CodeHex, BinPng} = mycaptcha:new(), + + Cookie = mochiweb_cookies:cookie("cap", CodeHex, []), + + Req:ok({"image/png", [Cookie], [BinPng]}); + + _ -> + Req:serve_file(Path, DocRoot) + end; + 'POST' -> + case Path of + "captcha" -> + CodeHex = Req:get_cookie_value("cap"), + DataIn = Req:parse_post(), + CapCode = proplists:get_value("capCode", DataIn), + + case mycaptcha:check(CodeHex, CapCode) of + true -> + %% a cool one + Req:ok({"text/html", [], ["

Cool!

"]}); + false -> + %% redirection + Req:respond({302, [{"Location", "/"}, {"Content-Type", "text/html; charset=UTF-8"}],""}) + end; + + + _ -> + Req:not_found() + end; + _ -> + Req:respond({501, [], []}) + end. + +%% Internal API + +get_option(Option, Options) -> + {proplists:get_value(Option, Options), proplists:delete(Option, Options)}.