aboutsummaryrefslogtreecommitdiff
path: root/examples/autobahn-server.rs
diff options
context:
space:
mode:
Diffstat (limited to 'examples/autobahn-server.rs')
-rw-r--r--examples/autobahn-server.rs47
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),
+ });
+ }
+}