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
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
//! # TLS
//! The constructors every TLS task is started from
use crate;
use ;
/// Talks to other programs over TLS, on top of TCP
///
/// Needs the `tls` feature. It doesn't implement `Task`, so a
/// method has to be called on it to get something that does
///
/// ## Behaviour
/// Everything [`Tcp`] does, encrypted, with the other side's
/// certificate checked. A [`TlsConnection`] hands out the same send
/// and receive tasks as a TCP one
///
/// ```no_run
/// # use atap::{Runtime, tls::Tls};
/// # use std::time::Duration;
/// # fn main() -> Result<(), atap::RuntimeError> {
/// let reply = Runtime::task(Tls::request(
/// "www.example.com:443",
/// b"GET / HTTP/1.0\r\nHost: www.example.com\r\n\r\n".as_slice(),
/// ))
/// .timeout(Duration::from_secs(10))
/// .spawn()
/// .join()??;
/// # Ok(())
/// # }
/// ```
///
/// ## Certificates
/// A server's certificate is checked by macOS against the
/// system's trust store, the same one Safari uses, revocation
/// included. `.trust(pem)` adds roots of your own on top, for a
/// private certificate authority
///
/// A certificate that doesn't check out gives
/// [`RuntimeError::BadCertificate`], and anything else that goes
/// wrong in the session [`RuntimeError::TlsFailed`]
///
/// ## Waiting
/// A spawned task waiting on the network holds no thread, the
/// same as a TCP one. A connect still asks for a sleep thread for
/// its steps
///
/// [`Tcp`]: crate::tcp::Tcp
/// [`TlsConnection`]: crate::tls::TlsConnection
/// [`RuntimeError::BadCertificate`]: crate::RuntimeError::BadCertificate
/// [`RuntimeError::TlsFailed`]: crate::RuntimeError::TlsFailed
;