feat(lib): remove extern Url type usage
BREAKING CHANGE: The `Url` type is no longer used. Any instance in the `Client` API has had it replaced with `hyper::Uri`. This also means `Error::Uri` has changed types to `hyper::error::UriError`. The type `hyper::header::parsing::HTTP_VALUE` has been made private, as an implementation detail. The function `http_percent_encoding` should be used instead.
This commit is contained in:
@@ -7,7 +7,7 @@ use tokio_io::{AsyncRead, AsyncWrite};
|
||||
use tokio::reactor::Handle;
|
||||
use tokio::net::{TcpStream, TcpStreamNew};
|
||||
use tokio_service::Service;
|
||||
use Url;
|
||||
use Uri;
|
||||
|
||||
use super::dns;
|
||||
|
||||
@@ -15,25 +15,25 @@ use super::dns;
|
||||
///
|
||||
/// This trait is not implemented directly, and only exists to make
|
||||
/// the intent clearer. A connector should implement `Service` with
|
||||
/// `Request=Url` and `Response: Io` instead.
|
||||
pub trait Connect: Service<Request=Url, Error=io::Error> + 'static {
|
||||
/// `Request=Uri` and `Response: Io` instead.
|
||||
pub trait Connect: Service<Request=Uri, Error=io::Error> + 'static {
|
||||
/// The connected Io Stream.
|
||||
type Output: AsyncRead + AsyncWrite + 'static;
|
||||
/// A Future that will resolve to the connected Stream.
|
||||
type Future: Future<Item=Self::Output, Error=io::Error> + 'static;
|
||||
/// Connect to a remote address.
|
||||
fn connect(&self, Url) -> <Self as Connect>::Future;
|
||||
fn connect(&self, Uri) -> <Self as Connect>::Future;
|
||||
}
|
||||
|
||||
impl<T> Connect for T
|
||||
where T: Service<Request=Url, Error=io::Error> + 'static,
|
||||
where T: Service<Request=Uri, Error=io::Error> + 'static,
|
||||
T::Response: AsyncRead + AsyncWrite,
|
||||
T::Future: Future<Error=io::Error>,
|
||||
{
|
||||
type Output = T::Response;
|
||||
type Future = T::Future;
|
||||
|
||||
fn connect(&self, url: Url) -> <Self as Connect>::Future {
|
||||
fn connect(&self, url: Uri) -> <Self as Connect>::Future {
|
||||
self.call(url)
|
||||
}
|
||||
}
|
||||
@@ -66,21 +66,21 @@ impl fmt::Debug for HttpConnector {
|
||||
}
|
||||
|
||||
impl Service for HttpConnector {
|
||||
type Request = Url;
|
||||
type Request = Uri;
|
||||
type Response = TcpStream;
|
||||
type Error = io::Error;
|
||||
type Future = HttpConnecting;
|
||||
|
||||
fn call(&self, url: Url) -> Self::Future {
|
||||
fn call(&self, url: Uri) -> Self::Future {
|
||||
debug!("Http::connect({:?})", url);
|
||||
let host = match url.host_str() {
|
||||
let host = match url.host() {
|
||||
Some(s) => s,
|
||||
None => return HttpConnecting {
|
||||
state: State::Error(Some(io::Error::new(io::ErrorKind::InvalidInput, "invalid url"))),
|
||||
handle: self.handle.clone(),
|
||||
},
|
||||
};
|
||||
let port = url.port_or_known_default().unwrap_or(80);
|
||||
let port = url.port().unwrap_or(80);
|
||||
|
||||
HttpConnecting {
|
||||
state: State::Resolving(self.dns.resolve(host.into(), port)),
|
||||
@@ -185,13 +185,12 @@ impl<S: SslClient> HttpsConnector<S> {
|
||||
mod tests {
|
||||
use std::io;
|
||||
use tokio::reactor::Core;
|
||||
use Url;
|
||||
use super::{Connect, HttpConnector};
|
||||
|
||||
#[test]
|
||||
fn test_non_http_url() {
|
||||
let mut core = Core::new().unwrap();
|
||||
let url = Url::parse("file:///home/sean/foo.txt").unwrap();
|
||||
let url = "/foo/bar?baz".parse().unwrap();
|
||||
let connector = HttpConnector::new(1, &core.handle());
|
||||
|
||||
assert_eq!(core.run(connector.connect(url)).unwrap_err().kind(), io::ErrorKind::InvalidInput);
|
||||
|
||||
@@ -10,7 +10,7 @@ use std::marker::PhantomData;
|
||||
use std::rc::Rc;
|
||||
use std::time::Duration;
|
||||
|
||||
use futures::{Poll, Async, Future, Stream};
|
||||
use futures::{future, Poll, Async, Future, Stream};
|
||||
use futures::unsync::oneshot;
|
||||
use tokio_io::{AsyncRead, AsyncWrite};
|
||||
use tokio::reactor::Handle;
|
||||
@@ -24,7 +24,7 @@ use header::{Headers, Host};
|
||||
use http::{self, TokioBody};
|
||||
use method::Method;
|
||||
use self::pool::{Pool, Pooled};
|
||||
use Url;
|
||||
use uri::{self, Uri};
|
||||
|
||||
pub use self::connect::{HttpConnector, Connect};
|
||||
pub use self::request::Request;
|
||||
@@ -95,7 +95,7 @@ where C: Connect,
|
||||
{
|
||||
/// Send a GET Request using this Client.
|
||||
#[inline]
|
||||
pub fn get(&self, url: Url) -> FutureResponse {
|
||||
pub fn get(&self, url: Uri) -> FutureResponse {
|
||||
self.request(Request::new(Method::Get, url))
|
||||
}
|
||||
|
||||
@@ -135,18 +135,30 @@ where C: Connect,
|
||||
type Future = FutureResponse;
|
||||
|
||||
fn call(&self, req: Self::Request) -> Self::Future {
|
||||
let url = req.url().clone();
|
||||
let url = req.uri().clone();
|
||||
let domain = match uri::scheme_and_authority(&url) {
|
||||
Some(uri) => uri,
|
||||
None => {
|
||||
return FutureResponse(Box::new(future::err(::Error::Io(
|
||||
io::Error::new(
|
||||
io::ErrorKind::InvalidInput,
|
||||
"invalid URI for Client Request"
|
||||
)
|
||||
))));
|
||||
}
|
||||
};
|
||||
let host = Host::new(domain.host().expect("authority implies host").to_owned(), domain.port());
|
||||
let (mut head, body) = request::split(req);
|
||||
let mut headers = Headers::new();
|
||||
headers.set(Host::new(url.host_str().unwrap().to_owned(), url.port()));
|
||||
headers.set(host);
|
||||
headers.extend(head.headers.iter());
|
||||
head.headers = headers;
|
||||
|
||||
let checkout = self.pool.checkout(&url[..::url::Position::BeforePath]);
|
||||
let checkout = self.pool.checkout(domain.as_ref());
|
||||
let connect = {
|
||||
let handle = self.handle.clone();
|
||||
let pool = self.pool.clone();
|
||||
let pool_key = Rc::new(url[..::url::Position::BeforePath].to_owned());
|
||||
let pool_key = Rc::new(domain.to_string());
|
||||
self.connector.connect(url)
|
||||
.map(move |io| {
|
||||
let (tx, rx) = oneshot::channel();
|
||||
|
||||
@@ -1,18 +1,15 @@
|
||||
use std::fmt;
|
||||
|
||||
use Url;
|
||||
|
||||
use header::Headers;
|
||||
use http::{Body, RequestHead};
|
||||
use method::Method;
|
||||
use uri::Uri;
|
||||
use uri::{self, Uri};
|
||||
use version::HttpVersion;
|
||||
use std::str::FromStr;
|
||||
|
||||
/// A client request to a remote server.
|
||||
pub struct Request<B = Body> {
|
||||
method: Method,
|
||||
url: Url,
|
||||
uri: Uri,
|
||||
version: HttpVersion,
|
||||
headers: Headers,
|
||||
body: Option<B>,
|
||||
@@ -22,10 +19,10 @@ pub struct Request<B = Body> {
|
||||
impl<B> Request<B> {
|
||||
/// Construct a new Request.
|
||||
#[inline]
|
||||
pub fn new(method: Method, url: Url) -> Request<B> {
|
||||
pub fn new(method: Method, uri: Uri) -> Request<B> {
|
||||
Request {
|
||||
method: method,
|
||||
url: url,
|
||||
uri: uri,
|
||||
version: HttpVersion::default(),
|
||||
headers: Headers::new(),
|
||||
body: None,
|
||||
@@ -33,9 +30,9 @@ impl<B> Request<B> {
|
||||
}
|
||||
}
|
||||
|
||||
/// Read the Request Url.
|
||||
/// Read the Request Uri.
|
||||
#[inline]
|
||||
pub fn url(&self) -> &Url { &self.url }
|
||||
pub fn uri(&self) -> &Uri { &self.uri }
|
||||
|
||||
/// Read the Request Version.
|
||||
#[inline]
|
||||
@@ -57,9 +54,9 @@ impl<B> Request<B> {
|
||||
#[inline]
|
||||
pub fn headers_mut(&mut self) -> &mut Headers { &mut self.headers }
|
||||
|
||||
/// Set the `Url` of this request.
|
||||
/// Set the `Uri` of this request.
|
||||
#[inline]
|
||||
pub fn set_url(&mut self, url: Url) { self.url = url; }
|
||||
pub fn set_uri(&mut self, uri: Uri) { self.uri = uri; }
|
||||
|
||||
/// Set the `HttpVersion` of this request.
|
||||
#[inline]
|
||||
@@ -81,7 +78,7 @@ impl<B> fmt::Debug for Request<B> {
|
||||
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
||||
f.debug_struct("Request")
|
||||
.field("method", &self.method)
|
||||
.field("url", &self.url)
|
||||
.field("uri", &self.uri)
|
||||
.field("version", &self.version)
|
||||
.field("headers", &self.headers)
|
||||
.finish()
|
||||
@@ -90,9 +87,9 @@ impl<B> fmt::Debug for Request<B> {
|
||||
|
||||
pub fn split<B>(req: Request<B>) -> (RequestHead, Option<B>) {
|
||||
let uri = if req.is_proxy {
|
||||
Uri::from(req.url)
|
||||
req.uri
|
||||
} else {
|
||||
Uri::from_str(&req.url[::url::Position::BeforePath..::url::Position::AfterQuery]).expect("url is not uri")
|
||||
uri::origin_form(&req.uri)
|
||||
};
|
||||
let head = RequestHead {
|
||||
subject: ::http::RequestLine(req.method, uri),
|
||||
|
||||
Reference in New Issue
Block a user