72 if (connection->d_func()->encrypt)
73 socket =
new QSslSocket;
74#if QT_CONFIG(localserver)
75 else if (connection->d_func()->isLocalSocket)
76 socket =
new QLocalSocket;
79 socket =
new QTcpSocket;
81 socket =
new QTcpSocket;
83#ifndef QT_NO_NETWORKPROXY
85 if (
auto s = qobject_cast<QAbstractSocket *>(socket))
86 s->setProxy(QNetworkProxy::NoProxy);
92 QObject::connect(socket, &QIODevice::bytesWritten,
93 this, &QHttpNetworkConnectionChannel::_q_bytesWritten,
94 Qt::DirectConnection);
95 QObject::connect(socket, &QIODevice::readyRead,
96 this, &QHttpNetworkConnectionChannel::_q_readyRead,
97 Qt::DirectConnection);
100 QSocketAbstraction::visit([
this](
auto *socket){
101 using SocketType = std::remove_pointer_t<
decltype(socket)>;
102 QObject::connect(socket, &SocketType::connected,
103 this, &QHttpNetworkConnectionChannel::_q_connected,
104 Qt::DirectConnection);
112 QObject::connect(socket, &SocketType::disconnected,
113 this, &QHttpNetworkConnectionChannel::_q_disconnected,
114 Qt::DirectConnection);
115 if constexpr (std::is_same_v<SocketType, QAbstractSocket>) {
116 QObject::connect(socket, &QAbstractSocket::errorOccurred,
117 this, &QHttpNetworkConnectionChannel::_q_error,
118 Qt::DirectConnection);
119#if QT_CONFIG(localserver)
120 }
else if constexpr (std::is_same_v<SocketType, QLocalSocket>) {
121 auto convertAndForward = [
this](QLocalSocket::LocalSocketError error) {
122 _q_error(
static_cast<QAbstractSocket::SocketError>(error));
124 QObject::connect(socket, &SocketType::errorOccurred,
125 this, std::move(convertAndForward),
126 Qt::DirectConnection);
133#ifndef QT_NO_NETWORKPROXY
134 if (
auto *s = qobject_cast<QAbstractSocket *>(socket)) {
135 QObject::connect(s, &QAbstractSocket::proxyAuthenticationRequired,
136 this, &QHttpNetworkConnectionChannel::_q_proxyAuthenticationRequired,
137 Qt::DirectConnection);
142 QSslSocket *sslSocket = qobject_cast<QSslSocket*>(socket);
145 QObject::connect(sslSocket, &QSslSocket::encrypted,
146 this, &QHttpNetworkConnectionChannel::_q_encrypted,
147 Qt::DirectConnection);
148 QObject::connect(sslSocket, &QSslSocket::sslErrors,
149 this, &QHttpNetworkConnectionChannel::_q_sslErrors,
150 Qt::DirectConnection);
151 QObject::connect(sslSocket, &QSslSocket::preSharedKeyAuthenticationRequired,
152 this, &QHttpNetworkConnectionChannel::_q_preSharedKeyAuthenticationRequired,
153 Qt::DirectConnection);
154 QObject::connect(sslSocket, &QSslSocket::encryptedBytesWritten,
155 this, &QHttpNetworkConnectionChannel::_q_encryptedBytesWritten,
156 Qt::DirectConnection);
160 sslSocket->ignoreSslErrors();
162 if (!ignoreSslErrorsList.isEmpty())
163 sslSocket->ignoreSslErrors(ignoreSslErrorsList);
166 if (sslConfiguration && !sslConfiguration->isNull())
167 sslSocket->setSslConfiguration(*sslConfiguration);
170 if (connection->connectionType() != QHttpNetworkConnection::ConnectionTypeHTTP2)
171 protocolHandler.reset(
new QHttpProtocolHandler(
this));
176#ifndef QT_NO_NETWORKPROXY
177 if (
auto *s = qobject_cast<QAbstractSocket *>(socket);
178 s && proxy.type() != QNetworkProxy::NoProxy) {
307 QAbstractSocket::SocketState socketState = QSocketAbstraction::socketState(socket);
314 if (socketState == QAbstractSocket::ClosingState ||
315 (socketState != QAbstractSocket::UnconnectedState && !socket->isOpen())) {
322 if (socketState == QAbstractSocket::HostLookupState ||
323 socketState == QAbstractSocket::ConnectingState) {
329 if (socketState != QAbstractSocket::ConnectedState) {
331 state = QHttpNetworkConnectionChannel::ConnectingState;
338 authenticator.detach();
339 QAuthenticatorPrivate *priv = QAuthenticatorPrivate::getPrivate(authenticator);
340 priv->hasFailed =
false;
341 proxyAuthenticator.detach();
342 priv = QAuthenticatorPrivate::getPrivate(proxyAuthenticator);
343 priv->hasFailed =
false;
351 priv = QAuthenticatorPrivate::getPrivate(authenticator);
352 if (priv && priv->phase == QAuthenticatorPrivate::Done)
353 priv->phase = QAuthenticatorPrivate::Start;
354 priv = QAuthenticatorPrivate::getPrivate(proxyAuthenticator);
355 if (priv && priv->phase == QAuthenticatorPrivate::Done)
356 priv->phase = QAuthenticatorPrivate::Start;
358 QString connectHost = connection->d_func()->hostName;
359 quint16 connectPort = connection->d_func()->port;
361 QHttpNetworkReply *potentialReply = connection->d_func()->predictNextRequestsReply();
362 if (potentialReply) {
363 QMetaObject::invokeMethod(potentialReply,
"socketStartedConnecting", Qt::QueuedConnection);
364 }
else if (!h2RequestsToSend.isEmpty()) {
365 QMetaObject::invokeMethod(std::as_const(h2RequestsToSend).first().second,
"socketStartedConnecting", Qt::QueuedConnection);
368#ifndef QT_NO_NETWORKPROXY
370 if (connection->d_func()->networkProxy.type() != QNetworkProxy::NoProxy && !ssl) {
371 connectHost = connection->d_func()->networkProxy.hostName();
372 connectPort = connection->d_func()->networkProxy.port();
374 if (
auto *abSocket = qobject_cast<QAbstractSocket *>(socket);
375 abSocket && abSocket->proxy().type() == QNetworkProxy::HttpProxy) {
380 if (request.url().isEmpty()) {
381 if (connection->connectionType()
382 == QHttpNetworkConnection::ConnectionTypeHTTP2Direct
383 || (connection->connectionType() == QHttpNetworkConnection::ConnectionTypeHTTP2
384 && !h2RequestsToSend.isEmpty())) {
385 value =
std::as_const(h2RequestsToSend).first().first.headerField(
"user-agent");
387 value = connection->d_func()->predictNextRequest().headerField(
"user-agent");
390 value = request.headerField(
"user-agent");
392 if (!value.isEmpty()) {
394 auto h = proxy.headers();
395 h.replaceOrAppend(QHttpHeaders::WellKnownHeader::UserAgent, value);
396 proxy.setHeaders(std::move(h));
397 abSocket->setProxy(proxy);
403 QSslSocket *sslSocket = qobject_cast<QSslSocket*>(socket);
408 if (
auto ctx = connection->sslContext())
409 QSslSocketPrivate::checkSettingSslContext(sslSocket, std::move(ctx));
411 sslSocket->setPeerVerifyName(connection->d_func()->peerVerifyName);
412 sslSocket->connectToHostEncrypted(connectHost, connectPort, QIODevice::ReadWrite, networkLayerPreference);
415 sslSocket->ignoreSslErrors();
416 sslSocket->ignoreSslErrors(ignoreSslErrorsList);
422 sslSocket->setReadBufferSize(64*1024);
426 connection->d_func()->dequeueRequest(socket);
427 connection->d_func()->emitReplyError(socket, reply, QNetworkReply::ProtocolUnknownError);
431#ifndef QT_NO_NETWORKPROXY
432 if (connection->d_func()->networkProxy.type() == QNetworkProxy::NoProxy
433 && connection->cacheProxy().type() == QNetworkProxy::NoProxy
434 && connection->transparentProxy().type() == QNetworkProxy::NoProxy) {
436 if (
auto *s = qobject_cast<QAbstractSocket *>(socket)) {
437 s->connectToHost(connectHost, connectPort,
438 QIODevice::ReadWrite | QIODevice::Unbuffered,
439 networkLayerPreference);
441 s->setReadBufferSize(1 * 1024);
442#if QT_CONFIG(localserver)
443 }
else if (
auto *s = qobject_cast<QLocalSocket *>(socket)) {
444 s->connectToServer(connectHost);
447#ifndef QT_NO_NETWORKPROXY
449 auto *s = qobject_cast<QAbstractSocket *>(socket);
454 s->connectToHost(connectHost, connectPort, QIODevice::ReadWrite, networkLayerPreference);
455 s->setReadBufferSize(64 * 1024);
477 qWarning(
"QHttpNetworkConnectionChannel::allDone() called without reply. Please report at http://bugreports.qt.io/");
485 if (connection->connectionType() == QHttpNetworkConnection::ConnectionTypeHTTP2
486 && !ssl && !switchedToHttp2) {
487 if (Http2::is_protocol_upgraded(*reply)) {
489 protocolHandler->setReply(
nullptr);
496 QMetaObject::invokeMethod(
this, [oldHandler = std::move(protocolHandler)]()
mutable {
498 }, Qt::QueuedConnection);
500 connection->fillHttp2Queue();
501 protocolHandler.reset(
new QHttp2ProtocolHandler(
this));
503 QMetaObject::invokeMethod(h2c,
"_q_receiveReply", Qt::QueuedConnection);
504 QMetaObject::invokeMethod(connection,
"_q_startNextRequest", Qt::QueuedConnection);
508 connection->setConnectionType(QHttpNetworkConnection::ConnectionTypeHTTP);
509 connection->d_func()->activeChannelCount = connection->d_func()->channelCount;
514 bool emitFinished =
reply->d_func()->shouldEmitSignals();
515 bool connectionCloseEnabled =
reply->d_func()->isConnectionCloseEnabled();
524 if (reply && emitFinished)
525 QMetaObject::invokeMethod(reply,
"finished", Qt::QueuedConnection);
533 if (state != QHttpNetworkConnectionChannel::ClosingState)
534 state = QHttpNetworkConnectionChannel::IdleState;
542 request = QHttpNetworkRequest();
544 protocolHandler->setReply(
nullptr);
548 if (!alreadyPipelinedRequests.isEmpty()) {
549 if (resendCurrent || connectionCloseEnabled || QSocketAbstraction::socketState(socket) != QAbstractSocket::ConnectedState) {
557 request = messagePair.first;
558 reply = messagePair.second;
559 protocolHandler->setReply(messagePair.second);
560 state = QHttpNetworkConnectionChannel::ReadingState;
567 connection->d_func()->fillPipeline(socket);
573 }
else if (alreadyPipelinedRequests.isEmpty() && socket->bytesAvailable() > 0) {
577 QMetaObject::invokeMethod(connection,
"_q_startNextRequest", Qt::QueuedConnection);
578 }
else if (alreadyPipelinedRequests.isEmpty()) {
579 if (connectionCloseEnabled)
580 if (QSocketAbstraction::socketState(socket) != QAbstractSocket::UnconnectedState)
582 if (qobject_cast<QHttpNetworkConnection*>(connection))
583 QMetaObject::invokeMethod(connection,
"_q_startNextRequest", Qt::QueuedConnection);
633 int statusCode =
reply->statusCode();
636 switch (statusCode) {
644 QUrl redirectUrl = connection->d_func()->parseRedirectResponse(socket, reply);
645 if (redirectUrl.isValid())
646 reply->setRedirectUrl(redirectUrl);
653 }
else if (qobject_cast<QHttpNetworkConnection *>(connection)) {
654 QMetaObject::invokeMethod(connection,
"_q_startNextRequest", Qt::QueuedConnection);
660 if (connection->d_func()->handleAuthenticateChallenge(socket, reply, (statusCode == 407), resend)) {
665 reply->d_func()->eraseData();
667 if (alreadyPipelinedRequests.isEmpty()) {
670 QMetaObject::invokeMethod(connection,
"_q_startNextRequest", Qt::QueuedConnection);
674 QMetaObject::invokeMethod(connection,
"_q_startNextRequest", Qt::QueuedConnection);
681 emit reply->headerChanged();
682 emit reply->readyRead();
683 QNetworkReply::NetworkError errorCode = (statusCode == 407)
684 ? QNetworkReply::ProxyAuthenticationRequiredError
685 : QNetworkReply::AuthenticationRequiredError;
686 reply->d_func()->errorString = connection->d_func()->errorDetail(errorCode, socket);
687 emit reply->finishedWithError(errorCode, reply->d_func()->errorString);
691 if (qobject_cast<QHttpNetworkConnection*>(connection))
692 QMetaObject::invokeMethod(connection,
"_q_startNextRequest", Qt::QueuedConnection);
769 QHttpNetworkRequest &request = pair.first;
770 QHttpNetworkReply *reply = pair.second;
771 reply->d_func()->clear();
772 reply->d_func()->connection = connection;
773 reply->d_func()->connectionChannel =
this;
774 reply->d_func()->autoDecompress = request.d->autoDecompress;
775 reply->d_func()->pipeliningUsed =
true;
777#ifndef QT_NO_NETWORKPROXY
778 pipeline.append(QHttpNetworkRequestPrivate::header(request,
779 (connection->d_func()->networkProxy.type() != QNetworkProxy::NoProxy)));
781 pipeline.append(QHttpNetworkRequestPrivate::header(request,
false));
784 alreadyPipelinedRequests.append(pair);
910 if (state == QHttpNetworkConnectionChannel::ClosingState) {
911 state = QHttpNetworkConnectionChannel::IdleState;
913 QMetaObject::invokeMethod(connection,
"_q_startNextRequest", Qt::QueuedConnection);
918 if ((isSocketWaiting() || isSocketReading()) && socket->bytesAvailable()) {
920 state = QHttpNetworkConnectionChannel::ReadingState;
923 }
else if (
reply &&
reply->contentLength() == -1 && !
reply->d_func()->isChunked()) {
927 }
else if (state == QHttpNetworkConnectionChannel::IdleState && resendCurrent) {
929 QMetaObject::invokeMethod(connection,
"_q_startNextRequest", Qt::QueuedConnection);
931 state = QHttpNetworkConnectionChannel::IdleState;
932 if (alreadyPipelinedRequests.size()) {
940 if (clearPendingReconnect())
941 QMetaObject::invokeMethod(connection,
"_q_startNextRequest", Qt::QueuedConnection);
950 if (connection->d_func()->networkLayerState == QHttpNetworkConnectionPrivate::HostLookupPending || connection->d_func()->networkLayerState == QHttpNetworkConnectionPrivate::IPv4or6) {
951 if (connection->d_func()->delayedConnectionTimer.isActive())
952 connection->d_func()->delayedConnectionTimer.stop();
953 if (networkLayerPreference == QAbstractSocket::IPv4Protocol)
954 connection->d_func()->networkLayerState = QHttpNetworkConnectionPrivate::IPv4;
955 else if (networkLayerPreference == QAbstractSocket::IPv6Protocol)
956 connection->d_func()->networkLayerState = QHttpNetworkConnectionPrivate::IPv6;
958 if (absSocket->peerAddress().protocol() == QAbstractSocket::IPv4Protocol)
959 connection->d_func()->networkLayerState = QHttpNetworkConnectionPrivate::IPv4;
961 connection->d_func()->networkLayerState = QHttpNetworkConnectionPrivate::IPv6;
963 connection->d_func()->networkLayerDetected(networkLayerPreference);
964 if (connection->d_func()->activeChannelCount > 1 && !connection->d_func()->encrypt)
965 QMetaObject::invokeMethod(connection,
"_q_startNextRequest", Qt::QueuedConnection);
967 bool anyProtocol = networkLayerPreference == QAbstractSocket::AnyIPProtocol;
968 if (((connection->d_func()->networkLayerState == QHttpNetworkConnectionPrivate::IPv4)
969 && (networkLayerPreference != QAbstractSocket::IPv4Protocol && !anyProtocol))
970 || ((connection->d_func()->networkLayerState == QHttpNetworkConnectionPrivate::IPv6)
971 && (networkLayerPreference != QAbstractSocket::IPv6Protocol && !anyProtocol))) {
974 QMetaObject::invokeMethod(connection,
"_q_startNextRequest", Qt::QueuedConnection);
990 absSocket->setSocketOption(QAbstractSocket::KeepAliveOption, 1);
992 QTcpKeepAliveConfiguration keepAliveConfig = connection->tcpKeepAliveParameters();
994 auto getKeepAliveValue = [](
int configValue,
999 return static_cast<
int>(qEnvironmentVariableIntegerValue(envName).value_or(defaultValue));
1005 absSocket->setSocketOption(QAbstractSocket::KeepAliveIdleOption, kaIdleOption);
1006 absSocket->setSocketOption(QAbstractSocket::KeepAliveIntervalOption, kaIntervalOption);
1007 absSocket->setSocketOption(QAbstractSocket::KeepAliveCountOption, kaCountOption);
1015 if (!connection->sslContext()) {
1018 if (
auto socketSslContext = QSslSocketPrivate::sslContext(
static_cast<QSslSocket*>(absSocket)))
1019 connection->setSslContext(std::move(socketSslContext));
1022 }
else if (connection->connectionType() == QHttpNetworkConnection::ConnectionTypeHTTP2Direct) {
1023 state = QHttpNetworkConnectionChannel::IdleState;
1024 protocolHandler.reset(
new QHttp2ProtocolHandler(
this));
1025 if (h2RequestsToSend.size() > 0) {
1028 QMetaObject::invokeMethod(connection,
"_q_startNextRequest", Qt::QueuedConnection);
1031 state = QHttpNetworkConnectionChannel::IdleState;
1032 const bool tryProtocolUpgrade = connection->connectionType() == QHttpNetworkConnection::ConnectionTypeHTTP2;
1033 if (tryProtocolUpgrade) {
1035 protocolHandler.reset(
new QHttpProtocolHandler(
this));
1040 connection->d_func()->dequeueRequest(absSocket);
1043 if (tryProtocolUpgrade) {
1046 Http2::appendProtocolUpgradeHeaders(connection->http2Parameters(), &request);
1078 QNetworkReply::NetworkError errorCode = QNetworkReply::UnknownNetworkError;
1080 switch (socketError) {
1081 case QAbstractSocket::HostNotFoundError:
1082 errorCode = QNetworkReply::HostNotFoundError;
1084 case QAbstractSocket::ConnectionRefusedError:
1085 errorCode = QNetworkReply::ConnectionRefusedError;
1086#ifndef QT_NO_NETWORKPROXY
1087 if (connection->d_func()->networkProxy.type() != QNetworkProxy::NoProxy && !ssl)
1088 errorCode = QNetworkReply::ProxyConnectionRefusedError;
1091 case QAbstractSocket::RemoteHostClosedError:
1095 if (!reply && state == QHttpNetworkConnectionChannel::IdleState) {
1103 h2Handler->handleConnectionClosure();
1105 }
else if (state != QHttpNetworkConnectionChannel::IdleState && state != QHttpNetworkConnectionChannel::ReadingState) {
1115 errorCode = QNetworkReply::RemoteHostClosedError;
1117 }
else if (state == QHttpNetworkConnectionChannel::ReadingState) {
1121 if (!
reply->d_func()->expectContent()) {
1124 QMetaObject::invokeMethod(
this,
"_q_receiveReply", Qt::QueuedConnection);
1127 if (
reply->contentLength() == -1 && !
reply->d_func()->isChunked()) {
1131 QMetaObject::invokeMethod(
this,
"_q_receiveReply", Qt::QueuedConnection);
1136 if (socket->bytesAvailable()) {
1140 reply->setReadBufferSize(0);
1141 reply->setDownstreamLimited(
false);
1146 state = QHttpNetworkConnectionChannel::IdleState;
1147 QMetaObject::invokeMethod(connection,
"_q_startNextRequest", Qt::QueuedConnection);
1152 errorCode = QNetworkReply::RemoteHostClosedError;
1154 errorCode = QNetworkReply::RemoteHostClosedError;
1157 case QAbstractSocket::SocketTimeoutError:
1159 if (state == QHttpNetworkConnectionChannel::WritingState && (reconnectAttempts-- > 0)) {
1163 errorCode = QNetworkReply::TimeoutError;
1165 case QAbstractSocket::ProxyConnectionRefusedError:
1166 errorCode = QNetworkReply::ProxyConnectionRefusedError;
1168 case QAbstractSocket::ProxyAuthenticationRequiredError:
1169 errorCode = QNetworkReply::ProxyAuthenticationRequiredError;
1171 case QAbstractSocket::SslHandshakeFailedError:
1172 errorCode = QNetworkReply::SslHandshakeFailedError;
1174 case QAbstractSocket::ProxyConnectionClosedError:
1180 errorCode = QNetworkReply::ProxyConnectionClosedError;
1182 case QAbstractSocket::ProxyConnectionTimeoutError:
1188 errorCode = QNetworkReply::ProxyTimeoutError;
1192 errorCode = QNetworkReply::UnknownNetworkError;
1195 QPointer<QHttpNetworkConnection> that = connection;
1196 QString errorString = connection->d_func()->errorDetail(errorCode, socket, socket->errorString());
1200 if (!connection->d_func()->shouldEmitChannelError(socket))
1210 connection->d_func()->dequeueRequest(socket);
1213 reply->d_func()->errorString = errorString;
1214 reply->d_func()->httpErrorCode = errorCode;
1215 emit reply->finishedWithError(errorCode, errorString);
1217 if (protocolHandler)
1218 protocolHandler->setReply(
nullptr);
1220 }
while (!connection->d_func()->highPriorityQueue.isEmpty()
1221 || !connection->d_func()->lowPriorityQueue.isEmpty());
1223 if (connection->connectionType() == QHttpNetworkConnection::ConnectionTypeHTTP2
1224 || connection->connectionType() == QHttpNetworkConnection::ConnectionTypeHTTP2Direct) {
1225 const auto h2RequestsToSendCopy =
std::exchange(h2RequestsToSend, {});
1226 for (
const auto &httpMessagePair : h2RequestsToSendCopy) {
1228 QHttpNetworkReply *currentReply = httpMessagePair.second;
1229 currentReply->d_func()->errorString = errorString;
1230 currentReply->d_func()->httpErrorCode = errorCode;
1231 Q_ASSERT(currentReply);
1232 emit currentReply->finishedWithError(errorCode, errorString);
1237 QMetaObject::invokeMethod(that,
"_q_startNextRequest", Qt::QueuedConnection);
1242 state = QHttpNetworkConnectionChannel::IdleState;
1243 else if (QSocketAbstraction::socketState(socket) == QAbstractSocket::UnconnectedState)
1244 state = QHttpNetworkConnectionChannel::IdleState;
1246 state = QHttpNetworkConnectionChannel::ClosingState;
1299 QSslSocket *sslSocket = qobject_cast<QSslSocket *>(socket);
1300 Q_ASSERT(sslSocket);
1302 if (!protocolHandler && connection->connectionType() != QHttpNetworkConnection::ConnectionTypeHTTP2Direct) {
1306 switch (sslSocket->sslConfiguration().nextProtocolNegotiationStatus()) {
1307 case QSslConfiguration::NextProtocolNegotiationNegotiated: {
1308 QByteArray nextProtocol = sslSocket->sslConfiguration().nextNegotiatedProtocol();
1309 if (nextProtocol == QSslConfiguration::NextProtocolHttp1_1) {
1311 }
else if (nextProtocol == QSslConfiguration::ALPNProtocolHTTP2) {
1313 protocolHandler.reset(
new QHttp2ProtocolHandler(
this));
1314 connection->setConnectionType(QHttpNetworkConnection::ConnectionTypeHTTP2);
1317 emitFinishedWithError(QNetworkReply::SslHandshakeFailedError,
1318 "detected unknown Next Protocol Negotiation protocol");
1323 case QSslConfiguration::NextProtocolNegotiationUnsupported:
1324 case QSslConfiguration::NextProtocolNegotiationNone: {
1325 protocolHandler.reset(
new QHttpProtocolHandler(
this));
1327 QSslConfiguration newConfiguration = sslSocket->sslConfiguration();
1328 QList<QByteArray> protocols = newConfiguration.allowedNextProtocols();
1329 const int nProtocols = protocols.size();
1332 if (connection->connectionType() == QHttpNetworkConnection::ConnectionTypeHTTP2)
1333 protocols.removeAll(QSslConfiguration::ALPNProtocolHTTP2);
1335 if (nProtocols > protocols.size()) {
1336 newConfiguration.setAllowedNextProtocols(protocols);
1337 const int channelCount = connection->d_func()->channelCount;
1338 for (
int i = 0; i < channelCount; ++i)
1339 connection->d_func()->channels[i].setSslConfiguration(newConfiguration);
1342 connection->setConnectionType(QHttpNetworkConnection::ConnectionTypeHTTP);
1346 if (connection->d_func()->activeChannelCount < connection->d_func()->channelCount) {
1347 connection->d_func()->activeChannelCount = connection->d_func()->channelCount;
1354 emitFinishedWithError(QNetworkReply::SslHandshakeFailedError,
1355 "detected unknown Next Protocol Negotiation protocol");
1357 }
else if (connection->connectionType() == QHttpNetworkConnection::ConnectionTypeHTTP2
1358 || connection->connectionType() == QHttpNetworkConnection::ConnectionTypeHTTP2Direct) {
1361 protocolHandler.reset(
new QHttp2ProtocolHandler(
this));
1366 state = QHttpNetworkConnectionChannel::IdleState;
1369 if (connection->connectionType() == QHttpNetworkConnection::ConnectionTypeHTTP2 ||
1370 connection->connectionType() == QHttpNetworkConnection::ConnectionTypeHTTP2Direct) {
1371 if (!h2RequestsToSend.isEmpty()) {
1373 const auto &pair =
std::as_const(h2RequestsToSend).first();
1375 emit pair.second->encrypted();
1382 QMetaObject::invokeMethod(
this,
1383 &QHttpNetworkConnectionChannel::checkAndResumeCommunication,
1384 Qt::QueuedConnection);
1391 connection->d_func()->dequeueRequest(socket);
1393 reply->setHttp2WasUsed(
false);
1394 Q_ASSERT(
reply->d_func()->connectionChannel ==
this);
1395 emit reply->encrypted();
1400 QMetaObject::invokeMethod(connection,
"_q_startNextRequest", Qt::QueuedConnection);
1439 connection->d_func()->pauseConnection();
1440 if (pendingEncrypt && !reply)
1441 connection->d_func()->dequeueRequest(socket);
1442 if (connection->connectionType() == QHttpNetworkConnection::ConnectionTypeHTTP) {
1444 emit reply->sslErrors(errors);
1448 const auto h2RequestsToSendCopy = h2RequestsToSend;
1449 for (
const auto &httpMessagePair : h2RequestsToSendCopy) {
1451 QHttpNetworkReply *currentReply = httpMessagePair.second;
1452 Q_ASSERT(currentReply);
1453 emit currentReply->sslErrors(errors);
1457 connection->d_func()->resumeConnection();