summaryrefslogtreecommitdiffstats
path: root/src/corelib/io/qurl.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/corelib/io/qurl.cpp')
-rw-r--r--src/corelib/io/qurl.cpp96
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)