Allow {} to remain decoded in URLs in the path and query

This allows things like http://example.com/{1234-5678}?id={abcd-ef01}.
But do not allow it in other parts of the URL. I could allow it in the
fragment, but in the username and password it would be too ugly.

In order to do that, make DecodeReserved use two bits and have
PrettyDecoded set only one of them. That way, toString(PrettyDecoded)
can be distinguished from toString(PrettyDecoded | DecodeReserved),
just as path(PrettyDecoded) can be distinguished from
path(PrettyDecoded & ~DecodeDelimiters).

Also, take the opportunity to avoid decoding the reserved characters
in the query. Keep them encoded as they should be.

Change-Id: I1604a0c8015c6b03dc2fbf49ea9d1dbed96fc186
Reviewed-by: Shane Kearns <shane.kearns@accenture.com>
bb10
Thiago Macieira 2012-03-30 16:21:45 -03:00 committed by Qt by Nokia
parent a01c662d37
commit 997ac954ab
3 changed files with 23 additions and 9 deletions

View File

@ -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(':');

View File

@ -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)

View File

@ -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()