2018-11-19 06:48:20 +01:00
|
|
|
use std::io;
|
2018-10-05 23:30:40 +02:00
|
|
|
|
2018-12-11 03:08:33 +01:00
|
|
|
use actix_codec::Framed;
|
2019-05-12 17:34:51 +02:00
|
|
|
use actix_http::{body::BodySize, h1, ws, Error, HttpService, Request, Response};
|
2019-01-27 19:59:07 +01:00
|
|
|
use actix_http_test::TestServer;
|
2018-10-23 03:18:05 +02:00
|
|
|
use bytes::{Bytes, BytesMut};
|
2019-05-12 17:34:51 +02:00
|
|
|
use futures::future::ok;
|
2018-11-19 06:48:20 +01:00
|
|
|
use futures::{Future, Sink, Stream};
|
2018-10-05 23:30:40 +02:00
|
|
|
|
2018-10-10 22:20:00 +02:00
|
|
|
fn ws_service(req: ws::Frame) -> impl Future<Item = ws::Message, Error = io::Error> {
|
2018-10-05 23:30:40 +02:00
|
|
|
match req {
|
2018-10-10 22:20:00 +02:00
|
|
|
ws::Frame::Ping(msg) => ok(ws::Message::Pong(msg)),
|
|
|
|
ws::Frame::Text(text) => {
|
|
|
|
let text = if let Some(pl) = text {
|
|
|
|
String::from_utf8(Vec::from(pl.as_ref())).unwrap()
|
|
|
|
} else {
|
|
|
|
String::new()
|
|
|
|
};
|
|
|
|
ok(ws::Message::Text(text))
|
|
|
|
}
|
|
|
|
ws::Frame::Binary(bin) => ok(ws::Message::Binary(
|
|
|
|
bin.map(|e| e.freeze())
|
|
|
|
.unwrap_or_else(|| Bytes::from(""))
|
|
|
|
.into(),
|
|
|
|
)),
|
|
|
|
ws::Frame::Close(reason) => ok(ws::Message::Close(reason)),
|
2018-10-05 23:30:40 +02:00
|
|
|
_ => ok(ws::Message::Close(None)),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn test_simple() {
|
2019-02-19 03:46:30 +01:00
|
|
|
let mut srv = TestServer::new(|| {
|
2019-05-12 17:34:51 +02:00
|
|
|
HttpService::build()
|
|
|
|
.upgrade(|(req, framed): (Request, Framed<_, _>)| {
|
|
|
|
let res = ws::handshake_response(req.head()).finish();
|
|
|
|
// send handshake response
|
|
|
|
framed
|
|
|
|
.send(h1::Message::Item((res.drop_body(), BodySize::None)))
|
|
|
|
.map_err(|e: io::Error| e.into())
|
|
|
|
.and_then(|framed| {
|
|
|
|
// start websocket service
|
|
|
|
let framed = framed.into_framed(ws::Codec::new());
|
|
|
|
ws::Transport::with(framed, ws_service)
|
|
|
|
})
|
|
|
|
})
|
|
|
|
.finish(|_| ok::<_, Error>(Response::NotFound()))
|
2018-10-05 23:30:40 +02:00
|
|
|
});
|
|
|
|
|
2018-10-23 03:18:05 +02:00
|
|
|
// client service
|
2018-11-19 06:48:20 +01:00
|
|
|
let framed = srv.ws().unwrap();
|
|
|
|
let framed = srv
|
2018-10-23 03:18:05 +02:00
|
|
|
.block_on(framed.send(ws::Message::Text("text".to_string())))
|
|
|
|
.unwrap();
|
2018-11-19 06:48:20 +01:00
|
|
|
let (item, framed) = srv.block_on(framed.into_future()).map_err(|_| ()).unwrap();
|
2018-10-23 03:18:05 +02:00
|
|
|
assert_eq!(item, Some(ws::Frame::Text(Some(BytesMut::from("text")))));
|
|
|
|
|
2018-11-19 06:48:20 +01:00
|
|
|
let framed = srv
|
2018-10-23 03:18:05 +02:00
|
|
|
.block_on(framed.send(ws::Message::Binary("text".into())))
|
|
|
|
.unwrap();
|
2018-11-19 06:48:20 +01:00
|
|
|
let (item, framed) = srv.block_on(framed.into_future()).map_err(|_| ()).unwrap();
|
2018-10-23 03:18:05 +02:00
|
|
|
assert_eq!(
|
|
|
|
item,
|
|
|
|
Some(ws::Frame::Binary(Some(Bytes::from_static(b"text").into())))
|
|
|
|
);
|
|
|
|
|
2018-11-19 06:48:20 +01:00
|
|
|
let framed = srv
|
2018-10-23 03:18:05 +02:00
|
|
|
.block_on(framed.send(ws::Message::Ping("text".into())))
|
|
|
|
.unwrap();
|
2018-11-19 06:48:20 +01:00
|
|
|
let (item, framed) = srv.block_on(framed.into_future()).map_err(|_| ()).unwrap();
|
2018-10-23 03:18:05 +02:00
|
|
|
assert_eq!(item, Some(ws::Frame::Pong("text".to_string().into())));
|
|
|
|
|
2018-11-19 06:48:20 +01:00
|
|
|
let framed = srv
|
2018-10-23 03:18:05 +02:00
|
|
|
.block_on(framed.send(ws::Message::Close(Some(ws::CloseCode::Normal.into()))))
|
|
|
|
.unwrap();
|
|
|
|
|
2018-11-19 06:48:20 +01:00
|
|
|
let (item, _framed) = srv.block_on(framed.into_future()).map_err(|_| ()).unwrap();
|
2018-10-23 03:18:05 +02:00
|
|
|
assert_eq!(
|
|
|
|
item,
|
|
|
|
Some(ws::Frame::Close(Some(ws::CloseCode::Normal.into())))
|
2018-12-11 03:08:33 +01:00
|
|
|
);
|
2018-10-05 23:30:40 +02:00
|
|
|
}
|