fix(client): send query parameters in Requests
This commit is contained in:
@@ -293,6 +293,7 @@ impl<H: Handler<T>, T: Transport> http::MessageHandler<T> for Message<H, T> {
|
|||||||
type Message = http::ClientMessage;
|
type Message = http::ClientMessage;
|
||||||
|
|
||||||
fn on_outgoing(&mut self, head: &mut RequestHead) -> Next {
|
fn on_outgoing(&mut self, head: &mut RequestHead) -> Next {
|
||||||
|
use ::url::Position;
|
||||||
let url = self.url.take().expect("Message.url is missing");
|
let url = self.url.take().expect("Message.url is missing");
|
||||||
if let Some(host) = url.host_str() {
|
if let Some(host) = url.host_str() {
|
||||||
head.headers.set(Host {
|
head.headers.set(Host {
|
||||||
@@ -300,7 +301,7 @@ impl<H: Handler<T>, T: Transport> http::MessageHandler<T> for Message<H, T> {
|
|||||||
port: url.port(),
|
port: url.port(),
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
head.subject.1 = RequestUri::AbsolutePath(url.path().to_owned());
|
head.subject.1 = RequestUri::AbsolutePath(url[Position::BeforePath..Position::AfterQuery].to_owned());
|
||||||
let mut req = self::request::new(head);
|
let mut req = self::request::new(head);
|
||||||
self.handler.on_request(&mut req)
|
self.handler.on_request(&mut req)
|
||||||
}
|
}
|
||||||
|
|||||||
103
tests/client.rs
103
tests/client.rs
@@ -7,7 +7,6 @@ use std::sync::mpsc;
|
|||||||
use std::time::Duration;
|
use std::time::Duration;
|
||||||
|
|
||||||
use hyper::client::{Handler, Request, Response, HttpConnector};
|
use hyper::client::{Handler, Request, Response, HttpConnector};
|
||||||
use hyper::header;
|
|
||||||
use hyper::{Method, StatusCode, Next, Encoder, Decoder};
|
use hyper::{Method, StatusCode, Next, Encoder, Decoder};
|
||||||
use hyper::net::HttpStream;
|
use hyper::net::HttpStream;
|
||||||
|
|
||||||
@@ -158,33 +157,91 @@ fn client() -> Client {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
macro_rules! test {
|
||||||
|
(
|
||||||
|
name: $name:ident,
|
||||||
|
server:
|
||||||
|
expected: $server_expected:expr,
|
||||||
|
reply: $server_reply:expr,
|
||||||
|
client:
|
||||||
|
request:
|
||||||
|
method: $client_method:ident,
|
||||||
|
url: $client_url:expr,
|
||||||
|
response:
|
||||||
|
status: $client_status:ident,
|
||||||
|
headers: [ $($client_headers:expr,)* ],
|
||||||
|
body: $client_body:expr
|
||||||
|
) => (
|
||||||
|
#[test]
|
||||||
|
fn $name() {
|
||||||
|
let server = TcpListener::bind("127.0.0.1:0").unwrap();
|
||||||
|
let addr = server.local_addr().unwrap();
|
||||||
|
let client = client();
|
||||||
|
let res = client.request(format!($client_url, addr=addr), opts().method(Method::$client_method));
|
||||||
|
|
||||||
#[test]
|
let mut inc = server.accept().unwrap().0;
|
||||||
fn client_get() {
|
inc.set_read_timeout(Some(Duration::from_secs(5))).unwrap();
|
||||||
let server = TcpListener::bind("127.0.0.1:0").unwrap();
|
inc.set_write_timeout(Some(Duration::from_secs(5))).unwrap();
|
||||||
let addr = server.local_addr().unwrap();
|
let mut buf = [0; 4096];
|
||||||
let client = client();
|
let n = inc.read(&mut buf).unwrap();
|
||||||
let res = client.request(format!("http://{}/", addr), opts().method(Method::Get));
|
let expected = format!($server_expected, addr=addr);
|
||||||
|
assert_eq!(s(&buf[..n]), expected);
|
||||||
|
|
||||||
let mut inc = server.accept().unwrap().0;
|
inc.write_all($server_reply.as_ref()).unwrap();
|
||||||
inc.set_read_timeout(Some(Duration::from_secs(5))).unwrap();
|
|
||||||
inc.set_write_timeout(Some(Duration::from_secs(5))).unwrap();
|
|
||||||
let mut buf = [0; 4096];
|
|
||||||
let n = inc.read(&mut buf).unwrap();
|
|
||||||
let expected = format!("GET / HTTP/1.1\r\nHost: {}\r\n\r\n", addr);
|
|
||||||
assert_eq!(s(&buf[..n]), expected);
|
|
||||||
|
|
||||||
inc.write_all(b"HTTP/1.1 200 OK\r\nContent-Length: 0\r\n\r\n").unwrap();
|
if let Msg::Head(head) = res.recv().unwrap() {
|
||||||
|
use hyper::header::*;
|
||||||
|
assert_eq!(head.status(), &StatusCode::$client_status);
|
||||||
|
$(
|
||||||
|
assert_eq!(head.headers().get(), Some(&$client_headers));
|
||||||
|
)*
|
||||||
|
} else {
|
||||||
|
panic!("we lost the head!");
|
||||||
|
}
|
||||||
|
//drop(inc);
|
||||||
|
|
||||||
if let Msg::Head(head) = res.recv().unwrap() {
|
assert!(res.recv().is_err());
|
||||||
assert_eq!(head.status(), &StatusCode::Ok);
|
}
|
||||||
assert_eq!(head.headers().get(), Some(&header::ContentLength(0)));
|
);
|
||||||
} else {
|
}
|
||||||
panic!("we lost the head!");
|
|
||||||
}
|
test! {
|
||||||
//drop(inc);
|
name: client_get,
|
||||||
|
|
||||||
|
server:
|
||||||
|
expected: "GET / HTTP/1.1\r\nHost: {addr}\r\n\r\n",
|
||||||
|
reply: "HTTP/1.1 200 OK\r\nContent-Length: 0\r\n\r\n",
|
||||||
|
|
||||||
|
client:
|
||||||
|
request:
|
||||||
|
method: Get,
|
||||||
|
url: "http://{addr}/",
|
||||||
|
response:
|
||||||
|
status: Ok,
|
||||||
|
headers: [
|
||||||
|
ContentLength(0),
|
||||||
|
],
|
||||||
|
body: None
|
||||||
|
}
|
||||||
|
|
||||||
|
test! {
|
||||||
|
name: client_get_query,
|
||||||
|
|
||||||
|
server:
|
||||||
|
expected: "GET /foo?key=val HTTP/1.1\r\nHost: {addr}\r\n\r\n",
|
||||||
|
reply: "HTTP/1.1 200 OK\r\nContent-Length: 0\r\n\r\n",
|
||||||
|
|
||||||
|
client:
|
||||||
|
request:
|
||||||
|
method: Get,
|
||||||
|
url: "http://{addr}/foo?key=val#dont_send_me",
|
||||||
|
response:
|
||||||
|
status: Ok,
|
||||||
|
headers: [
|
||||||
|
ContentLength(0),
|
||||||
|
],
|
||||||
|
body: None
|
||||||
|
|
||||||
assert!(res.recv().is_err());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
|
|||||||
Reference in New Issue
Block a user