Skip to content

Commit ce3dbd1

Browse files
committed
Merge pull request #801 from hyperium/client-query
fix(client): send query parameters in Requests
2 parents 5d75c72 + 2d9aea8 commit ce3dbd1

File tree

2 files changed

+82
-24
lines changed

2 files changed

+82
-24
lines changed

src/client/mod.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -293,14 +293,15 @@ impl<H: Handler<T>, T: Transport> http::MessageHandler<T> for Message<H, T> {
293293
type Message = http::ClientMessage;
294294

295295
fn on_outgoing(&mut self, head: &mut RequestHead) -> Next {
296+
use ::url::Position;
296297
let url = self.url.take().expect("Message.url is missing");
297298
if let Some(host) = url.host_str() {
298299
head.headers.set(Host {
299300
hostname: host.to_owned(),
300301
port: url.port(),
301302
});
302303
}
303-
head.subject.1 = RequestUri::AbsolutePath(url.path().to_owned());
304+
head.subject.1 = RequestUri::AbsolutePath(url[Position::BeforePath..Position::AfterQuery].to_owned());
304305
let mut req = self::request::new(head);
305306
self.handler.on_request(&mut req)
306307
}

tests/client.rs

Lines changed: 80 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ use std::sync::mpsc;
77
use std::time::Duration;
88

99
use hyper::client::{Handler, Request, Response, HttpConnector};
10-
use hyper::header;
1110
use hyper::{Method, StatusCode, Next, Encoder, Decoder};
1211
use hyper::net::HttpStream;
1312

@@ -158,33 +157,91 @@ fn client() -> Client {
158157
}
159158
}
160159

160+
macro_rules! test {
161+
(
162+
name: $name:ident,
163+
server:
164+
expected: $server_expected:expr,
165+
reply: $server_reply:expr,
166+
client:
167+
request:
168+
method: $client_method:ident,
169+
url: $client_url:expr,
170+
response:
171+
status: $client_status:ident,
172+
headers: [ $($client_headers:expr,)* ],
173+
body: $client_body:expr
174+
) => (
175+
#[test]
176+
fn $name() {
177+
let server = TcpListener::bind("127.0.0.1:0").unwrap();
178+
let addr = server.local_addr().unwrap();
179+
let client = client();
180+
let res = client.request(format!($client_url, addr=addr), opts().method(Method::$client_method));
161181

162-
#[test]
163-
fn client_get() {
164-
let server = TcpListener::bind("127.0.0.1:0").unwrap();
165-
let addr = server.local_addr().unwrap();
166-
let client = client();
167-
let res = client.request(format!("http://{}/", addr), opts().method(Method::Get));
182+
let mut inc = server.accept().unwrap().0;
183+
inc.set_read_timeout(Some(Duration::from_secs(5))).unwrap();
184+
inc.set_write_timeout(Some(Duration::from_secs(5))).unwrap();
185+
let mut buf = [0; 4096];
186+
let n = inc.read(&mut buf).unwrap();
187+
let expected = format!($server_expected, addr=addr);
188+
assert_eq!(s(&buf[..n]), expected);
168189

169-
let mut inc = server.accept().unwrap().0;
170-
inc.set_read_timeout(Some(Duration::from_secs(5))).unwrap();
171-
inc.set_write_timeout(Some(Duration::from_secs(5))).unwrap();
172-
let mut buf = [0; 4096];
173-
let n = inc.read(&mut buf).unwrap();
174-
let expected = format!("GET / HTTP/1.1\r\nHost: {}\r\n\r\n", addr);
175-
assert_eq!(s(&buf[..n]), expected);
190+
inc.write_all($server_reply.as_ref()).unwrap();
176191

177-
inc.write_all(b"HTTP/1.1 200 OK\r\nContent-Length: 0\r\n\r\n").unwrap();
192+
if let Msg::Head(head) = res.recv().unwrap() {
193+
use hyper::header::*;
194+
assert_eq!(head.status(), &StatusCode::$client_status);
195+
$(
196+
assert_eq!(head.headers().get(), Some(&$client_headers));
197+
)*
198+
} else {
199+
panic!("we lost the head!");
200+
}
201+
//drop(inc);
178202

179-
if let Msg::Head(head) = res.recv().unwrap() {
180-
assert_eq!(head.status(), &StatusCode::Ok);
181-
assert_eq!(head.headers().get(), Some(&header::ContentLength(0)));
182-
} else {
183-
panic!("we lost the head!");
184-
}
185-
//drop(inc);
203+
assert!(res.recv().is_err());
204+
}
205+
);
206+
}
207+
208+
test! {
209+
name: client_get,
210+
211+
server:
212+
expected: "GET / HTTP/1.1\r\nHost: {addr}\r\n\r\n",
213+
reply: "HTTP/1.1 200 OK\r\nContent-Length: 0\r\n\r\n",
214+
215+
client:
216+
request:
217+
method: Get,
218+
url: "http://{addr}/",
219+
response:
220+
status: Ok,
221+
headers: [
222+
ContentLength(0),
223+
],
224+
body: None
225+
}
226+
227+
test! {
228+
name: client_get_query,
229+
230+
server:
231+
expected: "GET /foo?key=val HTTP/1.1\r\nHost: {addr}\r\n\r\n",
232+
reply: "HTTP/1.1 200 OK\r\nContent-Length: 0\r\n\r\n",
233+
234+
client:
235+
request:
236+
method: Get,
237+
url: "http://{addr}/foo?key=val#dont_send_me",
238+
response:
239+
status: Ok,
240+
headers: [
241+
ContentLength(0),
242+
],
243+
body: None
186244

187-
assert!(res.recv().is_err());
188245
}
189246

190247
#[test]

0 commit comments

Comments
 (0)