Source file gluten_lwt_unix.ml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
open Lwt.Infix
module Io :
Gluten_lwt.IO
with type socket = Lwt_unix.file_descr
and type addr = Unix.sockaddr = struct
type socket = Lwt_unix.file_descr
type addr = Unix.sockaddr
let close socket =
match Lwt_unix.state socket with
| Closed ->
Lwt.return_unit
| _ ->
Lwt.catch
(fun () ->
Lwt_unix.shutdown socket SHUTDOWN_ALL;
Lwt_unix.close socket)
(fun _exn -> Lwt.return_unit)
let read socket bigstring ~off ~len =
Lwt.catch
(fun () ->
Lwt_bytes.read socket bigstring off len >|= function
| 0 ->
`Eof
| n ->
`Ok n)
(function
| Unix.Unix_error (Unix.EBADF, _, _) ->
Lwt.return `Eof
| exn ->
Lwt.async (fun () -> close socket);
Lwt.fail exn)
let writev socket = Faraday_lwt_unix.writev_of_fd socket
let shutdown socket command =
if Lwt_unix.state socket <> Lwt_unix.Closed then
try Lwt_unix.shutdown socket command with
| Unix.Unix_error (Unix.ENOTCONN, _, _) ->
()
let shutdown_receive socket = shutdown socket Unix.SHUTDOWN_RECEIVE
end
module Server = struct
include Gluten_lwt.Server (Io)
module TLS = struct
include Gluten_lwt.Server (Tls_io.Io)
let create_default ?alpn_protocols ~certfile ~keyfile =
let make_tls_server =
Tls_io.make_server ?alpn_protocols ~certfile ~keyfile
in
fun _client_addr socket -> make_tls_server socket
end
module SSL = struct
include Gluten_lwt.Server (Ssl_io.Io)
let create_default ?alpn_protocols ~certfile ~keyfile =
let make_ssl_server =
Ssl_io.make_server ?alpn_protocols ~certfile ~keyfile
in
fun _client_addr socket -> make_ssl_server socket
end
end
module Client = struct
include Gluten_lwt.Client (Io)
module TLS = struct
include Gluten_lwt.Client (Tls_io.Io)
let create_default ?alpn_protocols socket =
Tls_io.make_client ?alpn_protocols socket
end
module SSL = struct
include Gluten_lwt.Client (Ssl_io.Io)
let create_default ?alpn_protocols socket =
Ssl_io.make_default_client ?alpn_protocols socket
end
end