diff options
-rw-r--r-- | src/corelib/io/qurl.cpp | 14 | ||||
-rw-r--r-- | tests/auto/corelib/io/qurl/tst_qurl.cpp | 15 |
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") |