-module(web_server). -export([cover_start/0, cover_stop/0, start/1, stop/1]). -import(http_driver, [classify/1, header/1]). -import(lists, [map/2]). %% To start this server %% give the command %% webserver.sh start Port -- start a permanent server %% webserver.sh debug Port -- start a server in debugging mode %% webserver.sh stop -- stop a permanent server start([A]) -> start_on_port(list_to_integer(atom_to_list(A))). stop([Node]) -> io:format("Stop:~p~n",[Node]), case net_adm:ping(Node) of pong -> ok; pang -> io:format("There is no node with this name~n") end, rpc:cast(Node, init, stop, []), init:stop(). %% To run a coverage analysis %% 1) start erlang %% 2) run web_server:cover_start() %% 3) run the web server for a while %% 4) run web_server:cover_stop() cover_start() -> cover:start(), map(fun(I) -> cover:compile(I) end, mods()), %% The next line *must* use the : form !!!!! web_server:start(['4501']). cover_stop() -> map(fun(I) -> cover:analyse_to_file(I) end, mods()), cover:stop(), erlang:halt(). mods() -> [web_server, http_driver, tcp_server]. start_on_port(Port) -> spawn_link(fun() -> server(Port) end). server(Port) -> S = self(), process_flag(trap_exit, true), http_driver:start(Port, fun(Client) -> server(Client, S) end, 15), loop(). loop() -> receive Any -> io:format("server:~p~n",[Any]), loop() end. server(Client, Master) -> receive {Client, closed} -> true; {Client, Request} -> Response = generate_response(Request), Client ! {self(), Response}, server(Client, Master) after 5000 -> true end. generate_response({_, Vsn, F, Args, Env}) -> F1 = "." ++ F, case file:read_file(F1) of {ok, Bin} -> case classify(F) of html -> {header(html),[Bin]}; jpg -> {header(jpg),[Bin]}; gif -> {header(jpg),[Bin]}; _ -> {header(text),[body("white"),"
",Bin,"
"]} end; _ -> show({no_such_file,F,args,Args,cwd,file:get_cwd()}) end. body(X) -> [""]. show(X) -> {header(text),[body("white"),"
",
		   quote_lt(lists:flatten(io_lib:format("~p~n",[X]))),
		   "
"]}. quote_lt([$<|T]) -> "<" ++ quote_lt(T); quote_lt([H|T]) -> [H|quote_lt(T)]; quote_lt([]) -> [].