Follow me
RSS feed
My sources
My Viadeo

Tiny Tiny Reia Web Server

Greg | 11 Jun 2009

devIl y a quelques 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 Reia.

Avant de recopier le code ci-dessous, il faut savoir deux ou trois petites choses à partir de ce langage.

Premièrement, il ne supporte pas les tabulations ! C'est un peu énervant et je vous conseille donc, si ce n'est pas fait, de régler votre éditeur de code de façon à systématiquement remplacer les tabulations par des espaces. Ensuite, c'est encore un jeune langage (un peu plus d'un an) qui ne propose pas tout ce que l'on est en droit d'attendre d'un langage moderne. Cependant, étant bâti au dessus d'erlang, vous pouvez très facilement utiliser ce dernier dans votre code reia. Comme vous pouvez le voir, j'use et j'abuse de cette possibilité dans le code qui suit. Donc, vous lancer dans reia sans avoir la moindre notion d'erlang n'est pas forcement ce qu'il y a de plus simple1.

 1 module HTTPServer
 2   def start()
 3     start(8080)
 4   end
 5 
 6   def start(port)
 7     case gen_tcp::listen(port, [:binary, (:active, false)])
 8     when (:ok, listenSocket)
 9       "HTTP server started on port #{port}".puts()
10       loop(listenSocket)
11     when error
12       throw error
13     end
14   end
15 
16   def loop(listenSocket)
17     case gen_tcp::accept(listenSocket)
18     when (:ok, socket)
19       Process.spawn { handle_connection(socket) }
20       loop(listenSocket)
21     when (:error, reason)
22       throw reason
23     end
24   end
25 
26   def handle_connection(socket)
27     try communication(socket)
28     catch error
29       throw error
30     end
31     ok = gen_tcp::close(socket)
32   end
33 
34   def communication(socket)
35     (:ok, binary) = gen_tcp::recv(socket, 0)
36     (:ok, (address, _)) = inet::peername(socket)
37 
38     rTmp = binary.to_string().split(/\r\n/)
39     result = /([^\s]*)\s*([^\s]*)\s*(.*)/.match( rTmp[0] )
40     file = result[2].sub(/^\//, "")
41 
42     content = ""
43 
44     case file::read_file(file.to_atom())
45       when (:ok, html)
46         content = "HTTP/1.1 200 OK\r\nServer: Reia Server/1.0.0\r\n\r\n#{html.to_string()}"
47       when (:error, reason)
48         content = "HTTP/1.1 200 OK\r\nServer: Reia Server/1.0.0\r\n\r\n<html><body>404 error</body></html>"
49     end
50 
51     case gen_tcp::send(socket, content.to_binary())
52     when (:ok)
53       true
54     when (:error, reason)
55       throw reason
56     end
57   end 
58 end
59 
60 HTTPServer.start()

1 Je dis cela uniquement pour votre bien...

Copyright © 2009 - 2011 Grégoire Lejeune.
All documents licensed under the Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License, except ones with specified licence.
Powered by Jekyll.