Merge pull request #1507 from bluetech/cp-parts-service

Fix example & cherry-pick server::conn::Parts.service to master
This commit is contained in:
Sean McArthur
2018-05-04 13:03:57 -07:00
committed by GitHub
4 changed files with 12 additions and 8 deletions

View File

@@ -5,7 +5,7 @@ extern crate pretty_env_logger;
use std::env; use std::env;
use std::io::{self, Write}; use std::io::{self, Write};
use hyper::{Body, Client, Request}; use hyper::Client;
use hyper::rt::{self, Future, Stream}; use hyper::rt::{self, Future, Stream};
fn main() { fn main() {

View File

@@ -354,7 +354,7 @@ where
/// ///
/// Only works for HTTP/1 connections. HTTP/2 connections will panic. /// Only works for HTTP/1 connections. HTTP/2 connections will panic.
pub fn into_parts(self) -> Parts<T> { pub fn into_parts(self) -> Parts<T> {
let (io, read_buf) = match self.inner { let (io, read_buf, _) = match self.inner {
Either::A(h1) => h1.into_inner(), Either::A(h1) => h1.into_inner(),
Either::B(_h2) => { Either::B(_h2) => {
panic!("http2 cannot into_inner"); panic!("http2 cannot into_inner");

View File

@@ -27,7 +27,7 @@ pub(crate) trait Dispatch {
pub struct Server<S: Service> { pub struct Server<S: Service> {
in_flight: Option<S::Future>, in_flight: Option<S::Future>,
service: S, pub(crate) service: S,
} }
pub struct Client<B> { pub struct Client<B> {
@@ -58,8 +58,9 @@ where
self.conn.disable_keep_alive() self.conn.disable_keep_alive()
} }
pub fn into_inner(self) -> (I, Bytes) { pub fn into_inner(self) -> (I, Bytes, D) {
self.conn.into_inner() let (io, buf) = self.conn.into_inner();
(io, buf, self.dispatch)
} }
/// The "Future" poll function. Runs this dispatcher until the /// The "Future" poll function. Runs this dispatcher until the

View File

@@ -98,7 +98,7 @@ where
/// This allows taking apart a `Connection` at a later time, in order to /// This allows taking apart a `Connection` at a later time, in order to
/// reclaim the IO object, and additional related pieces. /// reclaim the IO object, and additional related pieces.
#[derive(Debug)] #[derive(Debug)]
pub struct Parts<T> { pub struct Parts<T, S> {
/// The original IO object used in the handshake. /// The original IO object used in the handshake.
pub io: T, pub io: T,
/// A buffer of bytes that have been read but not processed as HTTP. /// A buffer of bytes that have been read but not processed as HTTP.
@@ -110,6 +110,8 @@ pub struct Parts<T> {
/// You will want to check for any existing bytes if you plan to continue /// You will want to check for any existing bytes if you plan to continue
/// communicating on the IO object. /// communicating on the IO object.
pub read_buf: Bytes, pub read_buf: Bytes,
/// The `Service` used to serve this connection.
pub service: S,
_inner: (), _inner: (),
} }
@@ -335,8 +337,8 @@ where
/// This should only be called after `poll_without_shutdown` signals /// This should only be called after `poll_without_shutdown` signals
/// that the connection is "done". Otherwise, it may not have finished /// that the connection is "done". Otherwise, it may not have finished
/// flushing all necessary HTTP bytes. /// flushing all necessary HTTP bytes.
pub fn into_parts(self) -> Parts<I> { pub fn into_parts(self) -> Parts<I, S> {
let (io, read_buf) = match self.conn { let (io, read_buf, dispatch) = match self.conn {
Either::A(h1) => { Either::A(h1) => {
h1.into_inner() h1.into_inner()
}, },
@@ -347,6 +349,7 @@ where
Parts { Parts {
io: io, io: io,
read_buf: read_buf, read_buf: read_buf,
service: dispatch.service,
_inner: (), _inner: (),
} }
} }