impl TryFrom http::Request (#887)
This commit is contained in:
@@ -515,8 +515,10 @@ pub(crate) fn extract_authority(url: &mut Url) -> Option<(String, Option<String>
|
|||||||
None
|
None
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<T> From<HttpRequest<T>> for Request where T:Into<Body>{
|
impl<T> TryFrom<HttpRequest<T>> for Request where T:Into<Body>{
|
||||||
fn from(req: HttpRequest<T>) -> Self {
|
type Error = crate::Error;
|
||||||
|
|
||||||
|
fn try_from(req: HttpRequest<T>) -> crate::Result<Self> {
|
||||||
let (parts, body) = req.into_parts();
|
let (parts, body) = req.into_parts();
|
||||||
let Parts {
|
let Parts {
|
||||||
method,
|
method,
|
||||||
@@ -524,14 +526,15 @@ impl<T> From<HttpRequest<T>> for Request where T:Into<Body>{
|
|||||||
headers,
|
headers,
|
||||||
..
|
..
|
||||||
} = parts;
|
} = parts;
|
||||||
let url = Url::parse(&uri.to_string()).unwrap();
|
let url = Url::parse(&uri.to_string())
|
||||||
Request {
|
.map_err(crate::error::builder)?;
|
||||||
|
Ok(Request {
|
||||||
method,
|
method,
|
||||||
url,
|
url,
|
||||||
headers,
|
headers,
|
||||||
body: Some(body.into()),
|
body: Some(body.into()),
|
||||||
timeout: None,
|
timeout: None,
|
||||||
}
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -541,6 +544,7 @@ mod tests {
|
|||||||
use crate::Method;
|
use crate::Method;
|
||||||
use serde::Serialize;
|
use serde::Serialize;
|
||||||
use std::collections::BTreeMap;
|
use std::collections::BTreeMap;
|
||||||
|
use std::convert::TryFrom;
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn add_query_append() {
|
fn add_query_append() {
|
||||||
@@ -714,7 +718,7 @@ mod tests {
|
|||||||
.header("User-Agent", "my-awesome-agent/1.0")
|
.header("User-Agent", "my-awesome-agent/1.0")
|
||||||
.body("test test test")
|
.body("test test test")
|
||||||
.unwrap();
|
.unwrap();
|
||||||
let req: Request = http_request.into();
|
let req: Request = Request::try_from(http_request).unwrap();
|
||||||
assert_eq!(req.body().is_none(), false);
|
assert_eq!(req.body().is_none(), false);
|
||||||
let test_data = b"test test test";
|
let test_data = b"test test test";
|
||||||
assert_eq!(req.body().unwrap().as_bytes(), Some(&test_data[..]));
|
assert_eq!(req.body().unwrap().as_bytes(), Some(&test_data[..]));
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ use std::convert::TryFrom;
|
|||||||
use std::time::Duration;
|
use std::time::Duration;
|
||||||
|
|
||||||
use base64::encode;
|
use base64::encode;
|
||||||
|
use http::{Request as HttpRequest, request::Parts};
|
||||||
use serde::Serialize;
|
use serde::Serialize;
|
||||||
#[cfg(feature = "json")]
|
#[cfg(feature = "json")]
|
||||||
use serde_json;
|
use serde_json;
|
||||||
@@ -578,6 +579,28 @@ impl RequestBuilder {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl<T> TryFrom<HttpRequest<T>> for Request where T:Into<Body> {
|
||||||
|
type Error = crate::Error;
|
||||||
|
|
||||||
|
fn try_from(req: HttpRequest<T>) -> crate::Result<Self> {
|
||||||
|
let (parts, body) = req.into_parts();
|
||||||
|
let Parts {
|
||||||
|
method,
|
||||||
|
uri,
|
||||||
|
headers,
|
||||||
|
..
|
||||||
|
} = parts;
|
||||||
|
let url = Url::parse(&uri.to_string())
|
||||||
|
.map_err(crate::error::builder)?;
|
||||||
|
let mut inner = async_impl::Request::new(method, url);
|
||||||
|
async_impl::request::replace_headers(inner.headers_mut(), headers);
|
||||||
|
Ok(Request {
|
||||||
|
body: Some(body.into()),
|
||||||
|
inner,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl fmt::Debug for Request {
|
impl fmt::Debug for Request {
|
||||||
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
||||||
fmt_request_fields(&mut f.debug_struct("Request"), self).finish()
|
fmt_request_fields(&mut f.debug_struct("Request"), self).finish()
|
||||||
@@ -595,6 +618,7 @@ fn fmt_request_fields<'a, 'b>(
|
|||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
|
use super::{HttpRequest, Request};
|
||||||
use super::super::{body, Client};
|
use super::super::{body, Client};
|
||||||
use crate::header::{HeaderMap, HeaderValue, ACCEPT, CONTENT_TYPE, HOST};
|
use crate::header::{HeaderMap, HeaderValue, ACCEPT, CONTENT_TYPE, HOST};
|
||||||
use crate::Method;
|
use crate::Method;
|
||||||
@@ -603,6 +627,7 @@ mod tests {
|
|||||||
use serde_json;
|
use serde_json;
|
||||||
use serde_urlencoded;
|
use serde_urlencoded;
|
||||||
use std::collections::{BTreeMap, HashMap};
|
use std::collections::{BTreeMap, HashMap};
|
||||||
|
use std::convert::TryFrom;
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn basic_get_request() {
|
fn basic_get_request() {
|
||||||
@@ -923,4 +948,21 @@ mod tests {
|
|||||||
assert_eq!(req.url().as_str(), "https://localhost/");
|
assert_eq!(req.url().as_str(), "https://localhost/");
|
||||||
assert_eq!(req.headers()["authorization"], "Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==");
|
assert_eq!(req.headers()["authorization"], "Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn convert_from_http_request() {
|
||||||
|
let http_request = HttpRequest::builder().method("GET")
|
||||||
|
.uri("http://localhost/")
|
||||||
|
.header("User-Agent", "my-awesome-agent/1.0")
|
||||||
|
.body("test test test")
|
||||||
|
.unwrap();
|
||||||
|
let req: Request = Request::try_from(http_request).unwrap();
|
||||||
|
assert_eq!(req.body().is_none(), false);
|
||||||
|
let test_data = b"test test test";
|
||||||
|
assert_eq!(req.body().unwrap().as_bytes(), Some(&test_data[..]));
|
||||||
|
let headers = req.headers();
|
||||||
|
assert_eq!(headers.get("User-Agent").unwrap(), "my-awesome-agent/1.0");
|
||||||
|
assert_eq!(req.method(), Method::GET);
|
||||||
|
assert_eq!(req.url().as_str(), "http://localhost/");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user