Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- -module (gtd).
- -export ([start/0, run/0, worker/1]).
- -define(TCP_OPTIONS, [{packet, 0}, {active, false}, {reuseaddr, true}, {nodelay, false}]).
- -define(PORT_NO, 5000).
- receive_loop(ListenSocket) ->
- Worker = spawn(gtd,worker,[gen_tcp:accept(ListenSocket)]),
- receive_loop(ListenSocket).
- run() ->
- case gen_tcp:listen(?PORT_NO,?TCP_OPTIONS) of
- {ok, ListenSocket} ->
- io:format("Listening on ~p...~n",[?PORT_NO]),
- receive_loop(ListenSocket),
- io:format("Connection closed.~n"),
- gen_tcp:close(ListenSocket);
- {error, Reason} ->
- io:format("Failed to listen on ~p: ~p~n",[?PORT_NO,Reason])
- end.
- parse_request(Request)->
- {ok,TopHeader,Rest} = erlang:decode_packet(http,Request,[]),
- ParsedHeaders = parse_headers(erlang:decode_packet(httph,Rest,[]),[]),
- {TopHeader,ParsedHeaders}.
- parse_headers({ok, http_eoh, Rest},Parsed_Headers)->
- Parsed_Headers;
- parse_headers({ok,Header,Rest},Parsed_Headers) ->
- parse_headers(erlang:decode_packet(httph,Rest,[]),[Header | Parsed_Headers]).
- worker({error, Reason}) ->
- {error, Reason};
- worker({ok, TcpSocket}) ->
- {ok,Request} = gen_tcp:recv(TcpSocket,0),
- {{http_request, Method,{abs_path, Path},Version},Headers} = parse_request(list_to_binary(Request)),
- case Method of
- 'PUT' ->
- {ok,Data} = gen_tcp:recv(TcpSocket,0);
- 'POST' ->
- {ok,Data} = gen_tcp:recv(TcpSocket,0);
- 'GET' ->
- Data = [];
- 'DELETE' ->
- Data = []
- end,
- RequestObject = {{http_request, Method,{abs_path, Path},Version},Headers,Data},
- io:format("Worker ~p started for request ~p.~n",[self(),RequestObject]),
- Response = io_lib:format("HTTP/1.1 200 OK~n~nMethod: ~p~nPath: ~p~nHeaders: ~p~nData:~p",[Method,Path,Headers,Data]),
- gen_tcp:send(TcpSocket,Response),
- gen_tcp:close(TcpSocket).
- start()->
- spawn(gtd,run,[]).
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement