-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathhttp_server.rb
More file actions
76 lines (62 loc) · 2.11 KB
/
Copy pathhttp_server.rb
File metadata and controls
76 lines (62 loc) · 2.11 KB
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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
require 'socket'
port = 8080 # port d'écoute du serveur
server = TCPServer.open(port)
class String
def self.random(size=20)
set = [('a'..'z'),('A'..'Z')].map{|i| i.to_a}.flatten
(1..size).map{ set[rand(set.length)] }.join
end
end
def generate_cookie
require 'digest/md5'
Digest::MD5.hexdigest("cooooookiiiie"+String.random)
end
trap('EXIT'){ server.close }
fork do
trap('INT'){ exit }
sessions = {}
loop do
socket = server.accept
# request parsing
request = socket.gets
headers = {}
begin
header = socket.gets # On lit sur le socket la 1 ère ligne de la requête
header_name, header_val = header.chomp.split(': ')
headers[header_name] = header_val
end until header.chomp.empty?
body = nil
unless headers["Content-Length"].nil? # on teste si le headers a un content-Length
body = socket.read(headers["Content-Length"].to_i) # on lit et on stocke le corps de la requête
socket.puts body
end
# response code
socket.puts("HTTP/1.1 200 OK")
# response headers
response_body = [request, headers.inspect, body ].join("\n")
if headers["Cookie"] # Si Cookie dans la requete..
val = headers["Cookie"].split('=')[0]
if sessions[val]
sessions[val][:nb] += 1
response_body = [response_body, ["Nombre de passages en mode session :", sessions[val][:nb]].join(' ') ].join("\n")
end
else # Si pas de cookie dans la requete...
session_id = generate_cookie
sessions[session_id] = {:nb => 0}
response_body = [response_body, ["Nombre de passages en mode session :" , sessions[session_id][:nb]].join('') ].join("\n")
socket.puts ("Content-Length: #{response_body.length}")
socket.puts ("Content-Type: text/plain")
socket.puts ("Set-Cookie: session_id=#{session_id}")
end
socket.puts ("Content-Length: #{response_body.length}")
socket.puts("Content-Type: text/plain")
socket.puts
# response body
socket.write response_body
socket.close
end
exit
end
trap('INT') { puts "\nexiting" ; exit }
# Sit back and wait for all child processes to exit.
Process.waitall