forked from digital-fabric/iou
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathhttp_server.rb
57 lines (47 loc) · 1.49 KB
/
http_server.rb
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
# frozen_string_literal: true
require_relative '../lib/uringmachine'
require 'http/parser'
@machine = UM.new
@bgid = @machine.setup_buffer_ring(4096, 1024)
def http_handle_connection(fd)
# puts "Accepting connection on fd #{fd}"
parser = Http::Parser.new
done = nil
parser.on_message_complete = -> do
http_send_response(fd, "Hello, world!\n")
done = true
end
buf = +''
while !done && @machine.read(fd, buf, 8192) > 0
parser << buf
end
# @machine.read_each(fd, @bgid) do
# parser << _1
# break if done
# end
# puts "Connection closed on fd #{fd}"
rescue => e
# puts "Error while handling connection on fd #{fd}: #{e.inspect}"
ensure
@machine.close(fd) rescue nil
end
def http_send_response(fd, body)
# msg = "HTTP/1.1 200 OK\r\nContent-Type: text/plain\r\nConnection: keep-alive\r\nContent-Length: #{body.bytesize}\r\n\r\n#{body}"
msg = "HTTP/1.1 200 OK\r\nContent-Type: text/plain\r\nConnection: close\r\nContent-Length: #{body.bytesize}\r\n\r\n#{body}"
@machine.write(fd, msg)
end
trap('SIGINT') { exit }
server_fd = @machine.socket(UM::AF_INET, UM::SOCK_STREAM, 0, 0)
@machine.setsockopt(server_fd, UM::SOL_SOCKET, UM::SO_REUSEADDR, true)
@machine.bind(server_fd, '127.0.0.1', 1234)
@machine.listen(server_fd, UM::SOMAXCONN)
puts 'Listening on port 1234'
at_exit do
puts "Closing server FD"
@machine.close(server_fd) rescue nil
puts "done!"
end
@machine.accept_each(server_fd) do |fd|
@machine.spin(fd) { http_handle_connection _1 }
end
p :post_accept_each