mirror of https://github.com/fafhrd91/actix-web
parent
d551c8adf9
commit
5919b84ea2
|
@ -30,17 +30,35 @@ pub type BoxConnectorService = Rc<
|
||||||
|
|
||||||
pub type BoxedSocket = Box<dyn ConnectionIo>;
|
pub type BoxedSocket = Box<dyn ConnectionIo>;
|
||||||
|
|
||||||
|
/// Combined HTTP and WebSocket request type received by connection service.
|
||||||
pub enum ConnectRequest {
|
pub enum ConnectRequest {
|
||||||
|
/// Standard HTTP request.
|
||||||
|
///
|
||||||
|
/// Contains the request head, body type, and optional pre-resolved socket address.
|
||||||
Client(RequestHeadType, AnyBody, Option<net::SocketAddr>),
|
Client(RequestHeadType, AnyBody, Option<net::SocketAddr>),
|
||||||
|
|
||||||
|
/// Tunnel used by WebSocket connection requests.
|
||||||
|
///
|
||||||
|
/// Contains the request head and optional pre-resolved socket address.
|
||||||
Tunnel(RequestHead, Option<net::SocketAddr>),
|
Tunnel(RequestHead, Option<net::SocketAddr>),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Combined HTTP response & WebSocket tunnel type returned from connection service.
|
||||||
pub enum ConnectResponse {
|
pub enum ConnectResponse {
|
||||||
|
/// Standard HTTP response.
|
||||||
Client(ClientResponse),
|
Client(ClientResponse),
|
||||||
|
|
||||||
|
/// Tunnel used for WebSocket communication.
|
||||||
|
///
|
||||||
|
/// Contains response head and framed HTTP/1.1 codec.
|
||||||
Tunnel(ResponseHead, Framed<BoxedSocket, ClientCodec>),
|
Tunnel(ResponseHead, Framed<BoxedSocket, ClientCodec>),
|
||||||
}
|
}
|
||||||
|
|
||||||
impl ConnectResponse {
|
impl ConnectResponse {
|
||||||
|
/// Unwraps type into HTTP response.
|
||||||
|
///
|
||||||
|
/// # Panics
|
||||||
|
/// Panics if enum variant is not `Client`.
|
||||||
pub fn into_client_response(self) -> ClientResponse {
|
pub fn into_client_response(self) -> ClientResponse {
|
||||||
match self {
|
match self {
|
||||||
ConnectResponse::Client(res) => res,
|
ConnectResponse::Client(res) => res,
|
||||||
|
@ -50,6 +68,10 @@ impl ConnectResponse {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Unwraps type into WebSocket tunnel response.
|
||||||
|
///
|
||||||
|
/// # Panics
|
||||||
|
/// Panics if enum variant is not `Tunnel`.
|
||||||
pub fn into_tunnel_response(self) -> (ResponseHead, Framed<BoxedSocket, ClientCodec>) {
|
pub fn into_tunnel_response(self) -> (ResponseHead, Framed<BoxedSocket, ClientCodec>) {
|
||||||
match self {
|
match self {
|
||||||
ConnectResponse::Tunnel(head, framed) => (head, framed),
|
ConnectResponse::Tunnel(head, framed) => (head, framed),
|
||||||
|
@ -136,30 +158,37 @@ where
|
||||||
ConnectRequestProj::Connection { fut, req } => {
|
ConnectRequestProj::Connection { fut, req } => {
|
||||||
let connection = ready!(fut.poll(cx))?;
|
let connection = ready!(fut.poll(cx))?;
|
||||||
let req = req.take().unwrap();
|
let req = req.take().unwrap();
|
||||||
|
|
||||||
match req {
|
match req {
|
||||||
ConnectRequest::Client(head, body, ..) => {
|
ConnectRequest::Client(head, body, ..) => {
|
||||||
// send request
|
// send request
|
||||||
let fut = ConnectRequestFuture::Client {
|
let fut = ConnectRequestFuture::Client {
|
||||||
fut: connection.send_request(head, body),
|
fut: connection.send_request(head, body),
|
||||||
};
|
};
|
||||||
|
|
||||||
self.set(fut);
|
self.set(fut);
|
||||||
}
|
}
|
||||||
|
|
||||||
ConnectRequest::Tunnel(head, ..) => {
|
ConnectRequest::Tunnel(head, ..) => {
|
||||||
// send request
|
// send request
|
||||||
let fut = ConnectRequestFuture::Tunnel {
|
let fut = ConnectRequestFuture::Tunnel {
|
||||||
fut: connection.open_tunnel(RequestHeadType::from(head)),
|
fut: connection.open_tunnel(RequestHeadType::from(head)),
|
||||||
};
|
};
|
||||||
|
|
||||||
self.set(fut);
|
self.set(fut);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
self.poll(cx)
|
self.poll(cx)
|
||||||
}
|
}
|
||||||
|
|
||||||
ConnectRequestProj::Client { fut } => {
|
ConnectRequestProj::Client { fut } => {
|
||||||
let (head, payload) = ready!(fut.as_mut().poll(cx))?;
|
let (head, payload) = ready!(fut.as_mut().poll(cx))?;
|
||||||
Poll::Ready(Ok(ConnectResponse::Client(ClientResponse::new(
|
Poll::Ready(Ok(ConnectResponse::Client(ClientResponse::new(
|
||||||
head, payload,
|
head, payload,
|
||||||
))))
|
))))
|
||||||
}
|
}
|
||||||
|
|
||||||
ConnectRequestProj::Tunnel { fut } => {
|
ConnectRequestProj::Tunnel { fut } => {
|
||||||
let (head, framed) = ready!(fut.as_mut().poll(cx))?;
|
let (head, framed) = ready!(fut.as_mut().poll(cx))?;
|
||||||
let framed = framed.into_map_io(|io| Box::new(io) as _);
|
let framed = framed.into_map_io(|io| Box::new(io) as _);
|
||||||
|
|
Loading…
Reference in New Issue