2 * Simple but fast HTTP Server
6 let client_fd, client_addr
= Unix.accept fd
in
7 Unix.set_nonblock
client_fd;
10 let http_server_cb buffer buflen fd event_type
=
11 let client_fd, client_addr
= accept fd
in
13 let read_event = Libevent.create
() in
14 let write_event = Libevent.create
() in
16 (* The http connection callback *)
17 let http_read_cb fd event_type
=
18 let len = Unix.read fd buffer
0 buflen
in
20 (* HTTP Request not parsed, does not even have to be complete yet.*)
21 let http_write_cb fd event_type
=
22 let response = "HTTP/1.0 200 OK\n\r" ^
23 "Server: Caml 1.0\r\n" ^
25 "<html><h1>Hi There</h1>" ^
26 "<pre>" ^
(String.sub buffer
0 len) ^
"</pre>" ^
29 let l = Unix.write fd
response 0 (String.length
response) in
32 Libevent.set
write_event fd
[Libevent.WRITE
] false http_write_cb;
33 Libevent.add
write_event None
36 Libevent.set
read_event client_fd [Libevent.READ
] false http_read_cb;
37 Libevent.add
read_event None
39 let bind_server port
=
40 let fd = Unix.socket
Unix.PF_INET
Unix.SOCK_STREAM
0 in
42 Unix.setsockopt
fd Unix.SO_REUSEADDR
true;
43 Unix.bind
fd (Unix.ADDR_INET
(Unix.inet_addr_any
, port
));
48 Unix.set_nonblock
Unix.stdout
;
49 Unix.set_nonblock
Unix.stderr
;
51 let server_event = Libevent.create
() in
52 let stdout_event = Libevent.create
() in
53 let stderr_event = Libevent.create
() in
55 let server_fd = bind_server 8080 in
58 let buffer = String.create
buflen in
60 Libevent.set
server_event server_fd [Libevent.READ
] true
61 (http_server_cb buffer buflen);
62 Libevent.add
server_event None
;