diff --git a/percent_encoding/src/lib.rs b/percent_encoding/src/lib.rs index fba0cd91..5432ff50 100644 --- a/percent_encoding/src/lib.rs +++ b/percent_encoding/src/lib.rs @@ -153,18 +153,15 @@ impl<'a> Iterator for PercentEncode<'a> { self.bytes = remaining; Some(percent_encode_byte(first_byte)) } else { - // The unsafe blocks here are appropriate because the bytes are - // confirmed as a subset of UTF-8 in should_percent_encode. - for (i, &byte) in remaining.iter().enumerate() { - if self.ascii_set.should_percent_encode(byte) { - // 1 for first_byte + i for previous iterations of this loop - let (unchanged_slice, remaining) = self.bytes.split_at(1 + i); - self.bytes = remaining; - return Some(unsafe { str::from_utf8_unchecked(unchanged_slice) }); - } - } - let unchanged_slice = self.bytes; - self.bytes = &[][..]; + let (unchanged_slice, remaining) = self.bytes.split_at( + // 1 for the first byte + rest in remaining + 1 + remaining + .iter() + .position(|&byte| self.ascii_set.should_percent_encode(byte)) + .unwrap_or(remaining.len()), + ); + self.bytes = remaining; + // SAFETY: bytes are confirmed as a subset of UTF-8 in should_percent_encode. Some(unsafe { str::from_utf8_unchecked(unchanged_slice) }) } } else {