Skip to content

Commit 9036443

Browse files
GuillaumeGomezseanmonstar
authored andcommitted
feat(uri): redesign RequestUri type into Uri
Closes #1000 BREAKING CHANGE: The name of `RequestUri` has changed to `Uri`. It is no longer an `enum`, but an opaque struct with getter methods.
1 parent 1868f85 commit 9036443

File tree

10 files changed

+294
-133
lines changed

10 files changed

+294
-133
lines changed

Diff for: examples/server.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -23,12 +23,12 @@ impl Service for Echo {
2323

2424
fn call(&self, req: Request) -> Self::Future {
2525
::futures::finished(match (req.method(), req.path()) {
26-
(&Get, Some("/")) | (&Get, Some("/echo")) => {
26+
(&Get, "/") | (&Get, "/echo") => {
2727
Response::new()
2828
.with_header(ContentLength(INDEX.len() as u64))
2929
.with_body(INDEX)
3030
},
31-
(&Post, Some("/echo")) => {
31+
(&Post, "/echo") => {
3232
let mut res = Response::new();
3333
if let Some(len) = req.headers().get::<ContentLength>() {
3434
res.headers_mut().set(len.clone());

Diff for: src/client/mod.rs

-6
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@ use header::{Headers, Host};
2323
use http::{self, TokioBody};
2424
use method::Method;
2525
use self::pool::{Pool, Pooled};
26-
use uri::RequestUri;
2726
use {Url};
2827

2928
pub use self::connect::{HttpConnector, Connect};
@@ -120,15 +119,10 @@ impl<C: Connect> Service for Client<C> {
120119

121120
fn call(&self, req: Request) -> Self::Future {
122121
let url = req.url().clone();
123-
124122
let (mut head, body) = request::split(req);
125123
let mut headers = Headers::new();
126124
headers.set(Host::new(url.host_str().unwrap().to_owned(), url.port()));
127125
headers.extend(head.headers.iter());
128-
head.subject.1 = RequestUri::AbsolutePath {
129-
path: url.path().to_owned(),
130-
query: url.query().map(ToOwned::to_owned),
131-
};
132126
head.headers = headers;
133127

134128
let checkout = self.pool.checkout(&url[..::url::Position::BeforePath]);

Diff for: src/client/request.rs

+3-2
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use Url;
55
use header::Headers;
66
use http::{Body, RequestHead};
77
use method::Method;
8-
use uri::RequestUri;
8+
use uri::Uri;
99
use version::HttpVersion;
1010

1111
/// A client request to a remote server.
@@ -79,8 +79,9 @@ impl fmt::Debug for Request {
7979
}
8080

8181
pub fn split(req: Request) -> (RequestHead, Option<Body>) {
82+
let uri = Uri::new(&req.url[::url::Position::BeforePath..::url::Position::AfterQuery]).expect("url is uri");
8283
let head = RequestHead {
83-
subject: ::http::RequestLine(req.method, RequestUri::AbsoluteUri(req.url)),
84+
subject: ::http::RequestLine(req.method, uri),
8485
headers: req.headers,
8586
version: req.version,
8687
};

Diff for: src/error.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ pub type Result<T> = ::std::result::Result<T, Error>;
3131
pub enum Error {
3232
/// An invalid `Method`, such as `GE,T`.
3333
Method,
34-
/// An invalid `RequestUri`, such as `exam ple.domain`.
34+
/// An invalid `Uri`, such as `exam ple.domain`.
3535
Uri(url::ParseError),
3636
/// An invalid `HttpVersion`, such as `HTP/1.1`
3737
Version,

Diff for: src/http/conn.rs

+2-4
Original file line numberDiff line numberDiff line change
@@ -574,6 +574,7 @@ mod tests {
574574
use mock::AsyncIo;
575575

576576
use super::{Conn, Writing};
577+
use ::uri::Uri;
577578

578579
#[test]
579580
fn test_conn_init_read() {
@@ -585,10 +586,7 @@ mod tests {
585586
match conn.poll().unwrap() {
586587
Async::Ready(Some(Frame::Message { message, body: false })) => {
587588
assert_eq!(message, MessageHead {
588-
subject: ::http::RequestLine(::Get, ::RequestUri::AbsolutePath {
589-
path: "/".to_string(),
590-
query: None,
591-
}),
589+
subject: ::http::RequestLine(::Get, Uri::new("/").unwrap()),
592590
.. MessageHead::default()
593591
})
594592
},

Diff for: src/http/mod.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ use header::{Connection, ConnectionOption};
66
use header::Headers;
77
use method::Method;
88
use status::StatusCode;
9-
use uri::RequestUri;
9+
use uri::Uri;
1010
use version::HttpVersion;
1111
use version::HttpVersion::{Http10, Http11};
1212

@@ -51,7 +51,7 @@ pub struct MessageHead<S> {
5151
pub type RequestHead = MessageHead<RequestLine>;
5252

5353
#[derive(Debug, Default, PartialEq)]
54-
pub struct RequestLine(pub Method, pub RequestUri);
54+
pub struct RequestLine(pub Method, pub Uri);
5555

5656
impl fmt::Display for RequestLine {
5757
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {

Diff for: src/lib.rs

-1
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,6 @@ pub use http::{Body, Chunk};
4141
pub use method::Method::{self, Get, Head, Post, Delete};
4242
pub use status::StatusCode::{self, Ok, BadRequest, NotFound};
4343
pub use server::Server;
44-
pub use uri::RequestUri;
4544
pub use version::HttpVersion;
4645

4746
macro_rules! unimplemented {

Diff for: src/server/request.rs

+7-15
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,12 @@ use version::HttpVersion;
1010
use method::Method;
1111
use header::Headers;
1212
use http::{RequestHead, MessageHead, RequestLine, Body};
13-
use uri::RequestUri;
13+
use uri::Uri;
1414

1515
/// A request bundles several parts of an incoming `NetworkStream`, given to a `Handler`.
1616
pub struct Request {
1717
method: Method,
18-
uri: RequestUri,
18+
uri: Uri,
1919
version: HttpVersion,
2020
headers: Headers,
2121
remote_addr: SocketAddr,
@@ -33,7 +33,7 @@ impl Request {
3333

3434
/// The target request-uri for this request.
3535
#[inline]
36-
pub fn uri(&self) -> &RequestUri { &self.uri }
36+
pub fn uri(&self) -> &Uri { &self.uri }
3737

3838
/// The version of HTTP for this request.
3939
#[inline]
@@ -45,22 +45,14 @@ impl Request {
4545

4646
/// The target path of this Request.
4747
#[inline]
48-
pub fn path(&self) -> Option<&str> {
49-
match self.uri {
50-
RequestUri::AbsolutePath { path: ref p, .. } => Some(p.as_str()),
51-
RequestUri::AbsoluteUri(ref url) => Some(url.path()),
52-
_ => None,
53-
}
48+
pub fn path(&self) -> &str {
49+
self.uri.path()
5450
}
5551

5652
/// The query string of this Request.
5753
#[inline]
5854
pub fn query(&self) -> Option<&str> {
59-
match self.uri {
60-
RequestUri::AbsolutePath { query: ref q, .. } => q.as_ref().map(|x| x.as_str()),
61-
RequestUri::AbsoluteUri(ref url) => url.query(),
62-
_ => None,
63-
}
55+
self.uri.query()
6456
}
6557

6658
/// Take the `Body` of this `Request`.
@@ -73,7 +65,7 @@ impl Request {
7365
///
7466
/// Modifying these pieces will have no effect on how hyper behaves.
7567
#[inline]
76-
pub fn deconstruct(self) -> (Method, RequestUri, HttpVersion, Headers, Body) {
68+
pub fn deconstruct(self) -> (Method, Uri, HttpVersion, Headers, Body) {
7769
(self.method, self.uri, self.version, self.headers, self.body)
7870
}
7971
}

0 commit comments

Comments
 (0)