mirror of
https://github.com/c-cube/tiny_httpd.git
synced 2025-12-07 11:45:36 -05:00
Merge branch 'c-cube:master' into client-ip
This commit is contained in:
commit
188c21c70e
3 changed files with 33 additions and 18 deletions
|
|
@ -351,22 +351,6 @@ module Request = struct
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
(*$R
|
|
||||||
let q = "GET hello HTTP/1.1\r\nHost: coucou\r\nContent-Length: 11\r\n\r\nsalutationsSOMEJUNK" in
|
|
||||||
let str = Tiny_httpd.Byte_stream.of_string q in
|
|
||||||
let r = Request.Internal_.parse_req_start ~get_time_s:(fun _ -> 0.) str in
|
|
||||||
match r with
|
|
||||||
| None -> assert_failure "should parse"
|
|
||||||
| Some req ->
|
|
||||||
assert_equal (Some "coucou") (Headers.get "Host" req.Request.headers);
|
|
||||||
assert_equal (Some "coucou") (Headers.get "host" req.Request.headers);
|
|
||||||
assert_equal (Some "11") (Headers.get "content-length" req.Request.headers);
|
|
||||||
assert_equal "hello" req.Request.path;
|
|
||||||
let req = Request.Internal_.parse_body req str |> Request.read_body_full in
|
|
||||||
assert_equal ~printer:(fun s->s) "salutations" req.Request.body;
|
|
||||||
()
|
|
||||||
*)
|
|
||||||
|
|
||||||
module Response = struct
|
module Response = struct
|
||||||
type body =
|
type body =
|
||||||
[ `String of string
|
[ `String of string
|
||||||
|
|
@ -958,6 +942,9 @@ module Unix_tcp_server_ = struct
|
||||||
try
|
try
|
||||||
let client_sock, client_addr = Unix.accept sock in
|
let client_sock, client_addr = Unix.accept sock in
|
||||||
Unix.setsockopt client_sock Unix.TCP_NODELAY true;
|
Unix.setsockopt client_sock Unix.TCP_NODELAY true;
|
||||||
|
(* Block INT/HUP while cloning to avoid children handling them.
|
||||||
|
When thread gets them, our Unix.accept raises neatly. *)
|
||||||
|
ignore Unix.(sigprocmask SIG_BLOCK Sys.[ sigint; sighup ]);
|
||||||
self.new_thread (fun () ->
|
self.new_thread (fun () ->
|
||||||
try
|
try
|
||||||
handle_client_unix_ client_sock client_addr;
|
handle_client_unix_ client_sock client_addr;
|
||||||
|
|
@ -965,13 +952,18 @@ module Unix_tcp_server_ = struct
|
||||||
with e ->
|
with e ->
|
||||||
(try Unix.close client_sock with _ -> ());
|
(try Unix.close client_sock with _ -> ());
|
||||||
Sem_.release 1 self.sem_max_connections;
|
Sem_.release 1 self.sem_max_connections;
|
||||||
raise e)
|
raise e);
|
||||||
|
ignore Unix.(sigprocmask SIG_UNBLOCK Sys.[ sigint; sighup ])
|
||||||
with e ->
|
with e ->
|
||||||
Sem_.release 1 self.sem_max_connections;
|
Sem_.release 1 self.sem_max_connections;
|
||||||
_debug (fun k ->
|
_debug (fun k ->
|
||||||
k "Unix.accept or Thread.create raised an exception: %s"
|
k "Unix.accept or Thread.create raised an exception: %s"
|
||||||
(Printexc.to_string e))
|
(Printexc.to_string e))
|
||||||
done;
|
done;
|
||||||
|
|
||||||
|
(* Wait for all threads to be done: this only works if all threads are done. *)
|
||||||
|
Unix.close sock;
|
||||||
|
Sem_.acquire self.sem_max_connections.max self.sem_max_connections;
|
||||||
());
|
());
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
|
|
||||||
(tests
|
(tests
|
||||||
(names t_util t_buf)
|
(names t_util t_buf t_server)
|
||||||
(package tiny_httpd)
|
(package tiny_httpd)
|
||||||
(libraries tiny_httpd qcheck-core qcheck-core.runner test_util))
|
(libraries tiny_httpd qcheck-core qcheck-core.runner test_util))
|
||||||
|
|
|
||||||
23
tests/unit/t_server.ml
Normal file
23
tests/unit/t_server.ml
Normal file
|
|
@ -0,0 +1,23 @@
|
||||||
|
open Test_util
|
||||||
|
open Tiny_httpd_server
|
||||||
|
|
||||||
|
let () =
|
||||||
|
let q =
|
||||||
|
"GET hello HTTP/1.1\r\n\
|
||||||
|
Host: coucou\r\n\
|
||||||
|
Content-Length: 11\r\n\
|
||||||
|
\r\n\
|
||||||
|
salutationsSOMEJUNK"
|
||||||
|
in
|
||||||
|
let str = Tiny_httpd.Byte_stream.of_string q in
|
||||||
|
let r = Request.Internal_.parse_req_start ~get_time_s:(fun _ -> 0.) str in
|
||||||
|
match r with
|
||||||
|
| None -> failwith "should parse"
|
||||||
|
| Some req ->
|
||||||
|
assert_eq (Some "coucou") (Headers.get "Host" req.Request.headers);
|
||||||
|
assert_eq (Some "coucou") (Headers.get "host" req.Request.headers);
|
||||||
|
assert_eq (Some "11") (Headers.get "content-length" req.Request.headers);
|
||||||
|
assert_eq "hello" req.Request.path;
|
||||||
|
let req = Request.Internal_.parse_body req str |> Request.read_body_full in
|
||||||
|
assert_eq ~to_string:(fun s -> s) "salutations" req.Request.body;
|
||||||
|
()
|
||||||
Loading…
Add table
Reference in a new issue