1
0
mirror of https://github.com/fafhrd91/actix-web synced 2024-11-25 17:02:44 +01:00
actix-web/src/service.rs

256 lines
7.0 KiB
Rust
Raw Normal View History

2018-10-22 18:59:20 +02:00
use std::marker::PhantomData;
use actix_net::codec::Framed;
use actix_net::service::{NewService, Service};
use futures::future::{ok, Either, FutureResult};
use futures::{Async, AsyncSink, Future, Poll, Sink};
use tokio_io::{AsyncRead, AsyncWrite};
2018-10-22 18:59:20 +02:00
2018-11-18 05:21:28 +01:00
use body::MessageBody;
use error::{Error, ResponseError};
use h1::{Codec, Message};
2018-10-22 18:59:20 +02:00
use response::Response;
pub struct SendError<T, R, E>(PhantomData<(T, R, E)>);
impl<T, R, E> Default for SendError<T, R, E>
where
T: AsyncWrite,
E: ResponseError,
{
fn default() -> Self {
SendError(PhantomData)
}
}
impl<T, R, E> NewService for SendError<T, R, E>
where
T: AsyncWrite,
E: ResponseError,
{
type Request = Result<R, (E, Framed<T, Codec>)>;
type Response = R;
type Error = (E, Framed<T, Codec>);
type InitError = ();
type Service = SendError<T, R, E>;
type Future = FutureResult<Self::Service, Self::InitError>;
fn new_service(&self) -> Self::Future {
ok(SendError(PhantomData))
}
}
impl<T, R, E> Service for SendError<T, R, E>
where
T: AsyncWrite,
E: ResponseError,
{
type Request = Result<R, (E, Framed<T, Codec>)>;
type Response = R;
type Error = (E, Framed<T, Codec>);
type Future = Either<FutureResult<R, (E, Framed<T, Codec>)>, SendErrorFut<T, R, E>>;
fn poll_ready(&mut self) -> Poll<(), Self::Error> {
Ok(Async::Ready(()))
}
fn call(&mut self, req: Self::Request) -> Self::Future {
match req {
Ok(r) => Either::A(ok(r)),
2018-10-30 19:53:48 +01:00
Err((e, framed)) => {
2018-11-18 05:21:28 +01:00
let mut res = e.error_response().set_body(format!("{}", e));
let (res, _body) = res.replace_body(());
2018-10-30 19:53:48 +01:00
Either::B(SendErrorFut {
framed: Some(framed),
2018-11-18 05:21:28 +01:00
res: Some(res.into()),
2018-10-30 19:53:48 +01:00
err: Some(e),
_t: PhantomData,
})
}
2018-10-22 18:59:20 +02:00
}
}
}
pub struct SendErrorFut<T, R, E> {
res: Option<Message<Response>>,
2018-10-22 18:59:20 +02:00
framed: Option<Framed<T, Codec>>,
err: Option<E>,
_t: PhantomData<R>,
}
impl<T, R, E> Future for SendErrorFut<T, R, E>
where
E: ResponseError,
T: AsyncWrite,
{
type Item = R;
type Error = (E, Framed<T, Codec>);
fn poll(&mut self) -> Poll<Self::Item, Self::Error> {
if let Some(res) = self.res.take() {
match self.framed.as_mut().unwrap().start_send(res) {
Ok(AsyncSink::Ready) => (),
Ok(AsyncSink::NotReady(res)) => {
self.res = Some(res);
return Ok(Async::NotReady);
}
Err(_) => {
return Err((self.err.take().unwrap(), self.framed.take().unwrap()))
}
}
}
match self.framed.as_mut().unwrap().poll_complete() {
Ok(Async::Ready(_)) => {
2018-10-30 00:39:46 +01:00
Err((self.err.take().unwrap(), self.framed.take().unwrap()))
2018-10-22 18:59:20 +02:00
}
Ok(Async::NotReady) => Ok(Async::NotReady),
2018-10-30 00:39:46 +01:00
Err(_) => Err((self.err.take().unwrap(), self.framed.take().unwrap())),
2018-10-22 18:59:20 +02:00
}
}
}
2018-11-18 05:21:28 +01:00
pub struct SendResponse<T, B>(PhantomData<(T, B)>);
2018-10-22 18:59:20 +02:00
2018-11-18 05:21:28 +01:00
impl<T, B> Default for SendResponse<T, B> {
2018-10-22 18:59:20 +02:00
fn default() -> Self {
SendResponse(PhantomData)
}
}
2018-11-18 05:21:28 +01:00
impl<T, B> SendResponse<T, B>
where
T: AsyncRead + AsyncWrite,
2018-11-18 05:21:28 +01:00
B: MessageBody,
{
pub fn send(
mut framed: Framed<T, Codec>,
2018-11-18 05:21:28 +01:00
res: Response<B>,
) -> impl Future<Item = Framed<T, Codec>, Error = Error> {
// extract body from response
2018-11-18 05:21:28 +01:00
let (mut res, body) = res.replace_body(());
// init codec
framed
.get_codec_mut()
.prepare_te(&mut res.head_mut(), &mut body.length());
// write response
SendResponseFut {
res: Some(Message::Item(res)),
body: Some(body),
framed: Some(framed),
}
}
}
2018-11-18 05:21:28 +01:00
impl<T, B> NewService for SendResponse<T, B>
2018-10-22 18:59:20 +02:00
where
T: AsyncRead + AsyncWrite,
2018-11-18 05:21:28 +01:00
B: MessageBody,
2018-10-22 18:59:20 +02:00
{
2018-11-18 05:21:28 +01:00
type Request = (Response<B>, Framed<T, Codec>);
2018-10-22 18:59:20 +02:00
type Response = Framed<T, Codec>;
type Error = Error;
2018-10-22 18:59:20 +02:00
type InitError = ();
2018-11-18 05:21:28 +01:00
type Service = SendResponse<T, B>;
2018-10-22 18:59:20 +02:00
type Future = FutureResult<Self::Service, Self::InitError>;
fn new_service(&self) -> Self::Future {
ok(SendResponse(PhantomData))
}
}
2018-11-18 05:21:28 +01:00
impl<T, B> Service for SendResponse<T, B>
2018-10-22 18:59:20 +02:00
where
T: AsyncRead + AsyncWrite,
2018-11-18 05:21:28 +01:00
B: MessageBody,
2018-10-22 18:59:20 +02:00
{
2018-11-18 05:21:28 +01:00
type Request = (Response<B>, Framed<T, Codec>);
2018-10-22 18:59:20 +02:00
type Response = Framed<T, Codec>;
type Error = Error;
2018-11-18 05:21:28 +01:00
type Future = SendResponseFut<T, B>;
2018-10-22 18:59:20 +02:00
fn poll_ready(&mut self) -> Poll<(), Self::Error> {
Ok(Async::Ready(()))
}
2018-11-18 05:21:28 +01:00
fn call(&mut self, (res, mut framed): Self::Request) -> Self::Future {
let (mut res, body) = res.replace_body(());
framed
.get_codec_mut()
.prepare_te(res.head_mut(), &mut body.length());
2018-10-22 18:59:20 +02:00
SendResponseFut {
res: Some(Message::Item(res)),
body: Some(body),
2018-10-22 18:59:20 +02:00
framed: Some(framed),
}
}
}
2018-11-18 05:21:28 +01:00
pub struct SendResponseFut<T, B> {
res: Option<Message<Response>>,
2018-11-18 05:21:28 +01:00
body: Option<B>,
2018-10-22 18:59:20 +02:00
framed: Option<Framed<T, Codec>>,
}
2018-11-18 05:21:28 +01:00
impl<T, B> Future for SendResponseFut<T, B>
2018-10-22 18:59:20 +02:00
where
T: AsyncRead + AsyncWrite,
2018-11-18 05:21:28 +01:00
B: MessageBody,
2018-10-22 18:59:20 +02:00
{
type Item = Framed<T, Codec>;
type Error = Error;
2018-10-22 18:59:20 +02:00
fn poll(&mut self) -> Poll<Self::Item, Self::Error> {
2018-11-18 05:21:28 +01:00
loop {
let mut body_ready = self.body.is_some();
let framed = self.framed.as_mut().unwrap();
2018-11-18 05:21:28 +01:00
// send body
if self.res.is_none() && self.body.is_some() {
while body_ready && self.body.is_some() && !framed.is_write_buf_full() {
match self.body.as_mut().unwrap().poll_next()? {
Async::Ready(item) => {
// body is done
if item.is_none() {
let _ = self.body.take();
}
2018-11-18 05:21:28 +01:00
framed.force_send(Message::Chunk(item))?;
}
2018-11-18 05:21:28 +01:00
Async::NotReady => body_ready = false,
}
}
}
2018-11-18 05:21:28 +01:00
// flush write buffer
if !framed.is_write_buf_empty() {
match framed.poll_complete()? {
Async::Ready(_) => if body_ready {
continue;
} else {
return Ok(Async::NotReady);
},
Async::NotReady => return Ok(Async::NotReady),
}
}
2018-11-18 05:21:28 +01:00
// send response
if let Some(res) = self.res.take() {
framed.force_send(res)?;
continue;
}
if self.body.is_some() {
if body_ready {
continue;
} else {
return Ok(Async::NotReady);
}
} else {
break;
}
}
return Ok(Async::Ready(self.framed.take().unwrap()));
2018-10-22 18:59:20 +02:00
}
}