fix(uri): fix Uri to origin_form when path is '*'
This commit is contained in:
		| @@ -1,7 +1,7 @@ | |||||||
| use std::ops::Deref; | use std::ops::Deref; | ||||||
| use std::str; | use std::str; | ||||||
|  |  | ||||||
| use bytes::{Bytes, BytesMut}; | use bytes::Bytes; | ||||||
|  |  | ||||||
| #[derive(Debug, Clone, PartialEq, Eq, Hash)] | #[derive(Debug, Clone, PartialEq, Eq, Hash)] | ||||||
| pub struct ByteStr(Bytes); | pub struct ByteStr(Bytes); | ||||||
| @@ -38,19 +38,6 @@ impl Deref for ByteStr { | |||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| impl From<ByteStr> for Bytes { |  | ||||||
|     fn from(s: ByteStr) -> Bytes { |  | ||||||
|         s.0 |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| impl From<ByteStr> for BytesMut { |  | ||||||
|     fn from(s: ByteStr) -> BytesMut { |  | ||||||
|         s.0.into() |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| impl<'a> From<&'a str> for ByteStr { | impl<'a> From<&'a str> for ByteStr { | ||||||
|     fn from(s: &'a str) -> ByteStr { |     fn from(s: &'a str) -> ByteStr { | ||||||
|         ByteStr(Bytes::from(s)) |         ByteStr(Bytes::from(s)) | ||||||
|   | |||||||
							
								
								
									
										24
									
								
								src/uri.rs
									
									
									
									
									
								
							
							
						
						
									
										24
									
								
								src/uri.rs
									
									
									
									
									
								
							| @@ -44,13 +44,7 @@ impl Uri { | |||||||
|             Err(UriError(ErrorKind::Empty)) |             Err(UriError(ErrorKind::Empty)) | ||||||
|         } else if s.as_bytes() == b"*" { |         } else if s.as_bytes() == b"*" { | ||||||
|             // asterisk-form |             // asterisk-form | ||||||
|             Ok(Uri { |             Ok(asterisk_form()) | ||||||
|                 source: ByteStr::from_static("*"), |  | ||||||
|                 scheme_end: None, |  | ||||||
|                 authority_end: None, |  | ||||||
|                 query_start: None, |  | ||||||
|                 fragment_start: None, |  | ||||||
|             }) |  | ||||||
|         } else if s.as_bytes() == b"/" { |         } else if s.as_bytes() == b"/" { | ||||||
|             // shortcut for '/' |             // shortcut for '/' | ||||||
|             Ok(Uri::default()) |             Ok(Uri::default()) | ||||||
| @@ -308,11 +302,24 @@ pub fn scheme_and_authority(uri: &Uri) -> Option<Uri> { | |||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
|  | #[inline] | ||||||
|  | fn asterisk_form() -> Uri { | ||||||
|  |     Uri { | ||||||
|  |         source: ByteStr::from_static("*"), | ||||||
|  |         scheme_end: None, | ||||||
|  |         authority_end: None, | ||||||
|  |         query_start: None, | ||||||
|  |         fragment_start: None, | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
| pub fn origin_form(uri: &Uri) -> Uri { | pub fn origin_form(uri: &Uri) -> Uri { | ||||||
|     let range = Range(uri.path_start(), uri.origin_form_end()); |     let range = Range(uri.path_start(), uri.origin_form_end()); | ||||||
|  |  | ||||||
|     let clone = if range.len() == 0 { |     let clone = if range.len() == 0 { | ||||||
|         ByteStr::from_static("/") |         ByteStr::from_static("/") | ||||||
|  |     } else if uri.source.as_bytes()[range.0] == b'*' { | ||||||
|  |         return asterisk_form(); | ||||||
|     } else if uri.source.as_bytes()[range.0] != b'/' { |     } else if uri.source.as_bytes()[range.0] != b'/' { | ||||||
|         let mut new = BytesMut::with_capacity(range.1 - range.0 + 1); |         let mut new = BytesMut::with_capacity(range.1 - range.0 + 1); | ||||||
|         new.put_u8(b'/'); |         new.put_u8(b'/'); | ||||||
| @@ -541,10 +548,11 @@ fn test_uri_to_origin_form() { | |||||||
|         ("http://hyper.rs/", "/"), |         ("http://hyper.rs/", "/"), | ||||||
|         ("http://hyper.rs/path", "/path"), |         ("http://hyper.rs/path", "/path"), | ||||||
|         ("http://hyper.rs?query", "/?query"), |         ("http://hyper.rs?query", "/?query"), | ||||||
|  |         ("*", "*"), | ||||||
|     ]; |     ]; | ||||||
|  |  | ||||||
|     for case in cases { |     for case in cases { | ||||||
|         let uri = Uri::from_str(case.0).unwrap(); |         let uri = Uri::from_str(case.0).unwrap(); | ||||||
|         assert_eq!(origin_form(&uri), case.1); |         assert_eq!(origin_form(&uri), case.1, "{:?}", case); | ||||||
|     } |     } | ||||||
| } | } | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user