67 if (connection->d_func()->encrypt)
68 socket =
new QSslSocket;
69#if QT_CONFIG(localserver)
70 else if (connection->d_func()->isLocalSocket)
71 socket =
new QLocalSocket;
74 socket =
new QTcpSocket;
76 socket =
new QTcpSocket;
78#ifndef QT_NO_NETWORKPROXY
80 if (
auto s = qobject_cast<QAbstractSocket *>(socket))
81 s->setProxy(QNetworkProxy::NoProxy);
87 QObject::connect(socket, &QIODevice::bytesWritten,
88 this, &QHttpNetworkConnectionChannel::_q_bytesWritten,
89 Qt::DirectConnection);
90 QObject::connect(socket, &QIODevice::readyRead,
91 this, &QHttpNetworkConnectionChannel::_q_readyRead,
92 Qt::DirectConnection);
95 QSocketAbstraction::visit([
this](
auto *socket){
96 using SocketType = std::remove_pointer_t<
decltype(socket)>;
97 QObject::connect(socket, &SocketType::connected,
98 this, &QHttpNetworkConnectionChannel::_q_connected,
99 Qt::DirectConnection);
107 QObject::connect(socket, &SocketType::disconnected,
108 this, &QHttpNetworkConnectionChannel::_q_disconnected,
109 Qt::DirectConnection);
110 if constexpr (std::is_same_v<SocketType, QAbstractSocket>) {
111 QObject::connect(socket, &QAbstractSocket::errorOccurred,
112 this, &QHttpNetworkConnectionChannel::_q_error,
113 Qt::DirectConnection);
114#if QT_CONFIG(localserver)
115 }
else if constexpr (std::is_same_v<SocketType, QLocalSocket>) {
116 auto convertAndForward = [
this](QLocalSocket::LocalSocketError error) {
117 _q_error(
static_cast<QAbstractSocket::SocketError>(error));
119 QObject::connect(socket, &SocketType::errorOccurred,
120 this, std::move(convertAndForward),
121 Qt::DirectConnection);
128#ifndef QT_NO_NETWORKPROXY
129 if (
auto *s = qobject_cast<QAbstractSocket *>(socket)) {
130 QObject::connect(s, &QAbstractSocket::proxyAuthenticationRequired,
131 this, &QHttpNetworkConnectionChannel::_q_proxyAuthenticationRequired,
132 Qt::DirectConnection);
137 QSslSocket *sslSocket = qobject_cast<QSslSocket*>(socket);
140 QObject::connect(sslSocket, &QSslSocket::encrypted,
141 this, &QHttpNetworkConnectionChannel::_q_encrypted,
142 Qt::DirectConnection);
143 QObject::connect(sslSocket, &QSslSocket::sslErrors,
144 this, &QHttpNetworkConnectionChannel::_q_sslErrors,
145 Qt::DirectConnection);
146 QObject::connect(sslSocket, &QSslSocket::preSharedKeyAuthenticationRequired,
147 this, &QHttpNetworkConnectionChannel::_q_preSharedKeyAuthenticationRequired,
148 Qt::DirectConnection);
149 QObject::connect(sslSocket, &QSslSocket::encryptedBytesWritten,
150 this, &QHttpNetworkConnectionChannel::_q_encryptedBytesWritten,
151 Qt::DirectConnection);
154 sslSocket->ignoreSslErrors();
156 if (!ignoreSslErrorsList.isEmpty())
157 sslSocket->ignoreSslErrors(ignoreSslErrorsList);
159 if (sslConfiguration && !sslConfiguration->isNull())
160 sslSocket->setSslConfiguration(*sslConfiguration);
163 if (connection->connectionType() != QHttpNetworkConnection::ConnectionTypeHTTP2)
164 protocolHandler.reset(
new QHttpProtocolHandler(
this));
169#ifndef QT_NO_NETWORKPROXY
170 if (
auto *s = qobject_cast<QAbstractSocket *>(socket);
171 s && proxy.type() != QNetworkProxy::NoProxy) {
298 QAbstractSocket::SocketState socketState = QSocketAbstraction::socketState(socket);
305 if (socketState == QAbstractSocket::ClosingState ||
306 (socketState != QAbstractSocket::UnconnectedState && !socket->isOpen())) {
313 if (socketState == QAbstractSocket::HostLookupState ||
314 socketState == QAbstractSocket::ConnectingState) {
320 if (socketState != QAbstractSocket::ConnectedState) {
322 state = QHttpNetworkConnectionChannel::ConnectingState;
329 authenticator.detach();
330 QAuthenticatorPrivate *priv = QAuthenticatorPrivate::getPrivate(authenticator);
331 priv->hasFailed =
false;
332 proxyAuthenticator.detach();
333 priv = QAuthenticatorPrivate::getPrivate(proxyAuthenticator);
334 priv->hasFailed =
false;
342 priv = QAuthenticatorPrivate::getPrivate(authenticator);
343 if (priv && priv->phase == QAuthenticatorPrivate::Done)
344 priv->phase = QAuthenticatorPrivate::Start;
345 priv = QAuthenticatorPrivate::getPrivate(proxyAuthenticator);
346 if (priv && priv->phase == QAuthenticatorPrivate::Done)
347 priv->phase = QAuthenticatorPrivate::Start;
349 QString connectHost = connection->d_func()->hostName;
350 quint16 connectPort = connection->d_func()->port;
352 QHttpNetworkReply *potentialReply = connection->d_func()->predictNextRequestsReply();
353 if (potentialReply) {
354 QMetaObject::invokeMethod(potentialReply,
"socketStartedConnecting", Qt::QueuedConnection);
355 }
else if (!h2RequestsToSend.isEmpty()) {
356 QMetaObject::invokeMethod(std::as_const(h2RequestsToSend).first().second,
"socketStartedConnecting", Qt::QueuedConnection);
359#ifndef QT_NO_NETWORKPROXY
361 if (connection->d_func()->networkProxy.type() != QNetworkProxy::NoProxy && !ssl) {
362 connectHost = connection->d_func()->networkProxy.hostName();
363 connectPort = connection->d_func()->networkProxy.port();
365 if (
auto *abSocket = qobject_cast<QAbstractSocket *>(socket);
366 abSocket && abSocket->proxy().type() == QNetworkProxy::HttpProxy) {
371 if (request.url().isEmpty()) {
372 if (connection->connectionType()
373 == QHttpNetworkConnection::ConnectionTypeHTTP2Direct
374 || (connection->connectionType() == QHttpNetworkConnection::ConnectionTypeHTTP2
375 && !h2RequestsToSend.isEmpty())) {
376 value = std::as_const(h2RequestsToSend).first().first.headerField(
"user-agent");
378 value = connection->d_func()->predictNextRequest().headerField(
"user-agent");
381 value = request.headerField(
"user-agent");
383 if (!value.isEmpty()) {
385 auto h = proxy.headers();
386 h.replaceOrAppend(QHttpHeaders::WellKnownHeader::UserAgent, value);
387 proxy.setHeaders(std::move(h));
388 abSocket->setProxy(proxy);
394 QSslSocket *sslSocket = qobject_cast<QSslSocket*>(socket);
399 if (
auto ctx = connection->sslContext())
400 QSslSocketPrivate::checkSettingSslContext(sslSocket, std::move(ctx));
402 sslSocket->setPeerVerifyName(connection->d_func()->peerVerifyName);
403 sslSocket->connectToHostEncrypted(connectHost, connectPort, QIODevice::ReadWrite, networkLayerPreference);
405 sslSocket->ignoreSslErrors();
406 sslSocket->ignoreSslErrors(ignoreSslErrorsList);
411 sslSocket->setReadBufferSize(64*1024);
415 connection->d_func()->dequeueRequest(socket);
416 connection->d_func()->emitReplyError(socket, reply, QNetworkReply::ProtocolUnknownError);
420#ifndef QT_NO_NETWORKPROXY
421 if (connection->d_func()->networkProxy.type() == QNetworkProxy::NoProxy
422 && connection->cacheProxy().type() == QNetworkProxy::NoProxy
423 && connection->transparentProxy().type() == QNetworkProxy::NoProxy) {
425 if (
auto *s = qobject_cast<QAbstractSocket *>(socket)) {
426 s->connectToHost(connectHost, connectPort,
427 QIODevice::ReadWrite | QIODevice::Unbuffered,
428 networkLayerPreference);
430 s->setReadBufferSize(1 * 1024);
431#if QT_CONFIG(localserver)
432 }
else if (
auto *s = qobject_cast<QLocalSocket *>(socket)) {
433 s->connectToServer(connectHost);
436#ifndef QT_NO_NETWORKPROXY
438 auto *s = qobject_cast<QAbstractSocket *>(socket);
443 s->connectToHost(connectHost, connectPort, QIODevice::ReadWrite, networkLayerPreference);
444 s->setReadBufferSize(64 * 1024);
466 qWarning(
"QHttpNetworkConnectionChannel::allDone() called without reply. Please report at http://bugreports.qt.io/");
474 if (connection->connectionType() == QHttpNetworkConnection::ConnectionTypeHTTP2
475 && !ssl && !switchedToHttp2) {
476 if (Http2::is_protocol_upgraded(*reply)) {
478 protocolHandler->setReply(
nullptr);
485 QMetaObject::invokeMethod(
this, [oldHandler = std::move(protocolHandler)]()
mutable {
487 }, Qt::QueuedConnection);
489 connection->fillHttp2Queue();
490 protocolHandler.reset(
new QHttp2ProtocolHandler(
this));
491 QHttp2ProtocolHandler *h2c =
static_cast<QHttp2ProtocolHandler *>(protocolHandler.get());
492 QMetaObject::invokeMethod(h2c,
"_q_receiveReply", Qt::QueuedConnection);
493 QMetaObject::invokeMethod(connection,
"_q_startNextRequest", Qt::QueuedConnection);
497 connection->setConnectionType(QHttpNetworkConnection::ConnectionTypeHTTP);
498 connection->d_func()->activeChannelCount = connection->d_func()->channelCount;
503 bool emitFinished =
reply->d_func()->shouldEmitSignals();
504 bool connectionCloseEnabled =
reply->d_func()->isConnectionCloseEnabled();
513 if (reply && emitFinished)
514 QMetaObject::invokeMethod(reply,
"finished", Qt::QueuedConnection);
522 if (state != QHttpNetworkConnectionChannel::ClosingState)
523 state = QHttpNetworkConnectionChannel::IdleState;
531 request = QHttpNetworkRequest();
533 protocolHandler->setReply(
nullptr);
537 if (!alreadyPipelinedRequests.isEmpty()) {
538 if (resendCurrent || connectionCloseEnabled || QSocketAbstraction::socketState(socket) != QAbstractSocket::ConnectedState) {
546 request = messagePair.first;
547 reply = messagePair.second;
548 protocolHandler->setReply(messagePair.second);
549 state = QHttpNetworkConnectionChannel::ReadingState;
556 connection->d_func()->fillPipeline(socket);
562 }
else if (alreadyPipelinedRequests.isEmpty() && socket->bytesAvailable() > 0) {
566 QMetaObject::invokeMethod(connection,
"_q_startNextRequest", Qt::QueuedConnection);
567 }
else if (alreadyPipelinedRequests.isEmpty()) {
568 if (connectionCloseEnabled)
569 if (QSocketAbstraction::socketState(socket) != QAbstractSocket::UnconnectedState)
571 if (qobject_cast<QHttpNetworkConnection*>(connection))
572 QMetaObject::invokeMethod(connection,
"_q_startNextRequest", Qt::QueuedConnection);
622 int statusCode =
reply->statusCode();
625 switch (statusCode) {
633 QUrl redirectUrl = connection->d_func()->parseRedirectResponse(socket, reply);
634 if (redirectUrl.isValid())
635 reply->setRedirectUrl(redirectUrl);
642 }
else if (qobject_cast<QHttpNetworkConnection *>(connection)) {
643 QMetaObject::invokeMethod(connection,
"_q_startNextRequest", Qt::QueuedConnection);
649 if (connection->d_func()->handleAuthenticateChallenge(socket, reply, (statusCode == 407), resend)) {
654 reply->d_func()->eraseData();
656 if (alreadyPipelinedRequests.isEmpty()) {
659 QMetaObject::invokeMethod(connection,
"_q_startNextRequest", Qt::QueuedConnection);
663 QMetaObject::invokeMethod(connection,
"_q_startNextRequest", Qt::QueuedConnection);
670 emit reply->headerChanged();
671 emit reply->readyRead();
672 QNetworkReply::NetworkError errorCode = (statusCode == 407)
673 ? QNetworkReply::ProxyAuthenticationRequiredError
674 : QNetworkReply::AuthenticationRequiredError;
675 reply->d_func()->errorString = connection->d_func()->errorDetail(errorCode, socket);
676 emit reply->finishedWithError(errorCode, reply->d_func()->errorString);
680 if (qobject_cast<QHttpNetworkConnection*>(connection))
681 QMetaObject::invokeMethod(connection,
"_q_startNextRequest", Qt::QueuedConnection);
754 QHttpNetworkRequest &request = pair.first;
755 QHttpNetworkReply *reply = pair.second;
756 reply->d_func()->clear();
757 reply->d_func()->connection = connection;
758 reply->d_func()->connectionChannel =
this;
759 reply->d_func()->autoDecompress = request.d->autoDecompress;
760 reply->d_func()->pipeliningUsed =
true;
762#ifndef QT_NO_NETWORKPROXY
763 pipeline.append(QHttpNetworkRequestPrivate::header(request,
764 (connection->d_func()->networkProxy.type() != QNetworkProxy::NoProxy)));
766 pipeline.append(QHttpNetworkRequestPrivate::header(request,
false));
769 alreadyPipelinedRequests.append(pair);
875 if (connection->d_func()->networkLayerState == QHttpNetworkConnectionPrivate::HostLookupPending || connection->d_func()->networkLayerState == QHttpNetworkConnectionPrivate::IPv4or6) {
876 if (connection->d_func()->delayedConnectionTimer.isActive())
877 connection->d_func()->delayedConnectionTimer.stop();
878 if (networkLayerPreference == QAbstractSocket::IPv4Protocol)
879 connection->d_func()->networkLayerState = QHttpNetworkConnectionPrivate::IPv4;
880 else if (networkLayerPreference == QAbstractSocket::IPv6Protocol)
881 connection->d_func()->networkLayerState = QHttpNetworkConnectionPrivate::IPv6;
883 if (absSocket->peerAddress().protocol() == QAbstractSocket::IPv4Protocol)
884 connection->d_func()->networkLayerState = QHttpNetworkConnectionPrivate::IPv4;
886 connection->d_func()->networkLayerState = QHttpNetworkConnectionPrivate::IPv6;
888 connection->d_func()->networkLayerDetected(networkLayerPreference);
889 if (connection->d_func()->activeChannelCount > 1 && !connection->d_func()->encrypt)
890 QMetaObject::invokeMethod(connection,
"_q_startNextRequest", Qt::QueuedConnection);
892 bool anyProtocol = networkLayerPreference == QAbstractSocket::AnyIPProtocol;
893 if (((connection->d_func()->networkLayerState == QHttpNetworkConnectionPrivate::IPv4)
894 && (networkLayerPreference != QAbstractSocket::IPv4Protocol && !anyProtocol))
895 || ((connection->d_func()->networkLayerState == QHttpNetworkConnectionPrivate::IPv6)
896 && (networkLayerPreference != QAbstractSocket::IPv6Protocol && !anyProtocol))) {
899 QMetaObject::invokeMethod(connection,
"_q_startNextRequest", Qt::QueuedConnection);
915 absSocket->setSocketOption(QAbstractSocket::KeepAliveOption, 1);
923 if (!connection->sslContext()) {
926 if (
auto socketSslContext = QSslSocketPrivate::sslContext(
static_cast<QSslSocket*>(absSocket)))
927 connection->setSslContext(std::move(socketSslContext));
930 }
else if (connection->connectionType() == QHttpNetworkConnection::ConnectionTypeHTTP2Direct) {
931 state = QHttpNetworkConnectionChannel::IdleState;
932 protocolHandler.reset(
new QHttp2ProtocolHandler(
this));
933 if (h2RequestsToSend.size() > 0) {
936 QMetaObject::invokeMethod(connection,
"_q_startNextRequest", Qt::QueuedConnection);
939 state = QHttpNetworkConnectionChannel::IdleState;
940 const bool tryProtocolUpgrade = connection->connectionType() == QHttpNetworkConnection::ConnectionTypeHTTP2;
941 if (tryProtocolUpgrade) {
943 protocolHandler.reset(
new QHttpProtocolHandler(
this));
948 connection->d_func()->dequeueRequest(absSocket);
951 if (tryProtocolUpgrade) {
954 Http2::appendProtocolUpgradeHeaders(connection->http2Parameters(), &request);
986 QNetworkReply::NetworkError errorCode = QNetworkReply::UnknownNetworkError;
988 switch (socketError) {
989 case QAbstractSocket::HostNotFoundError:
990 errorCode = QNetworkReply::HostNotFoundError;
992 case QAbstractSocket::ConnectionRefusedError:
993 errorCode = QNetworkReply::ConnectionRefusedError;
994#ifndef QT_NO_NETWORKPROXY
995 if (connection->d_func()->networkProxy.type() != QNetworkProxy::NoProxy && !ssl)
996 errorCode = QNetworkReply::ProxyConnectionRefusedError;
999 case QAbstractSocket::RemoteHostClosedError:
1003 if (!reply && state == QHttpNetworkConnectionChannel::IdleState) {
1010 if (protocolHandler) {
1011 if (connection->connectionType() == QHttpNetworkConnection::ConnectionTypeHTTP2Direct
1012 || (connection->connectionType() == QHttpNetworkConnection::ConnectionTypeHTTP2
1013 && switchedToHttp2)) {
1014 auto h2Handler =
static_cast<QHttp2ProtocolHandler *>(protocolHandler.get());
1015 h2Handler->handleConnectionClosure();
1019 }
else if (state != QHttpNetworkConnectionChannel::IdleState && state != QHttpNetworkConnectionChannel::ReadingState) {
1029 errorCode = QNetworkReply::RemoteHostClosedError;
1031 }
else if (state == QHttpNetworkConnectionChannel::ReadingState) {
1035 if (!
reply->d_func()->expectContent()) {
1038 QMetaObject::invokeMethod(
this,
"_q_receiveReply", Qt::QueuedConnection);
1041 if (
reply->contentLength() == -1 && !
reply->d_func()->isChunked()) {
1045 QMetaObject::invokeMethod(
this,
"_q_receiveReply", Qt::QueuedConnection);
1050 if (socket->bytesAvailable()) {
1054 reply->setReadBufferSize(0);
1055 reply->setDownstreamLimited(
false);
1060 state = QHttpNetworkConnectionChannel::IdleState;
1061 QMetaObject::invokeMethod(connection,
"_q_startNextRequest", Qt::QueuedConnection);
1066 errorCode = QNetworkReply::RemoteHostClosedError;
1068 errorCode = QNetworkReply::RemoteHostClosedError;
1071 case QAbstractSocket::SocketTimeoutError:
1073 if (state == QHttpNetworkConnectionChannel::WritingState && (reconnectAttempts-- > 0)) {
1077 errorCode = QNetworkReply::TimeoutError;
1079 case QAbstractSocket::ProxyConnectionRefusedError:
1080 errorCode = QNetworkReply::ProxyConnectionRefusedError;
1082 case QAbstractSocket::ProxyAuthenticationRequiredError:
1083 errorCode = QNetworkReply::ProxyAuthenticationRequiredError;
1085 case QAbstractSocket::SslHandshakeFailedError:
1086 errorCode = QNetworkReply::SslHandshakeFailedError;
1088 case QAbstractSocket::ProxyConnectionClosedError:
1094 errorCode = QNetworkReply::ProxyConnectionClosedError;
1096 case QAbstractSocket::ProxyConnectionTimeoutError:
1102 errorCode = QNetworkReply::ProxyTimeoutError;
1106 errorCode = QNetworkReply::UnknownNetworkError;
1109 QPointer<QHttpNetworkConnection> that = connection;
1110 QString errorString = connection->d_func()->errorDetail(errorCode, socket, socket->errorString());
1114 if (!connection->d_func()->shouldEmitChannelError(socket))
1124 connection->d_func()->dequeueRequest(socket);
1127 reply->d_func()->errorString = errorString;
1128 reply->d_func()->httpErrorCode = errorCode;
1129 emit reply->finishedWithError(errorCode, errorString);
1131 if (protocolHandler)
1132 protocolHandler->setReply(
nullptr);
1134 }
while (!connection->d_func()->highPriorityQueue.isEmpty()
1135 || !connection->d_func()->lowPriorityQueue.isEmpty());
1137 if (connection->connectionType() == QHttpNetworkConnection::ConnectionTypeHTTP2
1138 || connection->connectionType() == QHttpNetworkConnection::ConnectionTypeHTTP2Direct) {
1139 const auto h2RequestsToSendCopy = std::exchange(h2RequestsToSend, {});
1140 for (
const auto &httpMessagePair : h2RequestsToSendCopy) {
1142 QHttpNetworkReply *currentReply = httpMessagePair.second;
1143 currentReply->d_func()->errorString = errorString;
1144 currentReply->d_func()->httpErrorCode = errorCode;
1145 Q_ASSERT(currentReply);
1146 emit currentReply->finishedWithError(errorCode, errorString);
1151 QMetaObject::invokeMethod(that,
"_q_startNextRequest", Qt::QueuedConnection);
1156 state = QHttpNetworkConnectionChannel::IdleState;
1157 else if (QSocketAbstraction::socketState(socket) == QAbstractSocket::UnconnectedState)
1158 state = QHttpNetworkConnectionChannel::IdleState;
1160 state = QHttpNetworkConnectionChannel::ClosingState;
1207 QSslSocket *sslSocket = qobject_cast<QSslSocket *>(socket);
1208 Q_ASSERT(sslSocket);
1210 if (!protocolHandler && connection->connectionType() != QHttpNetworkConnection::ConnectionTypeHTTP2Direct) {
1214 switch (sslSocket->sslConfiguration().nextProtocolNegotiationStatus()) {
1215 case QSslConfiguration::NextProtocolNegotiationNegotiated: {
1216 QByteArray nextProtocol = sslSocket->sslConfiguration().nextNegotiatedProtocol();
1217 if (nextProtocol == QSslConfiguration::NextProtocolHttp1_1) {
1219 }
else if (nextProtocol == QSslConfiguration::ALPNProtocolHTTP2) {
1221 protocolHandler.reset(
new QHttp2ProtocolHandler(
this));
1222 connection->setConnectionType(QHttpNetworkConnection::ConnectionTypeHTTP2);
1225 emitFinishedWithError(QNetworkReply::SslHandshakeFailedError,
1226 "detected unknown Next Protocol Negotiation protocol");
1231 case QSslConfiguration::NextProtocolNegotiationUnsupported:
1232 case QSslConfiguration::NextProtocolNegotiationNone: {
1233 protocolHandler.reset(
new QHttpProtocolHandler(
this));
1235 QSslConfiguration newConfiguration = sslSocket->sslConfiguration();
1236 QList<QByteArray> protocols = newConfiguration.allowedNextProtocols();
1237 const int nProtocols = protocols.size();
1240 if (connection->connectionType() == QHttpNetworkConnection::ConnectionTypeHTTP2)
1241 protocols.removeAll(QSslConfiguration::ALPNProtocolHTTP2);
1243 if (nProtocols > protocols.size()) {
1244 newConfiguration.setAllowedNextProtocols(protocols);
1245 const int channelCount = connection->d_func()->channelCount;
1246 for (
int i = 0; i < channelCount; ++i)
1247 connection->d_func()->channels[i].setSslConfiguration(newConfiguration);
1250 connection->setConnectionType(QHttpNetworkConnection::ConnectionTypeHTTP);
1254 if (connection->d_func()->activeChannelCount < connection->d_func()->channelCount) {
1255 connection->d_func()->activeChannelCount = connection->d_func()->channelCount;
1262 emitFinishedWithError(QNetworkReply::SslHandshakeFailedError,
1263 "detected unknown Next Protocol Negotiation protocol");
1265 }
else if (connection->connectionType() == QHttpNetworkConnection::ConnectionTypeHTTP2
1266 || connection->connectionType() == QHttpNetworkConnection::ConnectionTypeHTTP2Direct) {
1269 protocolHandler.reset(
new QHttp2ProtocolHandler(
this));
1274 state = QHttpNetworkConnectionChannel::IdleState;
1277 if (connection->connectionType() == QHttpNetworkConnection::ConnectionTypeHTTP2 ||
1278 connection->connectionType() == QHttpNetworkConnection::ConnectionTypeHTTP2Direct) {
1279 if (!h2RequestsToSend.isEmpty()) {
1281 const auto &pair = std::as_const(h2RequestsToSend).first();
1283 emit pair.second->encrypted();
1290 QMetaObject::invokeMethod(
this,
1291 &QHttpNetworkConnectionChannel::checkAndResumeCommunication,
1292 Qt::QueuedConnection);
1299 connection->d_func()->dequeueRequest(socket);
1301 reply->setHttp2WasUsed(
false);
1302 Q_ASSERT(
reply->d_func()->connectionChannel ==
this);
1303 emit reply->encrypted();
1308 QMetaObject::invokeMethod(connection,
"_q_startNextRequest", Qt::QueuedConnection);
1347 connection->d_func()->pauseConnection();
1348 if (pendingEncrypt && !reply)
1349 connection->d_func()->dequeueRequest(socket);
1350 if (connection->connectionType() == QHttpNetworkConnection::ConnectionTypeHTTP) {
1352 emit reply->sslErrors(errors);
1356 const auto h2RequestsToSendCopy = h2RequestsToSend;
1357 for (
const auto &httpMessagePair : h2RequestsToSendCopy) {
1359 QHttpNetworkReply *currentReply = httpMessagePair.second;
1360 Q_ASSERT(currentReply);
1361 emit currentReply->sslErrors(errors);
1365 connection->d_func()->resumeConnection();