aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/PercentEncodedCharacterDecoder.cpp16
-rw-r--r--src/Uri.cpp3
-rw-r--r--test/src/UriTests.cpp25
3 files changed, 40 insertions, 4 deletions
diff --git a/src/PercentEncodedCharacterDecoder.cpp b/src/PercentEncodedCharacterDecoder.cpp
index 890d392..dc7cd58 100644
--- a/src/PercentEncodedCharacterDecoder.cpp
+++ b/src/PercentEncodedCharacterDecoder.cpp
@@ -21,7 +21,13 @@ namespace {
* This is the character set containing just the upper-case
* letters 'A' through 'F', used in upper-case hexadecimal.
*/
- const Uri::CharacterSet HEX('A', 'F');
+ const Uri::CharacterSet HEX_UPPER('A', 'F');
+
+ /**
+ * This is the character set containing just the lower-case
+ * letters 'a' through 'f', used in lower-case hexadecimal.
+ */
+ const Uri::CharacterSet HEX_LOWER('a', 'f');
}
@@ -58,8 +64,10 @@ namespace Uri {
impl_->decodedCharacter <<= 4;
if (IsCharacterInSet(c, DIGIT)) {
impl_->decodedCharacter += (int)(c - '0');
- } else if (IsCharacterInSet(c, HEX)) {
+ } else if (IsCharacterInSet(c, HEX_UPPER)) {
impl_->decodedCharacter += (int)(c - 'A') + 10;
+ } else if (IsCharacterInSet(c, HEX_LOWER)) {
+ impl_->decodedCharacter += (int)(c - 'a') + 10;
} else {
return false;
}
@@ -70,8 +78,10 @@ namespace Uri {
impl_->decodedCharacter <<= 4;
if (IsCharacterInSet(c, DIGIT)) {
impl_->decodedCharacter += (int)(c - '0');
- } else if (IsCharacterInSet(c, HEX)) {
+ } else if (IsCharacterInSet(c, HEX_UPPER)) {
impl_->decodedCharacter += (int)(c - 'A') + 10;
+ } else if (IsCharacterInSet(c, HEX_LOWER)) {
+ impl_->decodedCharacter += (int)(c - 'a') + 10;
} else {
return false;
}
diff --git a/src/Uri.cpp b/src/Uri.cpp
index 3bb3a59..b30796c 100644
--- a/src/Uri.cpp
+++ b/src/Uri.cpp
@@ -38,7 +38,8 @@ namespace {
*/
const Uri::CharacterSet HEXDIG{
Uri::CharacterSet('0', '9'),
- Uri::CharacterSet('A', 'F')
+ Uri::CharacterSet('A', 'F'),
+ Uri::CharacterSet('a', 'f')
};
/**
diff --git a/test/src/UriTests.cpp b/test/src/UriTests.cpp
index 6d59697..bb541d0 100644
--- a/test/src/UriTests.cpp
+++ b/test/src/UriTests.cpp
@@ -524,3 +524,28 @@ TEST(UriTests, ParseFromStringFragmentBarelyLegal) {
++index;
}
}
+
+TEST(UriTests, ParseFromStringPathsWithPercentEncodedCharacters) {
+ struct TestVector {
+ std::string uriString;
+ std::string pathFirstSegment;
+ };
+ const std::vector< TestVector > testVectors{
+ {"%41", "A"},
+ {"%4A", "J"},
+ {"%4a", "J"},
+ {"%bc", "\xbc"},
+ {"%Bc", "\xbc"},
+ {"%bC", "\xbc"},
+ {"%BC", "\xbc"},
+ {"%41%42%43", "ABC"},
+ {"%41%4A%43%4b", "AJCK"},
+ };
+ size_t index = 0;
+ for (const auto& testVector : testVectors) {
+ Uri::Uri uri;
+ ASSERT_TRUE(uri.ParseFromString(testVector.uriString)) << index;
+ ASSERT_EQ(testVector.pathFirstSegment, uri.GetPath()[0]);
+ ++index;
+ }
+}