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