diff --git a/src/uri/scheme.rs b/src/uri/scheme.rs index 78e59fc6..017cc9a5 100644 --- a/src/uri/scheme.rs +++ b/src/uri/scheme.rs @@ -336,10 +336,6 @@ impl Scheme2 { for i in 0..s.len() { let b = s[i]; - if i == MAX_SCHEME_LEN { - return Err(ErrorKind::SchemeTooLong.into()); - } - match SCHEME_CHARS[b as usize] { b':' => { // Not enough data remaining @@ -352,6 +348,10 @@ impl Scheme2 { break; } + if i > MAX_SCHEME_LEN { + return Err(ErrorKind::SchemeTooLong.into()); + } + // Return scheme return Ok(Scheme2::Other(i)); } diff --git a/src/uri/tests.rs b/src/uri/tests.rs index 71f93515..9a9ccc80 100644 --- a/src/uri/tests.rs +++ b/src/uri/tests.rs @@ -231,6 +231,30 @@ test_parse! { port_part = None, } +test_parse! { + test_uri_parse_long_host_with_no_scheme, + "thequickbrownfoxjumpedoverthelazydogtofindthelargedangerousdragon.localhost", + [], + + scheme_part = None, + authority_part = part!("thequickbrownfoxjumpedoverthelazydogtofindthelargedangerousdragon.localhost"), + path = "", + query = None, + port_part = None, +} + +test_parse! { + test_uri_parse_long_host_with_port_and_no_scheme, + "thequickbrownfoxjumpedoverthelazydogtofindthelargedangerousdragon.localhost:1234", + [], + + scheme_part = None, + authority_part = part!("thequickbrownfoxjumpedoverthelazydogtofindthelargedangerousdragon.localhost:1234"), + path = "", + query = None, + port_part = Port::from_str("1234").ok(), +} + test_parse! { test_userinfo1, "http://a:b@127.0.0.1:1234/", @@ -430,7 +454,7 @@ fn test_max_uri_len() { } #[test] -fn test_long_scheme() { +fn test_overflowing_scheme() { let mut uri = vec![]; uri.extend(vec![b'a'; 256]); uri.extend(b"://localhost/"); @@ -441,6 +465,18 @@ fn test_long_scheme() { assert_eq!(res.unwrap_err().0, ErrorKind::SchemeTooLong); } +#[test] +fn test_max_length_scheme() { + let mut uri = vec![]; + uri.extend(vec![b'a'; 64]); + uri.extend(b"://localhost/"); + + let uri = String::from_utf8(uri).unwrap(); + let uri: Uri = uri.parse().unwrap(); + + assert_eq!(uri.scheme_str().unwrap().len(), 64); +} + #[test] fn test_uri_to_path_and_query() { let cases = vec![