diff options
-rw-r--r-- | src/corelib/io/qurl.cpp | 17 | ||||
-rw-r--r-- | src/corelib/io/qurl.h | 5 | ||||
-rw-r--r-- | tests/auto/corelib/io/qurl/tst_qurl.cpp | 10 |
3 files changed, 23 insertions, 9 deletions
diff --git a/src/corelib/io/qurl.cpp b/src/corelib/io/qurl.cpp index 0821645111..cbe39e9fdf 100644 --- a/src/corelib/io/qurl.cpp +++ b/src/corelib/io/qurl.cpp @@ -382,7 +382,14 @@ static const ushort encodedPathActions[] = { leave('/'), // 4 0 }; -static const ushort * const decodedPathInUrlActions = encodedPathActions + 2; +static const ushort decodedPathInUrlActions[] = { + decode('{'), // 0 + decode('}'), // 1 + encode('?'), // 2 + encode('#'), // 3 + leave('/'), // 4 + 0 +}; static const ushort * const decodedPathInIsolationActions = encodedPathActions + 4; // leave('/') static const ushort encodedFragmentActions[] = { @@ -425,12 +432,6 @@ static const ushort decodedQueryInIsolationActions[] = { 0 }; static const ushort decodedQueryInUrlActions[] = { - decode('"'), // 0 - decode('<'), // 1 - decode('>'), // 2 - decode('^'), // 3 - decode('\\'),// 4 - decode('|'), // 5 decode('{'), // 6 decode('}'), // 7 encode('#'), // 8 @@ -2054,6 +2055,8 @@ QString QUrl::toString(FormattingOptions options) const } QString url; + if (!options.testFlag(DecodeReserved)) + options &= ~DecodeReserved; if (!(options & QUrl::RemoveScheme) && d->hasScheme()) url += d->scheme + QLatin1Char(':'); diff --git a/src/corelib/io/qurl.h b/src/corelib/io/qurl.h index 27b81dfc0f..ff46a8ac1a 100644 --- a/src/corelib/io/qurl.h +++ b/src/corelib/io/qurl.h @@ -142,9 +142,10 @@ public: DecodeSpaces = 0x100000, DecodeUnicode = 0x200000, DecodeDelimiters = 0x400000 | 0x800000, - DecodeReserved = 0x1000000, + PrettyDecodeReserved = 0x1000000, + DecodeReserved = PrettyDecodeReserved | 0x2000000, - PrettyDecoded = DecodeSpaces | DecodeDelimiters | DecodeReserved | DecodeUnicode, + PrettyDecoded = DecodeSpaces | DecodeDelimiters | PrettyDecodeReserved | DecodeUnicode, MostDecoded = PrettyDecoded }; Q_DECLARE_FLAGS(ComponentFormattingOptions, ComponentFormattingOption) diff --git a/tests/auto/corelib/io/qurl/tst_qurl.cpp b/tests/auto/corelib/io/qurl/tst_qurl.cpp index 7deb0fc381..f8a0edf0dc 100644 --- a/tests/auto/corelib/io/qurl/tst_qurl.cpp +++ b/tests/auto/corelib/io/qurl/tst_qurl.cpp @@ -2765,6 +2765,16 @@ void tst_QUrl::componentEncodings_data() << "host" << "%5B%3A%40/%5D:%5B:%40/%5D@host" << "/:@[?#]" << "[?%3F#]%5B:%3A@%40%5D" << "#" << "x://%5B%3A%40%2F%5D:%5B:%40%2F%5D@host/:@[%3F%23]?[?%3F%23]%5B:%3A@%40%5D##"; + + // the pretty form keeps the other characters decoded everywhere + // except when rebuilding the full URL, when we only allow "{}" to remain decoded + QTest::newRow("pretty-reserved") << QUrl("x://\"<>^\\{|}:\"<>^\\{|}@host/\"<>^\\{|}?\"<>^\\{|}#\"<>^\\{|}") + << int(QUrl::PrettyDecoded) + << "\"<>^\\{|}" << "\"<>^\\{|}" << "\"<>^\\{|}:\"<>^\\{|}" + << "host" << "\"<>^\\{|}:\"<>^\\{|}@host" + << "/\"<>^\\{|}" << "\"<>^\\{|}" << "\"<>^\\{|}" + << "x://%22%3C%3E%5E%5C%7B%7C%7D:%22%3C%3E%5E%5C%7B%7C%7D@host/%22%3C%3E%5E%5C{%7C}" + "?%22%3C%3E%5E%5C{%7C}#%22%3C%3E%5E%5C%7B%7C%7D"; } void tst_QUrl::componentEncodings() |