summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/corelib/io/qurl.cpp14
-rw-r--r--tests/auto/corelib/io/qurl/tst_qurl.cpp15
2 files changed, 26 insertions, 3 deletions
diff --git a/src/corelib/io/qurl.cpp b/src/corelib/io/qurl.cpp
index f0a853c965..2b5839923a 100644
--- a/src/corelib/io/qurl.cpp
+++ b/src/corelib/io/qurl.cpp
@@ -3342,12 +3342,20 @@ QUrl QUrl::fromLocalFile(const QString &localFile)
hostSpec.truncate(hostSpec.size() - 4);
scheme = webDavScheme();
}
- url.setHost(hostSpec.toString());
- if (indexOfPath > 2)
+ // hosts can't be IPv6 addresses without [], so we can use QUrlPrivate::setHost
+ url.detach();
+ if (!url.d->setHost(hostSpec.toString(), 0, hostSpec.size(), StrictMode)) {
+ if (url.d->error->code != QUrlPrivate::InvalidRegNameError)
+ return url;
+
+ // Path hostname is not a valid URL host, so set it entirely in the path
+ // (by leaving deslashified unchanged)
+ } else if (indexOfPath > 2) {
deslashified = deslashified.right(deslashified.length() - indexOfPath);
- else
+ } else {
deslashified.clear();
+ }
}
url.setScheme(scheme);
diff --git a/tests/auto/corelib/io/qurl/tst_qurl.cpp b/tests/auto/corelib/io/qurl/tst_qurl.cpp
index 896674e67c..45a311230f 100644
--- a/tests/auto/corelib/io/qurl/tst_qurl.cpp
+++ b/tests/auto/corelib/io/qurl/tst_qurl.cpp
@@ -1275,6 +1275,9 @@ void tst_QUrl::toLocalFile_data()
QTest::newRow("windows-unc-path") << QString::fromLatin1("file://somehost/somedir/somefile") << QString::fromLatin1("//somehost/somedir/somefile");
QTest::newRow("windows-unc-root") << QString::fromLatin1("file://somehost/") << QString::fromLatin1("//somehost/");
QTest::newRow("windows-unc-nopath") << QString::fromLatin1("file://somehost") << QString::fromLatin1("//somehost");
+ QTest::newRow("windows-extlen-path") << QString::fromLatin1("file:////%3F/somedir/somefile") << QString::fromLatin1("//?/somedir/somefile");
+ QTest::newRow("windows-wsl-path") << QString::fromLatin1("file:////wsl$/somedir/somefile") << QString::fromLatin1("//wsl$/somedir/somefile");
+ QTest::newRow("windows-device-path") << QString::fromLatin1("file:////./somedir/somefile") << QString::fromLatin1("//./somedir/somefile");
// and some that result in empty (i.e., not local)
QTest::newRow("noscheme-absolute") << QString::fromLatin1("/a.txt") << QString();
@@ -1327,6 +1330,18 @@ void tst_QUrl::fromLocalFile_data()
<< QString("file://somehost") + suffix
<< QString(suffix);
#endif
+ QTest::addRow("windows-extlen-%s", pathDescription)
+ << QString("//?") + suffix
+ << QString("file:////%3F") + suffix
+ << QString("//?") + suffix;
+ QTest::addRow("windows-wsl-%s", pathDescription)
+ << QString("//wsl$") + suffix
+ << QString("file:////wsl$") + suffix
+ << QString("//wsl$") + suffix;
+ QTest::addRow("windows-device--%s", pathDescription)
+ << QString("//.") + suffix
+ << QString("file:////.") + suffix
+ << QString("//.") + suffix;
}
QTest::newRow("windows-webdav")