-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathouroboros_split.rs
More file actions
85 lines (66 loc) · 2.79 KB
/
ouroboros_split.rs
File metadata and controls
85 lines (66 loc) · 2.79 KB
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
use std::io;
use compio::net::{
TcpListener,
TcpStream,
};
use compio_io::{
AsyncReadExt as _,
AsyncWrite as _,
AsyncWriteExt as _,
};
use compio_rustls::{
client::TlsConnector,
server::TlsAcceptor,
};
use rustls_pki_types::ServerName;
use crate::common::rustls::create_configs;
mod common;
#[compio::test]
async fn run() -> io::Result<()> {
let (server_config, client_config) = create_configs();
let listener = TcpListener::bind("127.0.0.1:0").await?;
let addr = listener.local_addr()?;
let server_task = compio::runtime::spawn(async move {
let (stream, _) = listener.accept().await.unwrap();
let acceptor = TlsAcceptor::new(server_config);
let tls_stream = acceptor.accept(stream).await.unwrap();
// Split the stream
let (tcp_stream, rustls_conn) = tls_stream.into_inner();
let (tcp_rx, tcp_tx) = tcp_stream.into_split();
let (mut tls_rx, mut tls_tx) = compio_rustls::split_tls_stream(tcp_rx, tcp_tx, rustls_conn);
// Spawn a parallel write task
let write_task = compio::runtime::spawn(async move {
let (..) = tls_tx.write_all(b"Pong Split Msg!".to_vec()).await.unwrap();
tls_tx.shutdown().await.unwrap();
});
// Current task acts as the reader
let buf = Vec::with_capacity(15);
let (_, read_buf) = tls_rx.read_exact(buf).await.unwrap();
assert_eq!(read_buf.as_slice(), b"Ping Split Msg!");
write_task.await.expect("(Server) Write task error");
});
let client_task = compio::runtime::spawn(async move {
let stream = TcpStream::connect(addr).await.unwrap();
let connector = TlsConnector::new(client_config);
let domain = ServerName::try_from("localhost").unwrap().to_owned();
let tls_stream = connector.connect(domain, stream).await.unwrap();
// Split the stream
let (tcp_stream, rustls_conn) = tls_stream.into_inner();
let (tcp_rx, tcp_tx) = tcp_stream.into_split();
let (mut tls_rx, mut tls_tx) = compio_rustls::split_tls_stream(tcp_rx, tcp_tx, rustls_conn);
// Spawn a parallel write task
let write_task = compio::runtime::spawn(async move {
let (..) = tls_tx.write_all(b"Ping Split Msg!".to_vec()).await.unwrap();
tls_tx.shutdown().await.unwrap();
});
// Current task acts as the reader
let buf = Vec::with_capacity(15);
let (_, read_buf) = tls_rx.read_exact(buf).await.unwrap();
assert_eq!(read_buf.as_slice(), b"Pong Split Msg!");
write_task.await.expect("(Client) Write task error");
});
let (server_res, client_res) = futures_util::join!(server_task, client_task);
server_res.expect("(Server) Task error");
client_res.expect("(Client) Task error");
Ok(())
}