[Why not]

Tiny Tiny Reia Web Server

By Greg

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
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…

Tags: ,

Les commentaires sont clos.

Copyright © 2010 algo::rithmique. All Rights Reserved.
Powered by WordPress.