summaryrefslogtreecommitdiffstats
path: root/src/corelib/io/qurl.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/corelib/io/qurl.cpp')
-rw-r--r--src/corelib/io/qurl.cpp58
1 files changed, 33 insertions, 25 deletions
diff --git a/src/corelib/io/qurl.cpp b/src/corelib/io/qurl.cpp
index cbe39e9fdf..44d5533364 100644
--- a/src/corelib/io/qurl.cpp
+++ b/src/corelib/io/qurl.cpp
@@ -467,16 +467,16 @@ static inline void appendToUser(QString &appendTo, const QString &value, QUrl::F
}
const ushort *actions = 0;
- if (options & QUrl::DecodeDelimiters)
- actions = decodedActions;
- else
+ if (options & QUrl::EncodeDelimiters)
actions = encodedActions;
+ else
+ actions = decodedActions;
if (!qt_urlRecode(appendTo, value.constData(), value.constEnd(), options, actions))
appendTo += value;
}
-void QUrlPrivate::appendAuthority(QString &appendTo, QUrl::FormattingOptions options, Section appendingTo) const
+inline void QUrlPrivate::appendAuthority(QString &appendTo, QUrl::FormattingOptions options, Section appendingTo) const
{
if ((options & QUrl::RemoveUserInfo) != QUrl::RemoveUserInfo) {
appendUserInfo(appendTo, options, appendingTo);
@@ -488,14 +488,17 @@ void QUrlPrivate::appendAuthority(QString &appendTo, QUrl::FormattingOptions opt
appendTo += QLatin1Char(':') + QString::number(port);
}
-void QUrlPrivate::appendUserInfo(QString &appendTo, QUrl::FormattingOptions options, Section appendingTo) const
+inline void QUrlPrivate::appendUserInfo(QString &appendTo, QUrl::FormattingOptions options, Section appendingTo) const
{
if (Q_LIKELY(userName.isEmpty() && password.isEmpty()))
return;
const ushort *userNameActions;
const ushort *passwordActions;
- if (options & QUrl::DecodeDelimiters) {
+ if (options & QUrl::EncodeDelimiters) {
+ userNameActions = encodedUserNameActions;
+ passwordActions = encodedPasswordActions;
+ } else {
switch (appendingTo) {
case UserInfo:
userNameActions = decodedUserNameInUserInfoActions;
@@ -513,11 +516,11 @@ void QUrlPrivate::appendUserInfo(QString &appendTo, QUrl::FormattingOptions opti
passwordActions = decodedPasswordInUrlActions;
break;
}
- } else {
- userNameActions = encodedUserNameActions;
- passwordActions = encodedPasswordActions;
}
+ if ((options & QUrl::EncodeReserved) == 0)
+ options |= QUrl::DecodeReserved;
+
if (!qt_urlRecode(appendTo, userName.constData(), userName.constEnd(), options, userNameActions))
appendTo += userName;
if (options & QUrl::RemovePassword || !hasPassword()) {
@@ -541,7 +544,7 @@ inline void QUrlPrivate::appendPassword(QString &appendTo, QUrl::FormattingOptio
inline void QUrlPrivate::appendPath(QString &appendTo, QUrl::FormattingOptions options, Section appendingTo) const
{
- if (appendingTo != Path && options & QUrl::DecodeDelimiters) {
+ if (appendingTo != Path && !(options & QUrl::EncodeDelimiters)) {
if (!qt_urlRecode(appendTo, path.constData(), path.constEnd(), options, decodedPathInUrlActions))
appendTo += path;
@@ -565,12 +568,12 @@ inline void QUrlPrivate::appendQuery(QString &appendTo, QUrl::FormattingOptions
}
const ushort *actions = 0;
- if (options & QUrl::DecodeDelimiters) {
+ if (options & QUrl::EncodeDelimiters) {
+ actions = encodedQueryActions;
+ } else {
// reset to default qt_urlRecode behaviour (leave delimiters alone)
- options &= ~QUrl::DecodeDelimiters;
+ options |= QUrl::EncodeDelimiters;
actions = appendingTo == Query ? decodedQueryInIsolationActions : decodedQueryInUrlActions;
- } else if ((options & QUrl::DecodeDelimiters) == 0) {
- actions = encodedQueryActions;
}
if (!qt_urlRecode(appendTo, query.constData(), query.constData() + query.length(),
@@ -764,7 +767,9 @@ inline void QUrlPrivate::setQuery(const QString &value, int from, int iend)
QString output;
const QChar *begin = value.constData() + from;
const QChar *end = value.constData() + iend;
- if (qt_urlRecode(output, begin, end, QUrl::DecodeUnicode | QUrl::DecodeSpaces,
+
+ // leave delimiters alone but decode the rest
+ if (qt_urlRecode(output, begin, end, QUrl::EncodeDelimiters,
decodedQueryInIsolationActions))
query = output;
else
@@ -804,7 +809,7 @@ inline void QUrlPrivate::setQuery(const QString &value, int from, int iend)
inline void QUrlPrivate::appendHost(QString &appendTo, QUrl::FormattingOptions options) const
{
// this is the only flag that matters
- options &= QUrl::DecodeUnicode;
+ options &= QUrl::EncodeUnicode;
if (host.isEmpty())
return;
if (host.at(0).unicode() == '[') {
@@ -813,10 +818,10 @@ inline void QUrlPrivate::appendHost(QString &appendTo, QUrl::FormattingOptions o
} else {
// this is either an IPv4Address or a reg-name
// if it is a reg-name, it is already stored in Unicode form
- if (options == QUrl::DecodeUnicode)
- appendTo += host;
- else
+ if (options == QUrl::EncodeUnicode)
appendTo += qt_ACE_do(host, ToAceOnly);
+ else
+ appendTo += host;
}
}
@@ -1915,7 +1920,7 @@ bool QUrl::hasFragment() const
QString QUrl::topLevelDomain(ComponentFormattingOptions options) const
{
QString tld = qTopLevelDomain(host());
- if ((options & DecodeUnicode) == 0) {
+ if (options & EncodeUnicode) {
return qt_ACE_do(tld, ToAceOnly);
}
return tld;
@@ -2055,8 +2060,12 @@ QString QUrl::toString(FormattingOptions options) const
}
QString url;
- if (!options.testFlag(DecodeReserved))
- options &= ~DecodeReserved;
+
+ // for the full URL, we consider that the reserved characters are prettier if encoded
+ if (options & DecodeReserved)
+ options &= ~EncodeReserved;
+ else
+ options |= EncodeReserved;
if (!(options & QUrl::RemoveScheme) && d->hasScheme())
url += d->scheme + QLatin1Char(':');
@@ -2123,9 +2132,8 @@ QString QUrl::toDisplayString(FormattingOptions options) const
*/
QByteArray QUrl::toEncoded(FormattingOptions options) const
{
- QString stringForm = toString(options);
- if (options & DecodeUnicode)
- return stringForm.toUtf8();
+ options &= ~DecodeReserved;
+ QString stringForm = toString(options | FullyEncoded);
return stringForm.toLatin1();
}