1 use std
::io
::{Read, Write}
;
2 use std
::net
::{SocketAddr, TcpListener, TcpStream}
;
3 use std
::thread
::{self, JoinHandle}
;
5 use ssl
::{Ssl, SslContext, SslContextBuilder, SslFiletype, SslMethod, SslRef, SslStream}
;
8 handle
: Option
<JoinHandle
<()>>,
12 impl Drop
for Server
{
14 if !thread
::panicking() {
15 self.handle
.take().unwrap().join().unwrap();
21 pub fn builder() -> Builder
{
22 let mut ctx
= SslContext
::builder(SslMethod
::tls()).unwrap();
23 ctx
.set_certificate_chain_file("test/cert.pem").unwrap();
24 ctx
.set_private_key_file("test/key.pem", SslFiletype
::PEM
)
29 ssl_cb
: Box
::new(|_
| {}
),
30 io_cb
: Box
::new(|_
| {}
),
35 pub fn client(&self) -> ClientBuilder
{
37 ctx
: SslContext
::builder(SslMethod
::tls()).unwrap(),
42 pub fn connect_tcp(&self) -> TcpStream
{
43 TcpStream
::connect(self.addr
).unwrap()
48 ctx
: SslContextBuilder
,
49 ssl_cb
: Box
<dyn FnMut(&mut SslRef
) + Send
>,
50 io_cb
: Box
<dyn FnMut(SslStream
<TcpStream
>) + Send
>,
55 pub fn ctx(&mut self) -> &mut SslContextBuilder
{
59 pub fn ssl_cb
<F
>(&mut self, cb
: F
)
61 F
: '
static + FnMut(&mut SslRef
) + Send
,
63 self.ssl_cb
= Box
::new(cb
);
66 pub fn io_cb
<F
>(&mut self, cb
: F
)
68 F
: '
static + FnMut(SslStream
<TcpStream
>) + Send
,
70 self.io_cb
= Box
::new(cb
);
73 pub fn should_error(&mut self) {
74 self.should_error
= true;
77 pub fn build(self) -> Server
{
78 let ctx
= self.ctx
.build();
79 let socket
= TcpListener
::bind("127.0.0.1:0").unwrap();
80 let addr
= socket
.local_addr().unwrap();
81 let mut ssl_cb
= self.ssl_cb
;
82 let mut io_cb
= self.io_cb
;
83 let should_error
= self.should_error
;
85 let handle
= thread
::spawn(move || {
86 let socket
= socket
.accept().unwrap().0;
87 let mut ssl
= Ssl
::new(&ctx
).unwrap();
89 let r
= ssl
.accept(socket
);
93 let mut socket
= r
.unwrap();
94 socket
.write_all(&[0]).unwrap();
100 handle
: Some(handle
),
106 pub struct ClientBuilder
{
107 ctx
: SslContextBuilder
,
112 pub fn ctx(&mut self) -> &mut SslContextBuilder
{
116 pub fn build(self) -> Client
{
118 ctx
: self.ctx
.build(),
123 pub fn connect(self) -> SslStream
<TcpStream
> {
124 self.build().builder().connect()
127 pub fn connect_err(self) {
128 self.build().builder().connect_err();
138 pub fn builder(&self) -> ClientSslBuilder
{
140 ssl
: Ssl
::new(&self.ctx
).unwrap(),
146 pub struct ClientSslBuilder
{
151 impl ClientSslBuilder
{
152 pub fn ssl(&mut self) -> &mut SslRef
{
156 pub fn connect(self) -> SslStream
<TcpStream
> {
157 let socket
= TcpStream
::connect(self.addr
).unwrap();
158 let mut s
= self.ssl
.connect(socket
).unwrap();
159 s
.read_exact(&mut [0]).unwrap();
163 pub fn connect_err(self) {
164 let socket
= TcpStream
::connect(self.addr
).unwrap();
165 self.ssl
.connect(socket
).unwrap_err();