QUrl: ensure that setPath("//path") doesn't lead to scheme://path
which would interpret 'path' as a hostname. The check is in the public setPath so that the internal one can still support parsing URLs such as ftp://ftp.example.com//path. [ChangeLog][Important Behavior Changes][QUrl and QUrlQuery]QUrl now normalizes the path given in setPath, removing ./ and ../ and duplicate slashes. Change-Id: I05ccd8a1d813de45e460384239c059418a8e6a08 Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
This commit is contained in:
parent
8fa0e4d1d2
commit
aba336c2b4
@ -2386,6 +2386,7 @@ void QUrl::setPath(const QString &path, ParsingMode mode)
|
||||
mode = TolerantMode;
|
||||
}
|
||||
|
||||
data = qt_normalizePathSegments(data, false);
|
||||
d->setPath(data, 0, data.length());
|
||||
|
||||
// optimized out, since there is no path delimiter
|
||||
@ -3251,9 +3252,10 @@ QUrl QUrl::adjusted(QUrl::FormattingOptions options) const
|
||||
if (options & RemovePath) {
|
||||
that.setPath(QString());
|
||||
} else if (options & (StripTrailingSlash | RemoveFilename | NormalizePathSegments)) {
|
||||
that.detach();
|
||||
QString path;
|
||||
d->appendPath(path, options | FullyEncoded, QUrlPrivate::Path);
|
||||
that.setPath(path, TolerantMode);
|
||||
that.d->setPath(path, 0, path.length());
|
||||
}
|
||||
return that;
|
||||
}
|
||||
|
@ -3373,6 +3373,12 @@ void tst_QUrl::setComponents_data()
|
||||
QTest::newRow("path-%3A-before-slash") << QUrl()
|
||||
<< int(Path) << "c%3A/" << Tolerant << true
|
||||
<< PrettyDecoded << "c%3A/" << "c%3A/";
|
||||
QTest::newRow("path-doubleslash") << QUrl("trash:/")
|
||||
<< int(Path) << "//path" << Tolerant << true
|
||||
<< PrettyDecoded << "/path" << "trash:/path";
|
||||
QTest::newRow("path-withdotdot") << QUrl("file:///tmp")
|
||||
<< int(Path) << "//tmp/..///root/." << Tolerant << true
|
||||
<< PrettyDecoded << "/root" << "file:///root";
|
||||
|
||||
// the other fields can be present and be empty
|
||||
// that is, their delimiters would be present, but there would be nothing to one side
|
||||
@ -3642,6 +3648,8 @@ void tst_QUrl::setComponents()
|
||||
if (isValid) {
|
||||
QFETCH(QString, toString);
|
||||
QCOMPARE(copy.toString(), toString);
|
||||
// Check round-tripping
|
||||
QCOMPARE(QUrl(copy.toString()).toString(), toString);
|
||||
} else {
|
||||
QVERIFY(copy.toString().isEmpty());
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user