Recommend Me


Jeudi 16 octobre 2008

Tiny Tiny Erlang Web Server

Classé dans : Erlang, Projets, Web — greg @ 0:42

Depuis quelques jours je m’amuse avec Erlang. Je vous livre mon “hello world”.

Ce n’est pas très beau, on peut certainement faire beaucoup mieux. Mais ça fait “Hello world” ;)

  1. -module(rserver).
  2. -author(’gregoire.lejeune@free.fr’).
  3. -compile(export_all).
  4.  
  5. start_server(Port) ->
  6.   {ok, ListenSocket} = gen_tcp:listen(Port, [binary, {packet, 0}, {active, false}]),
  7.   io:format("** Server Started~n"),
  8.   loop(ListenSocket).
  9.  
  10. loop(ListenSocket) ->
  11.   case gen_tcp:accept(ListenSocket) of
  12.     {ok, Socket} ->
  13.       spawn(fun() ->
  14.         handle_connection(Socket)
  15.       end),
  16.       loop(ListenSocket);
  17.     {error, Reason} ->
  18.       io:format("Error: ~p~n", [Reason])
  19.   end.
  20.  
  21. handle_connection(Socket) ->
  22.   try communication(Socket)
  23.   catch
  24.     error:Reason ->
  25.       {gen_tcp:send(Socket, io_lib:format("Error: ~p~n", [Reason]))}
  26.   end,
  27.   ok = gen_tcp:close(Socket).
  28.  
  29. communication(Socket) ->
  30.   {ok, Binary} = gen_tcp:recv(Socket, 0),
  31.   % Do some stuff with Binary
  32.   {ok, [R|Z]} = regexp:split( binary_to_list(Binary), "\r\n" ),
  33.   {ok, [M,F,P]} = regexp:split( R, " " ),
  34.   case F =:= "/" of
  35.     true -> File = "index.html";
  36.     false -> {ok, File, _} = regexp:gsub(F, "^/", "")
  37.   end,
  38.   {WD, JJ, MD, AA, HH, MN, SS} = get_local_time(),
  39.   case file:read_file(File) of
  40.     {ok, Html} ->
  41.       gen_tcp:send(Socket, io_lib:format("HTTP/1.1 200 OK~nDate: ~s, ~p ~s ~p ~p:~p:~p GMT~nServer: Rserver/1.0.0~n~n~s", [WD, JJ, MD, AA, HH, MN, SS, binary_to_list(Html)]));
  42.     {error, _} ->
  43.       gen_tcp:send(Socket, io_lib:format("HTTP/1.1 404 Not Found~nDate: ~s, ~p ~s ~p ~p:~p:~p GMT~nServer: Rserver/1.0.0~n~n~s", [WD, JJ, MD, AA, HH, MN, SS, "<html><body>404 error</body></html>"]))
  44.   end.  
  45.  
  46. %%%%%%%%%%%%%%%%%%%%%%%%%%%
  47.  
  48. day(0) -> "Mon";
  49. day(1) -> "Tue";
  50. day(2) -> "Wed";
  51. day(3) -> "Thu";
  52. day(4) -> "Fri";
  53. day(5) -> "Sat";
  54. day(6) -> "Sun".
  55.  
  56. month(1) -> "Jan";
  57. month(2) -> "Feb";
  58. month(3) -> "Mar";
  59. month(4) -> "Apr";
  60. month(5) -> "May";
  61. month(6) -> "Jun";
  62. month(7) -> "Jul";
  63. month(8) -> "Aug";
  64. month(9) -> "Sep";
  65. month(10) -> "Oct";
  66. month(11) -> "Nov";
  67. month(12) -> "Dec".
  68.  
  69. get_local_time() ->
  70.   D = calendar:local_time(),
  71.   [{{AA,MM,JJ},{HH,MN,SS}}] = calendar:local_time_to_universal_time_dst(D),
  72.   WD = day(calendar:day_of_the_week(AA, MM, JJ)),
  73.   MD = month(MM),
  74.   {WD, JJ, MD, AA, HH, MN, SS}.
• • •

Un commentaire »

  1. [...] mois, sur mon ancien blog, je vous proposais un petit bout de code montrant comment développer un mini serveur Web en Erlang. Aujourd’hui, je vous propose de comparer ce code avec son équivalent en [...]

    Ping par Tiny Tiny Reia Web Server | algo::rithmique — Jeudi 11 juin 2009 @ 19:36

RSS des commentairesTrackBack URI

Laisser un commentaire

You must be logged in to post a comment.

Powered by: WordPress • Template adapted from the Simple Green' Wench theme - RSS