fix(uri): make absolute-form uris always have a path
This commit is contained in:
@@ -30,6 +30,13 @@ impl ByteStr {
|
||||
unsafe { str::from_utf8_unchecked(self.0.as_ref()) }
|
||||
}
|
||||
|
||||
pub fn insert(&mut self, idx: usize, ch: char) {
|
||||
let mut s = self.as_str().to_owned();
|
||||
s.insert(idx, ch);
|
||||
let bytes = Bytes::from(s);
|
||||
self.0 = bytes;
|
||||
}
|
||||
|
||||
#[cfg(feature = "compat")]
|
||||
pub fn into_bytes(self) -> Bytes {
|
||||
self.0
|
||||
|
||||
24
src/uri.rs
24
src/uri.rs
@@ -42,7 +42,7 @@ pub struct Uri {
|
||||
|
||||
impl Uri {
|
||||
/// Parse a string into a `Uri`.
|
||||
fn new(s: ByteStr) -> Result<Uri, UriError> {
|
||||
fn new(mut s: ByteStr) -> Result<Uri, UriError> {
|
||||
if s.len() == 0 {
|
||||
Err(UriError(ErrorKind::Empty))
|
||||
} else if s.as_bytes() == b"*" {
|
||||
@@ -81,8 +81,19 @@ impl Uri {
|
||||
return Err(UriError(ErrorKind::Malformed));
|
||||
}
|
||||
}
|
||||
|
||||
// absolute-form must always have a path
|
||||
// if there isn't a '/', for consistency, add one.
|
||||
let slash = auth_end;
|
||||
if s.len() == slash {
|
||||
s.insert(slash, '/');
|
||||
} else if s.as_bytes()[slash] != b'/' {
|
||||
s.insert(slash, '/');
|
||||
}
|
||||
|
||||
let query = parse_query(&s);
|
||||
let fragment = parse_fragment(&s);
|
||||
|
||||
Ok(Uri {
|
||||
source: s,
|
||||
scheme_end: scheme,
|
||||
@@ -443,7 +454,6 @@ macro_rules! test_parse {
|
||||
#[test]
|
||||
fn $test_name() {
|
||||
let uri = Uri::from_str($str).unwrap();
|
||||
println!("{:?} = {:#?}", $str, uri);
|
||||
$(
|
||||
assert_eq!(uri.$method(), $value, stringify!($method));
|
||||
)+
|
||||
@@ -486,6 +496,8 @@ test_parse! {
|
||||
query = None,
|
||||
fragment = None,
|
||||
port = Some(61761),
|
||||
|
||||
to_string = "https://127.0.0.1:61761/",
|
||||
}
|
||||
|
||||
test_parse! {
|
||||
@@ -497,6 +509,8 @@ test_parse! {
|
||||
path = "*",
|
||||
query = None,
|
||||
fragment = None,
|
||||
|
||||
to_string = "*",
|
||||
}
|
||||
|
||||
test_parse! {
|
||||
@@ -510,6 +524,8 @@ test_parse! {
|
||||
query = None,
|
||||
fragment = None,
|
||||
port = None,
|
||||
|
||||
to_string = "localhost",
|
||||
}
|
||||
|
||||
test_parse! {
|
||||
@@ -627,6 +643,8 @@ test_parse! {
|
||||
query = Some("foo=bar"),
|
||||
fragment = None,
|
||||
port = None,
|
||||
|
||||
to_string = "http://127.0.0.1/?foo=bar",
|
||||
}
|
||||
|
||||
test_parse! {
|
||||
@@ -651,6 +669,8 @@ test_parse! {
|
||||
query = None,
|
||||
fragment = Some("foo?bar"),
|
||||
port = None,
|
||||
|
||||
to_string = "http://127.0.0.1/#foo?bar",
|
||||
}
|
||||
|
||||
#[test]
|
||||
|
||||
Reference in New Issue
Block a user