|
1 | | -use std::{error::Error, net::SocketAddr, pin::Pin, str::FromStr, time::Duration}; |
| 1 | +use std::{net::SocketAddr, pin::Pin, str::FromStr, time::Duration}; |
2 | 2 | use udp_stream::UdpListener; |
3 | 3 |
|
4 | 4 | use openssl::{ |
@@ -29,28 +29,30 @@ fn ssl_acceptor(certificate: &[u8], private_key: &[u8]) -> std::io::Result<SslCo |
29 | 29 | } |
30 | 30 |
|
31 | 31 | #[tokio::main] |
32 | | -async fn main() -> Result<(), Box<dyn Error>> { |
| 32 | +async fn main() -> Result<(), Box<dyn std::error::Error>> { |
33 | 33 | let listener = UdpListener::bind(SocketAddr::from_str("127.0.0.1:8080")?).await?; |
34 | 34 | let acceptor = ssl_acceptor(SERVER_CERT, SERVER_KEY)?; |
35 | 35 | loop { |
36 | 36 | let (socket, _) = listener.accept().await?; |
37 | 37 | let acceptor = acceptor.clone(); |
38 | 38 | tokio::spawn(async move { |
39 | | - let ssl = Ssl::new(&acceptor).unwrap(); |
40 | | - let mut stream = tokio_openssl::SslStream::new(ssl, socket).unwrap(); |
41 | | - Pin::new(&mut stream).accept().await.unwrap(); |
| 39 | + let ssl = Ssl::new(&acceptor).map_err(std::io::Error::other)?; |
| 40 | + let mut stream = tokio_openssl::SslStream::new(ssl, socket).map_err(std::io::Error::other)?; |
| 41 | + Pin::new(&mut stream).accept().await.map_err(std::io::Error::other)?; |
42 | 42 | let mut buf = vec![0u8; UDP_BUFFER_SIZE]; |
43 | 43 | loop { |
44 | 44 | let duration = Duration::from_millis(UDP_TIMEOUT); |
45 | | - let n = match timeout(duration, stream.read(&mut buf)).await.unwrap() { |
46 | | - Ok(len) => len, |
| 45 | + let n = match timeout(duration, stream.read(&mut buf)).await { |
| 46 | + Ok(len) => len?, |
47 | 47 | Err(_) => { |
48 | | - return; |
| 48 | + stream.shutdown().await?; |
| 49 | + break; |
49 | 50 | } |
50 | 51 | }; |
51 | 52 |
|
52 | | - stream.write_all(&buf[0..n]).await.unwrap(); |
| 53 | + stream.write_all(&buf[0..n]).await?; |
53 | 54 | } |
| 55 | + Ok::<(), std::io::Error>(()) |
54 | 56 | }); |
55 | 57 | } |
56 | 58 | } |
0 commit comments