diff options
Diffstat (limited to 'examples/autobahn-server.rs')
-rw-r--r-- | examples/autobahn-server.rs | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/examples/autobahn-server.rs b/examples/autobahn-server.rs new file mode 100644 index 0000000..dafe37b --- /dev/null +++ b/examples/autobahn-server.rs @@ -0,0 +1,47 @@ +use std::{ + net::{TcpListener, TcpStream}, + thread::spawn, +}; + +use log::*; +use tungstenite::{accept, handshake::HandshakeRole, Error, HandshakeError, Message, Result}; + +fn must_not_block<Role: HandshakeRole>(err: HandshakeError<Role>) -> Error { + match err { + HandshakeError::Interrupted(_) => panic!("Bug: blocking socket would block"), + HandshakeError::Failure(f) => f, + } +} + +fn handle_client(stream: TcpStream) -> Result<()> { + let mut socket = accept(stream).map_err(must_not_block)?; + info!("Running test"); + loop { + match socket.read()? { + msg @ Message::Text(_) | msg @ Message::Binary(_) => { + socket.send(msg)?; + } + Message::Ping(_) | Message::Pong(_) | Message::Close(_) | Message::Frame(_) => {} + } + } +} + +fn main() { + env_logger::init(); + + let server = TcpListener::bind("127.0.0.1:9002").unwrap(); + + for stream in server.incoming() { + spawn(move || match stream { + Ok(stream) => { + if let Err(err) = handle_client(stream) { + match err { + Error::ConnectionClosed | Error::Protocol(_) | Error::Utf8 => (), + e => error!("test: {}", e), + } + } + } + Err(e) => error!("Error accepting stream: {}", e), + }); + } +} |