Quellcode durchsuchen

Remove percent_encode_byte(), use percent_encode() in form-urlencoded.

Simon Sapin vor 12 Jahren
Ursprung
Commit
3b25a5df46
4 geänderte Dateien mit 48 neuen und 30 gelöschten Zeilen
  1. 6 5
      make_encode_sets.py
  2. 36 0
      src/encode_sets.rs
  3. 6 6
      src/form_urlencoded.rs
  4. 0 19
      src/url.rs

+ 6 - 5
make_encode_sets.py

@@ -23,11 +23,12 @@ print('''\
 ''')
 for name, encoded in [
     ('SIMPLE_ENCODE_SET',   ''),
-    ('QUERY_ENCODE_SET',    ' "#<>`'),
-    ('DEFAULT_ENCODE_SET',  ' "#<>`?'),
-    ('USERINFO_ENCODE_SET', ' "#<>`?@'),
-    ('PASSWORD_ENCODE_SET', ' "#<>`?@/\\'),
-    ('USERNAME_ENCODE_SET', ' "#<>`?@/\\:'),
+    ('QUERY_ENCODE_SET',    r''' "#<>`'''),
+    ('DEFAULT_ENCODE_SET',  r''' "#<>`?'''),
+    ('USERINFO_ENCODE_SET', r''' "#<>`?@'''),
+    ('PASSWORD_ENCODE_SET', r''' "#<>`?@\/'''),
+    ('USERNAME_ENCODE_SET', r''' "#<>`?@\/:'''),
+    ('FORM_URLENCODED_ENCODE_SET', r''' !"#$%&\'()+,/:;<=>?@[\]^`{|}'''),
 ]:
     print(
         "pub static %s: [&'static str, ..256] = [\n%s\n];\n\n"

+ 36 - 0
src/encode_sets.rs

@@ -224,3 +224,39 @@ pub static USERNAME_ENCODE_SET: [&'static str, ..256] = [
 ];
 
 
+pub static FORM_URLENCODED_ENCODE_SET: [&'static str, ..256] = [
+   "%00", "%01", "%02", "%03", "%04", "%05", "%06", "%07",
+   "%08", "%09", "%0A", "%0B", "%0C", "%0D", "%0E", "%0F",
+   "%10", "%11", "%12", "%13", "%14", "%15", "%16", "%17",
+   "%18", "%19", "%1A", "%1B", "%1C", "%1D", "%1E", "%1F",
+   "%20", "%21", "%22", "%23", "%24", "%25", "%26", "%27",
+   "%28", "%29", "*", "%2B", "%2C", "-", ".", "%2F",
+   "0", "1", "2", "3", "4", "5", "6", "7",
+   "8", "9", "%3A", "%3B", "%3C", "%3D", "%3E", "%3F",
+   "%40", "A", "B", "C", "D", "E", "F", "G",
+   "H", "I", "J", "K", "L", "M", "N", "O",
+   "P", "Q", "R", "S", "T", "U", "V", "W",
+   "X", "Y", "Z", "%5B", "%5C", "%5D", "%5E", "_",
+   "%60", "a", "b", "c", "d", "e", "f", "g",
+   "h", "i", "j", "k", "l", "m", "n", "o",
+   "p", "q", "r", "s", "t", "u", "v", "w",
+   "x", "y", "z", "%7B", "%7C", "%7D", "~", "%7F",
+   "%80", "%81", "%82", "%83", "%84", "%85", "%86", "%87",
+   "%88", "%89", "%8A", "%8B", "%8C", "%8D", "%8E", "%8F",
+   "%90", "%91", "%92", "%93", "%94", "%95", "%96", "%97",
+   "%98", "%99", "%9A", "%9B", "%9C", "%9D", "%9E", "%9F",
+   "%A0", "%A1", "%A2", "%A3", "%A4", "%A5", "%A6", "%A7",
+   "%A8", "%A9", "%AA", "%AB", "%AC", "%AD", "%AE", "%AF",
+   "%B0", "%B1", "%B2", "%B3", "%B4", "%B5", "%B6", "%B7",
+   "%B8", "%B9", "%BA", "%BB", "%BC", "%BD", "%BE", "%BF",
+   "%C0", "%C1", "%C2", "%C3", "%C4", "%C5", "%C6", "%C7",
+   "%C8", "%C9", "%CA", "%CB", "%CC", "%CD", "%CE", "%CF",
+   "%D0", "%D1", "%D2", "%D3", "%D4", "%D5", "%D6", "%D7",
+   "%D8", "%D9", "%DA", "%DB", "%DC", "%DD", "%DE", "%DF",
+   "%E0", "%E1", "%E2", "%E3", "%E4", "%E5", "%E6", "%E7",
+   "%E8", "%E9", "%EA", "%EB", "%EC", "%ED", "%EE", "%EF",
+   "%F0", "%F1", "%F2", "%F3", "%F4", "%F5", "%F6", "%F7",
+   "%F8", "%F9", "%FA", "%FB", "%FC", "%FD", "%FE", "%FF",
+];
+
+

+ 6 - 6
src/form_urlencoded.rs

@@ -18,7 +18,8 @@ use encoding::EncodingRef;
 use encoding::all::UTF_8;
 use encoding::label::encoding_from_whatwg_label;
 
-use super::{percent_encode_byte, percent_decode};
+use super::{percent_encode, percent_decode};
+use encode_sets::FORM_URLENCODED_ENCODE_SET;
 
 
 pub fn parse_str(input: &str) -> Vec<(String, String)> {
@@ -92,11 +93,10 @@ pub fn serialize<'a, I: Iterator<(&'a str, &'a str)>>(
         };
 
         for &byte in input.iter() {
-            match byte {
-                b' ' => output.push_str("+"),
-                b'*' | b'-' | b'.' | b'0' .. b'9' | b'A' .. b'Z' | b'_' | b'a' .. b'z'
-                => unsafe { output.push_byte(byte) },
-                _ => percent_encode_byte(byte, output),
+            if byte == b' ' {
+                output.push_str("+")
+            } else {
+                percent_encode([byte], FORM_URLENCODED_ENCODE_SET, output)
             }
         }
     }

+ 0 - 19
src/url.rs

@@ -814,15 +814,6 @@ fn from_hex(byte: u8) -> Option<u8> {
     }
 }
 
-#[inline]
-fn to_hex_upper(value: u8) -> u8 {
-    match value {
-        0 .. 9 => b'0' + value,
-        10 .. 15 => b'A' + value - 10,
-        _ => fail!()
-    }
-}
-
 
 #[inline]
 pub fn utf8_percent_encode(input: &str, encode_set: &[&str], output: &mut String) {
@@ -838,16 +829,6 @@ pub fn percent_encode(input: &[u8], encode_set: &[&str], output: &mut String) {
 }
 
 
-#[inline]
-pub fn percent_encode_byte(byte: u8, output: &mut String) {
-    unsafe {
-        output.push_bytes([
-            b'%', to_hex_upper(byte >> 4), to_hex_upper(byte & 0x0F)
-        ])
-    }
-}
-
-
 #[inline]
 pub fn percent_decode(input: &[u8], output: &mut Vec<u8>) {
     let mut i = 0u;