Skip to content

Commit 7b1965c

Browse files
committed
Remove usage of Unix.sockaddr type
This makes `Ocsigen_request.t` lighter and remove a source of exceptions. Value of type `Unix.sockaddr` were constructed for purposes other than performing network calls and can easily be replaced by a string. Accesscontrol is the only user of parsed IP addresses, which doesn't justifies the weight added to the request record. This removes a source of exception for every requests.
1 parent 263f5b8 commit 7b1965c

File tree

3 files changed

+21
-34
lines changed

3 files changed

+21
-34
lines changed

src/server/ocsigen_cohttp.ml

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -58,12 +58,10 @@ let handler ~ssl ~address ~port ~connector (flow, conn) request body =
5858
let filenames = ref [] in
5959
let edn = Conduit_lwt_unix.endp_of_flow flow in
6060
let rec getsockname = function
61-
| `TCP (ip, port) -> Unix.ADDR_INET (Ipaddr_unix.to_inet_addr ip, port)
62-
| `Unix_domain_socket path -> Unix.ADDR_UNIX path
61+
| `TCP (ip, _port) -> Ipaddr.to_string ip
62+
| `Unix_domain_socket path -> "unix://" ^ path
6363
| `TLS (_, edn) -> getsockname edn
64-
| `Unknown err -> raise (Failure ("resolution failed: " ^ err))
65-
| `Vchan_direct _ -> raise (Failure "VChan not supported")
66-
| `Vchan_domain_socket _ -> raise (Failure "VChan not supported")
64+
| `Unknown _ | `Vchan_direct _ | `Vchan_domain_socket _ -> "unknown"
6765
in
6866
let sockaddr = getsockname edn in
6967
let connection_closed =

src/server/ocsigen_request.ml

Lines changed: 17 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -53,9 +53,7 @@ type t =
5353
; r_port : int
5454
; r_ssl : bool
5555
; r_filenames : string list ref
56-
; r_sockaddr : Lwt_unix.sockaddr
57-
; r_remote_ip : string Lazy.t
58-
; r_remote_ip_parsed : [`Ip of Ipaddr.t | `Unix of string] Lazy.t
56+
; r_remote_ip : string
5957
; r_forward_ip : string list
6058
; r_uri : uri
6159
; r_meth : Cohttp.Code.meth
@@ -86,26 +84,11 @@ let make
8684
~connection_closed
8785
request
8886
=
89-
let r_remote_ip =
90-
lazy
91-
(match sockaddr with
92-
| Unix.ADDR_INET (ip, _port) -> Unix.string_of_inet_addr ip
93-
| ADDR_UNIX f -> f)
94-
in
95-
let r_remote_ip_parsed =
96-
lazy
97-
(match sockaddr with
98-
| Unix.ADDR_INET (ip, _port) ->
99-
`Ip (Ipaddr.of_string_exn (Unix.string_of_inet_addr ip))
100-
| ADDR_UNIX f -> `Unix f)
101-
in
10287
{ r_address = address
10388
; r_port = port
10489
; r_ssl = ssl
10590
; r_filenames = filenames
106-
; r_sockaddr = sockaddr
107-
; r_remote_ip
108-
; r_remote_ip_parsed
91+
; r_remote_ip = sockaddr
10992
; r_forward_ip = forward_ip
11093
; r_uri = make_uri (Cohttp.Request.uri request)
11194
; r_encoding = Cohttp.Request.encoding request
@@ -140,7 +123,6 @@ let update
140123
; r_meth
141124
; r_forward_ip
142125
; r_remote_ip
143-
; r_remote_ip_parsed
144126
; r_cookies_override
145127
; r_body
146128
; r_sub_path
@@ -150,11 +132,8 @@ let update
150132
let r_ssl = match ssl with Some ssl -> ssl | None -> r_ssl
151133
and r_forward_ip =
152134
match forward_ip with Some forward_ip -> forward_ip | None -> r_forward_ip
153-
and r_remote_ip, r_remote_ip_parsed =
154-
match remote_ip with
155-
| Some remote_ip ->
156-
lazy remote_ip, lazy (`Ip (Ipaddr.of_string_exn remote_ip))
157-
| None -> r_remote_ip, r_remote_ip_parsed
135+
and r_remote_ip =
136+
match remote_ip with Some remote_ip -> remote_ip | None -> r_remote_ip
158137
and r_sub_path = match sub_path with Some _ -> sub_path | None -> r_sub_path
159138
and r_body =
160139
match post_data with
@@ -193,7 +172,6 @@ let update
193172
; r_meth
194173
; r_forward_ip
195174
; r_remote_ip
196-
; r_remote_ip_parsed
197175
; r_body
198176
; r_cookies_override
199177
; r_sub_path
@@ -292,8 +270,19 @@ let post_params r s i =
292270
let files r s i =
293271
match force_post_data r s i with Some v -> Some (v >|= snd) | None -> None
294272

295-
let remote_ip {r_remote_ip; _} = Lazy.force r_remote_ip
296-
let remote_ip_parsed {r_remote_ip_parsed; _} = Lazy.force r_remote_ip_parsed
273+
let remote_ip {r_remote_ip; _} = r_remote_ip
274+
275+
let remote_ip_parsed {r_remote_ip; _} =
276+
let is_prefix prefix s =
277+
(* TODO: Naive version to be swapped with [String.starts_with ~prefix s]
278+
when the dependency on OCaml >= 4.13 is acceptable. *)
279+
let plen = String.length prefix in
280+
String.length s >= plen && String.sub s 0 plen = prefix
281+
in
282+
if is_prefix "unix://" r_remote_ip
283+
then `Unix r_remote_ip
284+
else `Ip (Ipaddr.of_string_exn r_remote_ip)
285+
297286
let forward_ip {r_forward_ip; _} = r_forward_ip
298287
let request_cache {r_request_cache; _} = r_request_cache
299288
let tries {r_tries; _} = r_tries

src/server/ocsigen_request.mli

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ val make :
1919
-> port:int
2020
-> ssl:bool
2121
-> filenames:string list ref
22-
-> sockaddr:Lwt_unix.sockaddr
22+
-> sockaddr:string
2323
-> body:Cohttp_lwt.Body.t
2424
-> connection_closed:unit Lwt.t
2525
-> Cohttp.Request.t

0 commit comments

Comments
 (0)