add failing test for event finalization after event_base_free
[ocaml-event.git] / examples / http_server.ml
blob0021b3f8a4098e36218f94c30b3633e34b93d049
1 (*
2 * Simple but fast HTTP Server
3 *)
5 let accept fd =
6 let client_fd, client_addr = Unix.accept fd in
7 Unix.set_nonblock client_fd;
8 client_fd, client_addr
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" ^
24 "\r\n" ^
25 "<html><h1>Hi There</h1>" ^
26 "<pre>" ^ (String.sub buffer 0 len) ^ "</pre>" ^
27 "</html"
29 let l = Unix.write fd response 0 (String.length response) in
30 Unix.close fd
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
41 Unix.set_nonblock fd;
42 Unix.setsockopt fd Unix.SO_REUSEADDR true;
43 Unix.bind fd (Unix.ADDR_INET (Unix.inet_addr_any, port));
44 Unix.listen fd 5;
47 let _ =
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
57 let buflen = 10240 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;
64 Libevent.dispatch ();