chore(server): remove stream generic from new Connection type
This commit is contained in:
@@ -173,7 +173,7 @@ impl<B: AsRef<[u8]> + 'static> Http<B> {
|
|||||||
/// driven on the connection.
|
/// driven on the connection.
|
||||||
///
|
///
|
||||||
/// This additionally skips the tokio-proto infrastructure internally.
|
/// This additionally skips the tokio-proto infrastructure internally.
|
||||||
pub fn no_proto<S, I, Bd>(&self, io: I, service: S) -> Connection<I, Bd, S>
|
pub fn no_proto<S, I, Bd>(&self, io: I, service: S) -> Connection<I, S>
|
||||||
where S: Service<Request = Request, Response = Response<Bd>, Error = ::Error> + 'static,
|
where S: Service<Request = Request, Response = Response<Bd>, Error = ::Error> + 'static,
|
||||||
Bd: Stream<Item=B, Error=::Error> + 'static,
|
Bd: Stream<Item=B, Error=::Error> + 'static,
|
||||||
I: AsyncRead + AsyncWrite + 'static,
|
I: AsyncRead + AsyncWrite + 'static,
|
||||||
@@ -211,19 +211,73 @@ impl<B: AsRef<[u8]> + 'static> Http<B> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
use self::hyper_service::HyperService;
|
||||||
|
mod hyper_service {
|
||||||
|
use super::{Request, Response, Service, Stream};
|
||||||
|
/// A "trait alias" for any type that implements `Service` with hyper's
|
||||||
|
/// Request, Response, and Error types, and a streaming body.
|
||||||
|
///
|
||||||
|
/// There is an auto implementation inside hyper, so no one can actually
|
||||||
|
/// implement this trait. It simply exists to reduce the amount of generics
|
||||||
|
/// needed.
|
||||||
|
pub trait HyperService: Service + Sealed {
|
||||||
|
#[doc(hidden)]
|
||||||
|
type ResponseBody;
|
||||||
|
#[doc(hidden)]
|
||||||
|
type Sealed: Sealed2;
|
||||||
|
}
|
||||||
|
|
||||||
|
pub trait Sealed {}
|
||||||
|
pub trait Sealed2 {}
|
||||||
|
|
||||||
|
#[allow(missing_debug_implementations)]
|
||||||
|
pub struct Opaque {
|
||||||
|
_inner: (),
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Sealed2 for Opaque {}
|
||||||
|
|
||||||
|
impl<S, B> Sealed for S
|
||||||
|
where
|
||||||
|
S: Service<
|
||||||
|
Request=Request,
|
||||||
|
Response=Response<B>,
|
||||||
|
Error=::Error,
|
||||||
|
>,
|
||||||
|
B: Stream<Error=::Error>,
|
||||||
|
B::Item: AsRef<[u8]>,
|
||||||
|
{}
|
||||||
|
|
||||||
|
impl<S, B> HyperService for S
|
||||||
|
where
|
||||||
|
S: Service<
|
||||||
|
Request=Request,
|
||||||
|
Response=Response<B>,
|
||||||
|
Error=::Error,
|
||||||
|
>,
|
||||||
|
S: Sealed,
|
||||||
|
B: Stream<Error=::Error>,
|
||||||
|
B::Item: AsRef<[u8]>,
|
||||||
|
{
|
||||||
|
type ResponseBody = B;
|
||||||
|
type Sealed = Opaque;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
/// A future binding a connection with a Service.
|
/// A future binding a connection with a Service.
|
||||||
///
|
///
|
||||||
/// Polling this future will drive HTTP forward.
|
/// Polling this future will drive HTTP forward.
|
||||||
#[must_use = "futures do nothing unless polled"]
|
#[must_use = "futures do nothing unless polled"]
|
||||||
pub struct Connection<I, B, S>
|
pub struct Connection<I, S>
|
||||||
where S: Service,
|
where
|
||||||
B: Stream<Error=::Error>,
|
S: HyperService,
|
||||||
B::Item: AsRef<[u8]>,
|
S::ResponseBody: Stream<Error=::Error>,
|
||||||
|
<S::ResponseBody as Stream>::Item: AsRef<[u8]>,
|
||||||
{
|
{
|
||||||
conn: proto::dispatch::Dispatcher<proto::dispatch::Server<S>, B, I, B::Item, proto::ServerTransaction, proto::KA>,
|
conn: proto::dispatch::Dispatcher<proto::dispatch::Server<S>, S::ResponseBody, I, <S::ResponseBody as Stream>::Item, proto::ServerTransaction, proto::KA>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<I, B, S> Future for Connection<I, B, S>
|
impl<I, B, S> Future for Connection<I, S>
|
||||||
where S: Service<Request = Request, Response = Response<B>, Error = ::Error> + 'static,
|
where S: Service<Request = Request, Response = Response<B>, Error = ::Error> + 'static,
|
||||||
I: AsyncRead + AsyncWrite + 'static,
|
I: AsyncRead + AsyncWrite + 'static,
|
||||||
B: Stream<Error=::Error> + 'static,
|
B: Stream<Error=::Error> + 'static,
|
||||||
@@ -238,10 +292,11 @@ where S: Service<Request = Request, Response = Response<B>, Error = ::Error> + '
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<I, B, S> fmt::Debug for Connection<I, B, S>
|
impl<I, S> fmt::Debug for Connection<I, S>
|
||||||
where S: Service,
|
where
|
||||||
B: Stream<Error=::Error>,
|
S: HyperService,
|
||||||
B::Item: AsRef<[u8]>,
|
S::ResponseBody: Stream<Error=::Error>,
|
||||||
|
<S::ResponseBody as Stream>::Item: AsRef<[u8]>,
|
||||||
{
|
{
|
||||||
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
||||||
f.debug_struct("Connection")
|
f.debug_struct("Connection")
|
||||||
|
|||||||
Reference in New Issue
Block a user