Преглед изворни кода

Don’t split at a comma within the URL fragment

Simon Sapin пре 8 година
родитељ
комит
5551c48039
1 измењених фајлова са 16 додато и 3 уклоњено
  1. 16 3
      src/lib.rs

+ 16 - 3
src/lib.rs

@@ -21,10 +21,11 @@ impl<'a> DataUrl<'a> {
         use DataUrlError::*;
 
         let after_colon = pretend_parse_data_url(input).ok_or(NotADataUrl)?;
-        let comma = after_colon.bytes().position(|byte| byte == b',').ok_or(NoComma)?;
 
-        let (mime_type, base64) = parse_header(&after_colon[..comma]);
-        let encoded_body_plus_fragment = &after_colon[comma + 1..];
+        let (from_colon_to_comma, encoded_body_plus_fragment) =
+            find_comma_before_fragment(after_colon).ok_or(NoComma)?;
+
+        let (mime_type, base64) = parse_header(from_colon_to_comma);
 
         Ok(DataUrl { mime_type, base64, encoded_body_plus_fragment })
     }
@@ -108,6 +109,18 @@ fn pretend_parse_data_url(input: &str) -> Option<&str> {
     Some(after_colon.trim_right_matches(|ch| ch <= ' '))
 }
 
+fn find_comma_before_fragment(after_colon: &str) -> Option<(&str, &str)> {
+    for (i, byte) in after_colon.bytes().enumerate() {
+        if byte == b',' {
+            return Some((&after_colon[..i], &after_colon[i + 1..]))
+        }
+        if byte == b'#' {
+            break
+        }
+    }
+    None
+}
+
 fn parse_header(from_colon_to_comma: &str) -> (mime::Mime, bool) {
     let input = from_colon_to_comma.chars()
         .filter(|&c| !matches!(c, '\t' | '\n' | '\r'))  // Removed by the URL parser