Skip to content

Instantly share code, notes, and snippets.

@sdroege
Created November 3, 2019 17:30
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save sdroege/b1a6cc33ff9a81ae3b52125aeb9aa9c5 to your computer and use it in GitHub Desktop.
Save sdroege/b1a6cc33ff9a81ae3b52125aeb9aa9c5 to your computer and use it in GitHub Desktop.
websocket-lowlevel + hyper + async/await
[package]
name = "websocket-test"
version = "0.1.0"
authors = ["Sebastian Dröge <sebastian@centricular.com>"]
edition = "2018"
[dependencies]
websocket-lowlevel = { git = "https://github.com/sdroege/rust-websocket.git", rev = "tokio-0.2", default-features = false, features = ["async"] }
futures-preview = { version = "0.3.0-alpha.19" }
tokio = { version = "0.2.0-alpha.6" }
tokio-io = { version = "0.2.0-alpha.6" }
hyper = { version = "0.13.0-alpha.4" }
hyper-tls = { version = "0.4.0-alpha.4" }
use tokio::codec::Decoder;
use tokio::prelude::*;
fn main() {
let https = hyper_tls::HttpsConnector::new().unwrap();
let client = hyper::Client::builder().build::<_, hyper::Body>(https);
let f = async {
let key = websocket_lowlevel::header::WebSocketKey::new();
let req = hyper::Request::builder()
.uri("https://echo.websocket.org")
.header(hyper::header::HOST, "echo.websocket.org")
.header(hyper::header::UPGRADE, "websocket")
.header(hyper::header::CONNECTION, "Upgrade")
.header("Sec-WebSocket-Version", "13")
.header("Sec-WebSocket-Key", key.serialize())
.body(hyper::Body::empty())
.unwrap();
println!("req: {:?}", req);
let res = client.request(req).await;
println!("res: {:?}", res);
let res = res.expect("Failed HTTP request");
if res.status() != hyper::StatusCode::SWITCHING_PROTOCOLS {
panic!("Not switching protocols: {}", res.status());
}
let headers = res.headers();
let accept = headers
.get("Sec-WebSocket-Accept")
.and_then(|h| h.to_str().ok());
if accept.is_none() {
panic!("No Accept header");
}
let accept = accept.unwrap();
let expected_accept = websocket_lowlevel::header::WebSocketAccept::new(&key);
if expected_accept.serialize() != accept {
panic!(
"Accept header wrong: excepted {}, got {}",
expected_accept.serialize(),
accept
);
}
let (mut w, r) = match res.into_body().on_upgrade().await {
Ok(upgrade) => {
let framed = websocket_lowlevel::codec::ws::MessageCodec::default(
websocket_lowlevel::codec::ws::Context::Client,
)
.framed(upgrade);
framed.split()
}
Err(err) => {
panic!("Failed to upgrade: {:?}", err);
}
};
let res = w
.send(websocket_lowlevel::message::OwnedMessage::Text(
"blablabla".into(),
))
.await;
res.expect("sending failed");
let (m, r) = r.into_future().await;
let m = m.unwrap();
println!("msg {:?}", m);
};
tokio::runtime::Builder::new().build().unwrap().block_on(f);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment