]> matita.cs.unibo.it Git - helm.git/commitdiff
added:
authorStefano Zacchiroli <zack@upsilon.cc>
Wed, 25 Dec 2002 14:58:19 +0000 (14:58 +0000)
committerStefano Zacchiroli <zack@upsilon.cc>
Wed, 25 Dec 2002 14:58:19 +0000 (14:58 +0000)
- sockname_of_out_channel, returns sockname of an out_channel underlying
  socket
- sockname_of_in_channel, as above for in_channels
- buf_of_inchan: returns a Buffer.t created reading from an in_channel
- list_assoc_all: List.assoc extension which returns all bindings of a
  given key

helm/DEVEL/ocaml-http/http_misc.ml
helm/DEVEL/ocaml-http/http_misc.mli

index 0e11e10489883e52261eba60a3c20f4833c34053..191508c49a01cb8e9e96f88482db96f17dac8090 100644 (file)
@@ -108,4 +108,32 @@ let peername_of_out_channel outchan =
   Unix.getpeername (Unix.descr_of_out_channel outchan)
 let peername_of_in_channel inchan =
   Unix.getpeername (Unix.descr_of_in_channel inchan)
+let sockname_of_out_channel outchan =
+  Unix.getsockname (Unix.descr_of_out_channel outchan)
+let sockname_of_in_channel inchan =
+  Unix.getsockname (Unix.descr_of_in_channel inchan)
+
+let buf_of_inchan ?limit ic =
+  let buf = Buffer.create 10240 in
+  let tmp = String.make 1024 '\000' in
+  let rec buf_of_inchan' limit =
+    (match limit with
+    | None ->
+        let bytes = input ic tmp 0 1024 in
+        if bytes > 0 then begin
+          Buffer.add_substring buf tmp 0 bytes;
+          buf_of_inchan' None
+        end
+    | Some lim -> (* TODO what about using a single really_input call? *)
+        let bytes = input ic tmp 0 (min lim 1024) in
+        if bytes > 0 then begin
+          Buffer.add_substring buf tmp 0 bytes;
+          buf_of_inchan' (Some (lim - bytes))
+        end)
+  in
+  (try buf_of_inchan' limit with End_of_file -> ());
+  buf
+
+let list_assoc_all key pairs =
+  snd (List.split (List.filter (fun (k, v) -> k = key) pairs))
 
index 6e5fdfcf6425daf10beedcbc60b0269fe4184077..86293404035dc2e04b22042d32bf90048c269b05 100644 (file)
@@ -62,4 +62,18 @@ val explode_sockaddr: Unix.sockaddr -> string * int
 val peername_of_out_channel: out_channel -> Unix.sockaddr
   (** as above but works on in_channels *)
 val peername_of_in_channel: in_channel -> Unix.sockaddr
+  (** given an out_channel build on top of a socket, return sockname related to
+  that socket *)
+val sockname_of_out_channel: out_channel -> Unix.sockaddr
+  (** as above but works on in_channels *)
+val sockname_of_in_channel: in_channel -> Unix.sockaddr
+
+  (** reads from an input channel till it End_of_file and returns what has been
+  read; if limit is given returned buffer will contains at most first 'limit'
+  bytes read from input channel *)
+val buf_of_inchan: ?limit: int -> in_channel -> Buffer.t
+
+  (** like List.assoc but return all bindings of a given key instead of the
+  leftmost one only *)
+val list_assoc_all: 'a -> ('a * 'b) list -> 'b list