diff options
Diffstat (limited to 'src/corelib/io/qurl.cpp')
-rw-r--r-- | src/corelib/io/qurl.cpp | 96 |
1 files changed, 18 insertions, 78 deletions
diff --git a/src/corelib/io/qurl.cpp b/src/corelib/io/qurl.cpp index 15785b48e0..b4090f710e 100644 --- a/src/corelib/io/qurl.cpp +++ b/src/corelib/io/qurl.cpp @@ -116,27 +116,12 @@ Calling isRelative() will return whether or not the URL is relative. A relative URL has no \l {scheme}. For example: - \code - qDebug() << QUrl("main.qml").isRelative(); // true: no scheme - qDebug() << QUrl("qml/main.qml").isRelative(); // true: no scheme - qDebug() << QUrl("file:main.qml").isRelative(); // false: has "file" scheme - qDebug() << QUrl("file:qml/main.qml").isRelative(); // false: has "file" scheme - \endcode + \snippet code/src_corelib_io_qurl.cpp 8 Notice that a URL can be absolute while containing a relative path, and vice versa: - \code - // Absolute URL, relative path - QUrl url("file:file.txt"); - qDebug() << url.isRelative(); // false: has "file" scheme - qDebug() << QDir::isAbsolutePath(url.path()); // false: relative path - - // Relative URL, absolute path - url = QUrl("/home/user/file.txt"); - qDebug() << url.isRelative(); // true: has no scheme - qDebug() << QDir::isAbsolutePath(url.path()); // true: absolute path - \endcode + \snippet code/src_corelib_io_qurl.cpp 9 A relative URL can be resolved by passing it as an argument to resolved(), which returns an absolute URL. isParentOf() is used for determining whether @@ -268,7 +253,8 @@ and contains no query or fragment, a local file path is returned. \value StripTrailingSlash The trailing slash is removed from the path, if one is present. \value NormalizePathSegments Modifies the path to remove redundant directory separators, - and to resolve "."s and ".."s (as far as possible). + and to resolve "."s and ".."s (as far as possible). For non-local paths, adjacent + slashes are preserved. Note that the case folding rules in \l{RFC 3491}{Nameprep}, which QUrl conforms to, require host names to always be converted to lower case, @@ -369,14 +355,7 @@ The following example illustrates the problem: - \code - QUrl original("http://example.com/?q=a%2B%3Db%26c"); - QUrl copy(original); - copy.setQuery(copy.query(QUrl::FullyDecoded), QUrl::DecodedMode); - - qDebug() << original.toString(); // prints: http://example.com/?q=a%2B%3Db%26c - qDebug() << copy.toString(); // prints: http://example.com/?q=a+=b&c - \endcode + \snippet code/src_corelib_io_qurl.cpp 10 If the two URLs were used via HTTP GET, the interpretation by the web server would probably be different. In the first case, it would interpret @@ -441,10 +420,9 @@ #endif #include "private/qipaddress_p.h" #include "qurlquery.h" +#include "private/qdir_p.h" QT_BEGIN_NAMESPACE -extern QString qt_normalizePathSegments(const QString &name, bool allowUncPaths, - bool *ok = nullptr); // qdir.cpp inline static bool isHex(char c) { @@ -952,7 +930,7 @@ inline void QUrlPrivate::appendPath(QString &appendTo, QUrl::FormattingOptions o { QString thePath = path; if (options & QUrl::NormalizePathSegments) { - thePath = qt_normalizePathSegments(path, false); + thePath = qt_normalizePathSegments(path, isLocalFile() ? QDirPrivate::DefaultNormalization : QDirPrivate::RemotePath); } QStringRef thePathRef(&thePath); @@ -1991,10 +1969,7 @@ void QUrl::setUrl(const QString &url, ParsingMode parsingMode) \image qurl-authority2.png To set the scheme, the following call is used: - \code - QUrl url; - url.setScheme("ftp"); - \endcode + \snippet code/src_corelib_io_qurl.cpp 11 The scheme can also be empty, in which case the URL is interpreted as relative. @@ -2569,11 +2544,7 @@ void QUrl::setPath(const QString &path, ParsingMode mode) /*! Returns the path of the URL. - \code - qDebug() << QUrl("file:file.txt").path(); // "file.txt" - qDebug() << QUrl("/home/user/file.txt").path(); // "/home/user/file.txt" - qDebug() << QUrl("http://www.example.com/test/123").path(); // "/test/123" - \endcode + \snippet code/src_corelib_io_qurl.cpp 12 The \a options argument controls how to format the path component. All values produce an unambiguous result. With QUrl::FullyDecoded, all @@ -2588,27 +2559,18 @@ void QUrl::setPath(const QString &path, ParsingMode mode) An example of data loss is when you have non-Unicode percent-encoded sequences and use FullyDecoded (the default): - \code - qDebug() << QUrl("/foo%FFbar").path(); - \endcode + \snippet code/src_corelib_io_qurl.cpp 13 In this example, there will be some level of data loss because the \c %FF cannot be converted. Data loss can also occur when the path contains sub-delimiters (such as \c +): - \code - qDebug() << QUrl("/foo+bar%2B").path(); // "/foo+bar+" - \endcode + \snippet code/src_corelib_io_qurl.cpp 14 Other decoding examples: - \code - const QUrl url("/tmp/Mambo %235%3F.mp3"); - qDebug() << url.path(QUrl::FullyDecoded); // "/tmp/Mambo #5?.mp3" - qDebug() << url.path(QUrl::PrettyDecoded); // "/tmp/Mambo #5?.mp3" - qDebug() << url.path(QUrl::FullyEncoded); // "/tmp/Mambo%20%235%3F.mp3" - \endcode + \snippet code/src_corelib_io_qurl.cpp 15 \sa setPath() */ @@ -3859,40 +3821,22 @@ bool QUrl::isDetached() const An empty \a localFile leads to an empty URL (since Qt 5.4). - \code - qDebug() << QUrl::fromLocalFile("file.txt"); // QUrl("file:file.txt") - qDebug() << QUrl::fromLocalFile("/home/user/file.txt"); // QUrl("file:///home/user/file.txt") - qDebug() << QUrl::fromLocalFile("file:file.txt"); // doesn't make sense; expects path, not url with scheme - \endcode + \snippet code/src_corelib_io_qurl.cpp 16 In the first line in snippet above, a file URL is constructed from a local, relative path. A file URL with a relative path only makes sense if there is a base URL to resolve it against. For example: - \code - QUrl url = QUrl::fromLocalFile("file.txt"); - QUrl baseUrl = QUrl("file:/home/user/"); - // wrong: prints QUrl("file:file.txt"), as url already has a scheme - qDebug() << baseUrl.resolved(url); - \endcode + \snippet code/src_corelib_io_qurl.cpp 17 To resolve such a URL, it's necessary to remove the scheme beforehand: - \code - // correct: prints QUrl("file:///home/user/file.txt") - url.setScheme(QString()); - qDebug() << baseUrl.resolved(url); - \endcode + \snippet code/src_corelib_io_qurl.cpp 18 For this reason, it is better to use a relative URL (that is, no scheme) for relative file paths: - \code - QUrl url = QUrl("file.txt"); - QUrl baseUrl = QUrl("file:/home/user/"); - // prints QUrl("file:///home/user/file.txt") - qDebug() << baseUrl.resolved(url); - \endcode + \snippet code/src_corelib_io_qurl.cpp 19 \sa toLocalFile(), isLocalFile(), QDir::toNativeSeparators() */ @@ -3938,11 +3882,7 @@ QUrl QUrl::fromLocalFile(const QString &localFile) returned value in the form found on SMB networks (for example, "//servername/path/to/file.txt"). - \code - qDebug() << QUrl("file:file.txt").toLocalFile(); // "file:file.txt" - qDebug() << QUrl("file:/home/user/file.txt").toLocalFile(); // "file:///home/user/file.txt" - qDebug() << QUrl("file.txt").toLocalFile(); // ""; wasn't a local file as it had no scheme - \endcode + \snippet code/src_corelib_io_qurl.cpp 20 Note: if the path component of this URL contains a non-UTF-8 binary sequence (such as %80), the behaviour of this function is undefined. @@ -4219,7 +4159,7 @@ QList<QUrl> QUrl::fromStringList(const QStringList &urls, ParsingMode mode) \relates QHash \since 5.0 */ -uint qHash(const QUrl &url, uint seed) Q_DECL_NOTHROW +uint qHash(const QUrl &url, uint seed) noexcept { if (!url.d) return qHash(-1, seed); // the hash of an unset port (-1) |