Skip to content

Commit

Permalink
feat(client): add Request.set_proxy for HTTP proxy requests
Browse files Browse the repository at this point in the history
Closes #1056
  • Loading branch information
seanmonstar committed Mar 7, 2017
1 parent 88eaaa0 commit e871411
Show file tree
Hide file tree
Showing 2 changed files with 45 additions and 1 deletion.
15 changes: 14 additions & 1 deletion src/client/request.rs
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ pub struct Request<B = Body> {
version: HttpVersion,
headers: Headers,
body: Option<B>,
is_proxy: bool,
}

impl<B> Request<B> {
Expand All @@ -28,6 +29,7 @@ impl<B> Request<B> {
version: HttpVersion::default(),
headers: Headers::new(),
body: None,
is_proxy: false,
}
}

Expand Down Expand Up @@ -66,6 +68,13 @@ impl<B> Request<B> {
/// Set the body of the request.
#[inline]
pub fn set_body<T: Into<B>>(&mut self, body: T) { self.body = Some(body.into()); }

/// Set that the URI should use the absolute form.
///
/// This is only needed when talking to HTTP/1 proxies to URLs not
/// protected by TLS.
#[inline]
pub fn set_proxy(&mut self, is_proxy: bool) { self.is_proxy = is_proxy; }
}

impl<B> fmt::Debug for Request<B> {
Expand All @@ -80,7 +89,11 @@ impl<B> fmt::Debug for Request<B> {
}

pub fn split<B>(req: Request<B>) -> (RequestHead, Option<B>) {
let uri = Uri::from_str(&req.url[::url::Position::BeforePath..::url::Position::AfterQuery]).expect("url is uri");
let uri = if req.is_proxy {
Uri::from(req.url)
} else {
Uri::from_str(&req.url[::url::Position::BeforePath..::url::Position::AfterQuery]).expect("url is not uri")
};
let head = RequestHead {
subject: ::http::RequestLine(req.method, uri),
headers: req.headers,
Expand Down
31 changes: 31 additions & 0 deletions tests/client.rs
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ macro_rules! test {
url: $client_url:expr,
headers: [ $($request_headers:expr,)* ],
body: $request_body:expr,
proxy: $request_proxy:expr,

response:
status: $client_status:ident,
Expand All @@ -61,6 +62,8 @@ macro_rules! test {
let body: &'static str = body;
req.set_body(body);
}
req.set_proxy($request_proxy);

let res = client.request(req);

let (tx, rx) = oneshot::channel();
Expand Down Expand Up @@ -109,6 +112,7 @@ test! {
url: "http://{addr}/",
headers: [],
body: None,
proxy: false,
response:
status: Ok,
headers: [
Expand All @@ -130,6 +134,7 @@ test! {
url: "http://{addr}/foo?key=val#dont_send_me",
headers: [],
body: None,
proxy: false,
response:
status: Ok,
headers: [
Expand Down Expand Up @@ -159,6 +164,7 @@ test! {
ContentLength(7),
],
body: Some("foo bar"),
proxy: false,
response:
status: Ok,
headers: [],
Expand Down Expand Up @@ -188,6 +194,31 @@ test! {
TransferEncoding::chunked(),
],
body: Some("foo bar baz"),
proxy: false,
response:
status: Ok,
headers: [],
body: None,
}

test! {
name: client_http_proxy,

server:
expected: "\
GET http://{addr}/proxy HTTP/1.1\r\n\
Host: {addr}\r\n\
\r\n\
",
reply: REPLY_OK,

client:
request:
method: Get,
url: "http://{addr}/proxy",
headers: [],
body: None,
proxy: true,
response:
status: Ok,
headers: [],
Expand Down

0 comments on commit e871411

Please sign in to comment.