Update percent-encoding to v2.3.1

Change-Id: I2ea1cd1b80272cd58dfa0b581141c6e4011e5c95
diff --git a/crates/percent-encoding/.cargo-checksum.json b/crates/percent-encoding/.cargo-checksum.json
index e37d793..eb82db3 100644
--- a/crates/percent-encoding/.cargo-checksum.json
+++ b/crates/percent-encoding/.cargo-checksum.json
@@ -1 +1 @@
-{"files":{"Cargo.toml":"7330cca9fe75c0f7cadf87d42f1af587e57d7f3e90efad7b4476d8d78580e435","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"76e972ac0f4ddb116e86e10100132a783931a596e7b9872eaa31be15cd4d751d","src/lib.rs":"5eafa40dda1d5de9770181b836c37b078f790ccdee4f461d4601fc5bc17716b8"},"package":"478c572c3d73181ff3c2539045f6eb99e5491218eae919370993b890cdbdd98e"}
\ No newline at end of file
+{"files":{"Cargo.toml":"5ec334dea682150e380cf2321fa326bd97a1752314ee5cdb3a6202318cbc7ab0","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"76e972ac0f4ddb116e86e10100132a783931a596e7b9872eaa31be15cd4d751d","src/lib.rs":"9f55aebbabb7e07c64382218a16477b95ba7120d5655d318c3d4dfe7721aa531"},"package":"e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e"}
\ No newline at end of file
diff --git a/crates/percent-encoding/Android.bp b/crates/percent-encoding/Android.bp
index e5d07ff..493e64d 100644
--- a/crates/percent-encoding/Android.bp
+++ b/crates/percent-encoding/Android.bp
@@ -18,12 +18,13 @@
     host_supported: true,
     crate_name: "percent_encoding",
     cargo_env_compat: true,
-    cargo_pkg_version: "2.2.0",
+    cargo_pkg_version: "2.3.1",
     crate_root: "src/lib.rs",
     edition: "2018",
     features: [
         "alloc",
         "default",
+        "std",
     ],
     apex_available: [
         "//apex_available:platform",
diff --git a/crates/percent-encoding/Cargo.toml b/crates/percent-encoding/Cargo.toml
index 53d0b63..8fb6245 100644
--- a/crates/percent-encoding/Cargo.toml
+++ b/crates/percent-encoding/Cargo.toml
@@ -13,12 +13,17 @@
 edition = "2018"
 rust-version = "1.51"
 name = "percent-encoding"
-version = "2.2.0"
+version = "2.3.1"
 authors = ["The rust-url developers"]
 description = "Percent encoding and decoding"
+categories = ["no_std"]
 license = "MIT OR Apache-2.0"
 repository = "https://github.com/servo/rust-url/"
 
+[package.metadata.docs.rs]
+rustdoc-args = ["--generate-link-to-definition"]
+
 [features]
 alloc = []
-default = ["alloc"]
+default = ["std"]
+std = ["alloc"]
diff --git a/crates/percent-encoding/METADATA b/crates/percent-encoding/METADATA
index 4a6976f..9603ab2 100644
--- a/crates/percent-encoding/METADATA
+++ b/crates/percent-encoding/METADATA
@@ -1,17 +1,17 @@
 name: "percent-encoding"
 description: "Percent encoding and decoding"
 third_party {
-  version: "2.2.0"
+  version: "2.3.1"
   license_type: NOTICE
   last_upgrade_date {
-    year: 2022
-    month: 12
-    day: 13
+    year: 2024
+    month: 11
+    day: 20
   }
   homepage: "https://crates.io/crates/percent-encoding"
   identifier {
     type: "Archive"
-    value: "https://static.crates.io/crates/percent-encoding/percent-encoding-2.2.0.crate"
-    version: "2.2.0"
+    value: "https://static.crates.io/crates/percent-encoding/percent-encoding-2.3.1.crate"
+    version: "2.3.1"
   }
 }
diff --git a/crates/percent-encoding/src/lib.rs b/crates/percent-encoding/src/lib.rs
index 21d8a61..20d2f9f 100644
--- a/crates/percent-encoding/src/lib.rs
+++ b/crates/percent-encoding/src/lib.rs
@@ -36,8 +36,12 @@
 //!
 //! assert_eq!(utf8_percent_encode("foo <bar>", FRAGMENT).to_string(), "foo%20%3Cbar%3E");
 //! ```
-
 #![no_std]
+
+// For forwards compatibility
+#[cfg(feature = "std")]
+extern crate std as _;
+
 #[cfg(feature = "alloc")]
 extern crate alloc;
 
@@ -183,9 +187,9 @@
 /// assert_eq!("foo bar".bytes().map(percent_encode_byte).collect::<String>(),
 ///            "%66%6F%6F%20%62%61%72");
 /// ```
+#[inline]
 pub fn percent_encode_byte(byte: u8) -> &'static str {
-    let index = usize::from(byte) * 3;
-    &"\
+    static ENC_TABLE: &[u8; 768] = b"\
       %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%2A%2B%2C%2D%2E%2F\
@@ -202,7 +206,12 @@
       %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\
-      "[index..index + 3]
+      ";
+
+    let index = usize::from(byte) * 3;
+    // SAFETY: ENC_TABLE is ascii-only, so any subset if it should be
+    // ascii-only too, which is valid utf8.
+    unsafe { str::from_utf8_unchecked(&ENC_TABLE[index..index + 3]) }
 }
 
 /// Percent-encode the given bytes with the given set.
diff --git a/pseudo_crate/Cargo.lock b/pseudo_crate/Cargo.lock
index 99d6b90..c919434 100644
--- a/pseudo_crate/Cargo.lock
+++ b/pseudo_crate/Cargo.lock
@@ -3737,9 +3737,9 @@
 
 [[package]]
 name = "percent-encoding"
-version = "2.2.0"
+version = "2.3.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "478c572c3d73181ff3c2539045f6eb99e5491218eae919370993b890cdbdd98e"
+checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e"
 
 [[package]]
 name = "percore"
diff --git a/pseudo_crate/Cargo.toml b/pseudo_crate/Cargo.toml
index 27eed76..157f085 100644
--- a/pseudo_crate/Cargo.toml
+++ b/pseudo_crate/Cargo.toml
@@ -226,7 +226,7 @@
 pathdiff = "=0.2.1"
 pdl-compiler = "=0.3.1"
 pdl-runtime = "=0.3.1"
-percent-encoding = "=2.2.0"
+percent-encoding = "=2.3.1"
 percore = "=0.1.0"
 pest = "=2.7.6"
 pest_derive = "=2.7.6"