summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorThiago Macieira <thiago.macieira@intel.com>2011-10-19 20:31:46 +0200
committerQt by Nokia <qt-info@nokia.com>2012-03-30 01:19:59 +0200
commit2591545ee1ffa29236900d4cc08724c9f0dd7107 (patch)
treec30c15354f19040d491f7c6420ca1c5f86731f1b
parent1372d60bde04a31c8036601076d1093a67c6bd46 (diff)
QUrl: Always lowercase the scheme
Change-Id: I8d467014d22384f1be15fdd746e20b1153a82a4e Reviewed-by: Lars Knoll <lars.knoll@nokia.com>
-rw-r--r--src/corelib/io/qurl.cpp18
-rw-r--r--tests/auto/corelib/io/qurl/tst_qurl.cpp20
2 files changed, 30 insertions, 8 deletions
diff --git a/src/corelib/io/qurl.cpp b/src/corelib/io/qurl.cpp
index 51937eeb8f..b8ab9df052 100644
--- a/src/corelib/io/qurl.cpp
+++ b/src/corelib/io/qurl.cpp
@@ -514,6 +514,7 @@ bool QUrlPrivate::setScheme(const QString &value, int len, bool decoded)
// scheme = ALPHA *( ALPHA / DIGIT / "+" / "-" / "." )
// but we need to decode any percent-encoding sequences that fall on
// those characters
+ // we also lowercase the scheme
scheme.clear();
sectionIsPresent |= Scheme;
@@ -522,12 +523,15 @@ bool QUrlPrivate::setScheme(const QString &value, int len, bool decoded)
return false;
// validate it:
+ int needsLowercasing = -1;
const ushort *p = reinterpret_cast<const ushort *>(value.constData());
for (int i = 0; i < len; ++i) {
if (p[i] >= 'a' && p[i] <= 'z')
continue;
- if (p[i] >= 'A' && p[i] <= 'Z')
+ if (p[i] >= 'A' && p[i] <= 'Z') {
+ needsLowercasing = i;
continue;
+ }
if (p[i] >= '0' && p[i] <= '9' && i > 0)
continue;
if (p[i] == '+' || p[i] == '-' || p[i] == '.')
@@ -551,6 +555,16 @@ bool QUrlPrivate::setScheme(const QString &value, int len, bool decoded)
scheme = value.left(len);
sectionHasError &= ~Scheme;
+
+ if (needsLowercasing != -1) {
+ // schemes are ASCII only, so we don't need the full Unicode toLower
+ QChar *schemeData = scheme.data(); // force detaching here
+ for (int i = needsLowercasing; i >= 0; --i) {
+ register ushort c = schemeData[i].unicode();
+ if (c >= 'A' && c <= 'Z')
+ schemeData[i] = c + 0x20;
+ }
+ }
return true;
}
@@ -2308,7 +2322,7 @@ bool QUrl::isLocalFile() const
{
if (!d) return false;
- if (d->scheme.compare(fileScheme(), Qt::CaseInsensitive) != 0)
+ if (d->scheme != fileScheme())
return false; // not file
return true;
}
diff --git a/tests/auto/corelib/io/qurl/tst_qurl.cpp b/tests/auto/corelib/io/qurl/tst_qurl.cpp
index 1c34d8a114..680cc3b137 100644
--- a/tests/auto/corelib/io/qurl/tst_qurl.cpp
+++ b/tests/auto/corelib/io/qurl/tst_qurl.cpp
@@ -155,6 +155,7 @@ private slots:
void toEncodedNotUsingUninitializedPath();
void emptyAuthorityRemovesExistingAuthority();
void acceptEmptyAuthoritySegments();
+ void lowercasesScheme();
};
// Testing get/set functions
@@ -320,9 +321,9 @@ void tst_QUrl::setUrl()
}
{
- QUrl url("hTTp://www.foo.bar:80");
+ QUrl url("http://www.foo.bar:80");
QVERIFY(url.isValid());
- QCOMPARE(url.scheme(), QString::fromLatin1("hTTp"));
+ QCOMPARE(url.scheme(), QString::fromLatin1("http"));
QCOMPARE(url.path(), QString());
QVERIFY(url.encodedQuery().isEmpty());
QVERIFY(url.userInfo().isEmpty());
@@ -330,12 +331,12 @@ void tst_QUrl::setUrl()
QCOMPARE(url.host(), QString::fromLatin1("www.foo.bar"));
QCOMPARE(url.authority(), QString::fromLatin1("www.foo.bar:80"));
QCOMPARE(url.port(), 80);
- QCOMPARE(url.toString(), QString::fromLatin1("hTTp://www.foo.bar:80"));
- QCOMPARE(url.toDisplayString(), QString::fromLatin1("hTTp://www.foo.bar:80"));
- QCOMPARE(url.toDisplayString(QUrl::PreferLocalFile), QString::fromLatin1("hTTp://www.foo.bar:80"));
+ QCOMPARE(url.toString(), QString::fromLatin1("http://www.foo.bar:80"));
+ QCOMPARE(url.toDisplayString(), QString::fromLatin1("http://www.foo.bar:80"));
+ QCOMPARE(url.toDisplayString(QUrl::PreferLocalFile), QString::fromLatin1("http://www.foo.bar:80"));
QUrl url2("//www1.foo.bar");
- QCOMPARE(url.resolved(url2).toString(), QString::fromLatin1("hTTp://www1.foo.bar"));
+ QCOMPARE(url.resolved(url2).toString(), QString::fromLatin1("http://www1.foo.bar"));
}
{
@@ -2481,5 +2482,12 @@ void tst_QUrl::effectiveTLDs()
QCOMPARE(domain.topLevelDomain(), TLD);
}
+void tst_QUrl::lowercasesScheme()
+{
+ QUrl url;
+ url.setScheme("HELLO");
+ QCOMPARE(url.scheme(), QString("hello"));
+}
+
QTEST_MAIN(tst_QUrl)
#include "tst_qurl.moc"