From 3f1c5105dbee316a9a4954276de5694c9dead8ee Mon Sep 17 00:00:00 2001 From: Stefano Zacchiroli Date: Wed, 25 Dec 2002 14:58:19 +0000 Subject: [PATCH] added: - 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 | 28 ++++++++++++++++++++++++++++ helm/DEVEL/ocaml-http/http_misc.mli | 14 ++++++++++++++ 2 files changed, 42 insertions(+) diff --git a/helm/DEVEL/ocaml-http/http_misc.ml b/helm/DEVEL/ocaml-http/http_misc.ml index 0e11e1048..191508c49 100644 --- a/helm/DEVEL/ocaml-http/http_misc.ml +++ b/helm/DEVEL/ocaml-http/http_misc.ml @@ -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)) diff --git a/helm/DEVEL/ocaml-http/http_misc.mli b/helm/DEVEL/ocaml-http/http_misc.mli index 6e5fdfcf6..862934040 100644 --- a/helm/DEVEL/ocaml-http/http_misc.mli +++ b/helm/DEVEL/ocaml-http/http_misc.mli @@ -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 -- 2.39.2