Make ResponseBuilderExt not target-dependent

This commit is contained in:
Jonas Platte
2021-08-25 10:57:10 +02:00
committed by Sean McArthur
parent 3879694c09
commit 1be9c34f01
4 changed files with 50 additions and 38 deletions

View File

@@ -1,7 +1,7 @@
pub use self::body::Body; pub use self::body::Body;
pub use self::client::{Client, ClientBuilder}; pub use self::client::{Client, ClientBuilder};
pub use self::request::{Request, RequestBuilder}; pub use self::request::{Request, RequestBuilder};
pub use self::response::{Response, ResponseBuilderExt}; pub use self::response::Response;
#[cfg(feature = "blocking")] #[cfg(feature = "blocking")]
pub(crate) use self::decoder::Decoder; pub(crate) use self::decoder::Decoder;

View File

@@ -20,6 +20,7 @@ use super::body::Body;
use super::decoder::{Accepts, Decoder}; use super::decoder::{Accepts, Decoder};
#[cfg(feature = "cookies")] #[cfg(feature = "cookies")]
use crate::cookie; use crate::cookie;
use crate::response::ResponseUrl;
/// A Response to a submitted `Request`. /// A Response to a submitted `Request`.
pub struct Response { pub struct Response {
@@ -426,45 +427,13 @@ impl From<Response> for Body {
} }
} }
#[derive(Debug, Clone, PartialEq)]
struct ResponseUrl(Url);
/// Extension trait for http::response::Builder objects
///
/// Allows the user to add a `Url` to the http::Response
pub trait ResponseBuilderExt {
/// A builder method for the `http::response::Builder` type that allows the user to add a `Url`
/// to the `http::Response`
fn url(self, url: Url) -> Self;
}
impl ResponseBuilderExt for http::response::Builder {
fn url(self, url: Url) -> Self {
self.extension(ResponseUrl(url))
}
}
#[cfg(test)] #[cfg(test)]
mod tests { mod tests {
use super::{Response, ResponseBuilderExt, ResponseUrl}; use super::Response;
use crate::ResponseBuilderExt;
use http::response::Builder; use http::response::Builder;
use url::Url; use url::Url;
#[test]
fn test_response_builder_ext() {
let url = Url::parse("http://example.com").unwrap();
let response = Builder::new()
.status(200)
.url(url.clone())
.body(())
.unwrap();
assert_eq!(
response.extensions().get::<ResponseUrl>(),
Some(&ResponseUrl(url))
);
}
#[test] #[test]
fn test_from_http_response() { fn test_from_http_response() {
let url = Url::parse("http://example.com").unwrap(); let url = Url::parse("http://example.com").unwrap();
@@ -475,7 +444,7 @@ mod tests {
.unwrap(); .unwrap();
let response = Response::from(response); let response = Response::from(response);
assert_eq!(response.status, 200); assert_eq!(response.status(), 200);
assert_eq!(response.url, Box::new(url)); assert_eq!(*response.url(), url);
} }
} }

View File

@@ -226,9 +226,11 @@ pub use url::Url;
#[macro_use] #[macro_use]
mod error; mod error;
mod into_url; mod into_url;
mod response;
pub use self::error::{Error, Result}; pub use self::error::{Error, Result};
pub use self::into_url::IntoUrl; pub use self::into_url::IntoUrl;
pub use self::response::ResponseBuilderExt;
/// Shortcut method to quickly make a `GET` request. /// Shortcut method to quickly make a `GET` request.
/// ///
@@ -294,7 +296,7 @@ if_hyper! {
doctest!("../README.md"); doctest!("../README.md");
pub use self::async_impl::{ pub use self::async_impl::{
Body, Client, ClientBuilder, Request, RequestBuilder, Response, ResponseBuilderExt, Body, Client, ClientBuilder, Request, RequestBuilder, Response,
}; };
pub use self::proxy::Proxy; pub use self::proxy::Proxy;
#[cfg(feature = "__tls")] #[cfg(feature = "__tls")]

41
src/response.rs Normal file
View File

@@ -0,0 +1,41 @@
use url::Url;
#[derive(Debug, Clone, PartialEq)]
pub(crate) struct ResponseUrl(pub Url);
/// Extension trait for http::response::Builder objects
///
/// Allows the user to add a `Url` to the http::Response
pub trait ResponseBuilderExt {
/// A builder method for the `http::response::Builder` type that allows the user to add a `Url`
/// to the `http::Response`
fn url(self, url: Url) -> Self;
}
impl ResponseBuilderExt for http::response::Builder {
fn url(self, url: Url) -> Self {
self.extension(ResponseUrl(url))
}
}
#[cfg(test)]
mod tests {
use super::{ResponseBuilderExt, ResponseUrl};
use http::response::Builder;
use url::Url;
#[test]
fn test_response_builder_ext() {
let url = Url::parse("http://example.com").unwrap();
let response = Builder::new()
.status(200)
.url(url.clone())
.body(())
.unwrap();
assert_eq!(
response.extensions().get::<ResponseUrl>(),
Some(&ResponseUrl(url))
);
}
}