#![allow(dead_code, unused_variables)] extern crate actix; extern crate actix_http; extern crate tokio_core; extern crate env_logger; use std::net; use std::str::FromStr; use actix::prelude::*; use actix_http::*; struct MyRoute {req: Option} impl Actor for MyRoute { type Context = HttpContext; } impl Route for MyRoute { type State = (); fn request(req: HttpRequest, payload: Option, ctx: &mut HttpContext) -> HttpMessage { if let Some(pl) = payload { ctx.add_stream(pl); HttpMessage::stream(MyRoute{req: Some(req)}) } else { HttpMessage::reply_with(req, httpcodes::HTTPOk) } } } impl ResponseType for MyRoute { type Item = (); type Error = (); } impl StreamHandler for MyRoute {} impl Handler for MyRoute { fn handle(&mut self, msg: PayloadItem, ctx: &mut HttpContext) -> Response { println!("CHUNK: {:?}", msg); if let Some(req) = self.req.take() { ctx.start(httpcodes::HTTPOk.response(req)); ctx.write_eof(); } Self::empty() } } struct MyWS {} impl Actor for MyWS { type Context = HttpContext; } impl Route for MyWS { type State = (); fn request(req: HttpRequest, payload: Option, ctx: &mut HttpContext) -> HttpMessage { if let Some(payload) = payload { match ws::do_handshake(req) { Ok(resp) => { ctx.start(resp); ctx.add_stream(ws::WsStream::new(payload)); HttpMessage::stream(MyWS{}) }, Err(err) => HttpMessage::reply(err) } } else { HttpMessage::reply_with(req, httpcodes::HTTPBadRequest) } } } impl ResponseType for MyWS { type Item = (); type Error = (); } impl StreamHandler for MyWS {} impl Handler for MyWS { fn handle(&mut self, msg: ws::Message, ctx: &mut HttpContext) -> Response { println!("WS: {:?}", msg); match msg { ws::Message::Ping(msg) => ws::WsWriter::pong(ctx, msg), ws::Message::Text(text) => ws::WsWriter::text(ctx, text), ws::Message::Binary(bin) => ws::WsWriter::binary(ctx, bin), _ => (), } Self::empty() } } fn main() { let _ = env_logger::init(); let sys = actix::System::new("http-example".to_owned()); let mut routes = RoutingMap::default(); let mut app = HttpApplication::no_state(); app.add("/test") .get::() .post::(); routes.add("/blah", app); routes.add_resource("/test") .post::(); routes.add_resource("/ws/") .get::(); let http = HttpServer::new(routes); http.serve::<()>( &net::SocketAddr::from_str("127.0.0.1:9080").unwrap()).unwrap(); println!("starting"); let _ = sys.run(); }