Changes to Qt Network▲
Qt 6 is a result of the conscious effort to make the framework more efficient and easy to use.
We try to maintain binary and source compatibility for all the public APIs in each release. But some changes were inevitable in an effort to make Qt a better framework.
In this topic we summarize those changes in Qt Network, and provide guidance to handle them.
API changes▲
Ambiguous name overloads▲
Several ambiguous overloaded functions are removed. The error() signal is replaced by errorOccurred() in QAbstractSocket and its heirs (QTcpSocket, QUdpSocket, QLocalSocket, and QSslSocket), and in QNetworkReply. Code such as:
connect(socket, qOverload&
lt;QAbstractSocket::
SocketError&
gt;(&
amp;QAbstractSocket::
error),
this
, &
amp;SomeClass::
errorSlot);
must therefore be changed to:
connect(socket, &
amp;QAbstractSocket::
errorOccurred, this
, &
amp;SomeClass::
errorSlot);
In QSslSocket, the function that returns a list of errors encountered during the TLS handshake:
QList&
lt;QSslError&
gt; sslErrors() const
;
is renamed to sslHandshakeErrors():
const
auto
tlsErrors =
socket.sslHandshakeErrors();
Bearer management is removed▲
The classes QNetworkConfiguration and QNetworkConfigurationManager are removed in Qt 6. Consequently, the following member functions of QNetworkAccessManager are also removed:
void
setConfiguration(const
QNetworkConfiguration &
amp;config);
QNetworkConfiguration configuration() const
;
QNetworkConfiguration activeConfiguration() const
;
void
setNetworkAccessible(NetworkAccessibility accessible);
NetworkAccessibility networkAccessible() const
;
void
networkSessionConnected();
QNetworkInformation, initially introduced in Qt 6.1, aims to replace some aspects of the bearer management API. It works by providing a unified API which subscribes to changes to the network as notified by the operating system.
QNetworkInformation::reachability(), introduced in Qt 6.1, replaces the QNetworkAccessManager::networkAccessible() function, while adding more detailed information about the reachability of the network. See its documentation for more details.
In Qt 6.2 QNetworkInformation gained the ability to detect captive portals.
In Qt 6.3 QNetworkInformation gained QNetworkInformation::transportMedium() and QNetworkInformation::isMetered().
Deleted enumerators▲
Several enumerators are removed in QtNetwork. This includes constants for no longer supported protocols and functionality:
-
QSsl::SslV2;
-
QSsl::SslV3;
-
QSsl::TlsV1SslV3;
-
QNetworkRequest::SpdyAllowedAttribute;
-
QNetworkRequest::SpdyWasUsedAttribute;
-
QNetworkAccessManager::UnknownAccessibility;
-
QNetworkAccessManager::NotAccessible;
-
QNetworkAccessManager::Accessible
and enumerators whose names did not follow proper naming conventions:
-
QSsl::TlsV1 (QSsl::TlsV1_0 is the proper name);
-
QNetworkRequest::HTTP2AllowedAttribute (use QNetworkRequest::Http2AllowedAttribute);
-
QNetworkRequest::HTTP2WasUsedAttribute (use QNetworkRequest::Http2WasUsedAttribute).
QNetworkRequest::FollowRedirectsAttribute is removed in Qt 6, see the section about redirects handling below.
Configuring QSslSocket▲
The following deprecated functions are removed in Qt 6:
QList&
lt;QSslCipher&
gt; ciphers() const
;
void
setCiphers(const
QList&
lt;QSslCipher&
gt; &
amp;ciphers);
void
setCiphers(const
QString &
amp;ciphers);
static
void
setDefaultCiphers(const
QList&
lt;QSslCipher&
gt; &
amp;ciphers);
static
QList&
lt;QSslCipher&
gt; defaultCiphers();
static
QList&
lt;QSslCipher&
gt; supportedCiphers();
QList&
lt;QSslCipher&
gt; ciphers() const
;
void
setCiphers(const
QList&
lt;QSslCipher&
gt; &
amp;ciphers);
void
setCiphers(const
QString &
amp;ciphers);
static
void
setDefaultCiphers(const
QList&
lt;QSslCipher&
gt; &
amp;ciphers);
static
QList&
lt;QSslCipher&
gt; defaultCiphers();
static
QList&
lt;QSslCipher&
gt; supportedCiphers();
bool
addCaCertificates(const
QString &
amp;path, QSsl::
EncodingFormat format =
QSsl::
Pem,
QRegExp::
PatternSyntax syntax =
QRegExp::
FixedString);
void
addCaCertificate(const
QSslCertificate &
amp;certificate);
void
addCaCertificates(const
QList&
lt;QSslCertificate&
gt; &
amp;certificates);
void
setCaCertificates(const
QList&
lt;QSslCertificate&
gt; &
amp;certificates);
QList&
lt;QSslCertificate&
gt; caCertificates() const
;
static
bool
addDefaultCaCertificates(const
QString &
amp;path, QSsl::
EncodingFormat format =
QSsl::
Pem,
QRegExp::
PatternSyntax syntax =
QRegExp::
FixedString);
static
void
addDefaultCaCertificate(const
QSslCertificate &
amp;certificate);
static
void
addDefaultCaCertificates(const
QList&
lt;QSslCertificate&
gt; &
amp;certificates);
static
void
setDefaultCaCertificates(const
QList&
lt;QSslCertificate&
gt; &
amp;certificates);
static
QList&
lt;QSslCertificate&
gt; defaultCaCertificates();
static
QList&
lt;QSslCertificate&
gt; systemCaCertificates();
Use QSslConfiguration and its member functions to set these parameters, e.g.:
auto
sslConfiguration =
QSslConfiguration::
defaultConfiguration();
sslConfiguration.setCiphers("ECDHE-ECDSA-AES256-SHA384"
);
// Set other parameters here ...
socket.setSslConfiguration(sslConfiguration);
Changes in QNetworkAccessManager's default behavior▲
Redirect policies▲
In Qt 6, the default redirect policy has changed from manual to QNetworkRequest::NoLessSafeRedirectPolicy. If your application relies on manual redirect handling (it connects its slot to the QNetworkReply::redirected signal), you have to explicitly set this policy when creating a request:
request.setAttribute(QNetworkRequest::
RedirectPolicyAttribute, QNetworkRequest::
ManualRedirectPolicy);
HTTP/2 is enabled by default▲
In Qt 6 QNetworkAccessManager enables HTTP/2 protocol by default. Depending on the scheme ("https" or "http"), QNetworkAccessManager will use the Application Layer Protocol Negotiation TLS extension or "protocol upgrade" HTTP header to negotiate HTTP/2. If HTTP/2 cannot be negotiated, the access manager will fall back to using HTTP/1.1. If your application can only use HTTP/1.1, you have to disable HTTP/2 manually on a new request:
request.setAttribute(QNetworkRequest::
Http2AllowedAttribute, false
);
QNetworkAccessManager now guards against archive bombs▲
Starting with Qt 6.2 QNetworkAccessManager will guard against compressed files that decompress to files which are much larger than their compressed form by erroring out the reply if the decompression ratio exceeds a certain threshold. This check is only applied to files larger than a certain size, which can be customized (or disabled by passing -1) by calling QNetworkRequest::setDecompressedSafetyCheckThreshold().