Advertisement
Guest User

Untitled

a guest
Aug 30th, 2011
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Erlang 1.77 KB | None | 0 0
  1. -module (gtd).
  2. -export ([start/0, run/0, worker/1]).
  3.  
  4. -define(TCP_OPTIONS, [{packet, 0}, {active, false}, {reuseaddr, true}, {nodelay, false}]).
  5. -define(PORT_NO, 5000).
  6.  
  7. receive_loop(ListenSocket) ->
  8.     Worker = spawn(gtd,worker,[gen_tcp:accept(ListenSocket)]),
  9.     receive_loop(ListenSocket).
  10.  
  11. run() ->
  12.     case gen_tcp:listen(?PORT_NO,?TCP_OPTIONS) of
  13.         {ok, ListenSocket} ->
  14.             io:format("Listening on ~p...~n",[?PORT_NO]),
  15.             receive_loop(ListenSocket),
  16.             io:format("Connection closed.~n"),
  17.             gen_tcp:close(ListenSocket);
  18.         {error, Reason} ->
  19.             io:format("Failed to listen on ~p: ~p~n",[?PORT_NO,Reason])
  20.     end.
  21.  
  22. parse_request(Request)->
  23.     {ok,TopHeader,Rest} = erlang:decode_packet(http,Request,[]),
  24.     ParsedHeaders = parse_headers(erlang:decode_packet(httph,Rest,[]),[]),
  25.     {TopHeader,ParsedHeaders}.
  26.  
  27. parse_headers({ok, http_eoh, Rest},Parsed_Headers)->
  28.     Parsed_Headers;
  29. parse_headers({ok,Header,Rest},Parsed_Headers) ->
  30.     parse_headers(erlang:decode_packet(httph,Rest,[]),[Header | Parsed_Headers]).      
  31.  
  32. worker({error, Reason}) ->
  33.     {error, Reason};
  34. worker({ok, TcpSocket}) ->
  35.     {ok,Request} = gen_tcp:recv(TcpSocket,0),
  36.     {{http_request, Method,{abs_path, Path},Version},Headers} = parse_request(list_to_binary(Request)),
  37.     case Method of
  38.         'PUT' ->
  39.             {ok,Data} = gen_tcp:recv(TcpSocket,0);
  40.         'POST' ->
  41.             {ok,Data} = gen_tcp:recv(TcpSocket,0);
  42.         'GET' ->
  43.             Data = [];
  44.         'DELETE' ->
  45.             Data = []
  46.     end,
  47.     RequestObject = {{http_request, Method,{abs_path, Path},Version},Headers,Data},
  48.     io:format("Worker ~p started for request ~p.~n",[self(),RequestObject]),
  49.     Response = io_lib:format("HTTP/1.1 200 OK~n~nMethod: ~p~nPath: ~p~nHeaders: ~p~nData:~p",[Method,Path,Headers,Data]),
  50.     gen_tcp:send(TcpSocket,Response),
  51.     gen_tcp:close(TcpSocket).
  52.  
  53. start()->
  54.     spawn(gtd,run,[]).
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement