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);
159 sslSocket->ignoreSslErrors();
161 if (!ignoreSslErrorsList.isEmpty())
162 sslSocket->ignoreSslErrors(ignoreSslErrorsList);
164 if (sslConfiguration && !sslConfiguration->isNull())
165 sslSocket->setSslConfiguration(*sslConfiguration);
168 if (connection->connectionType() != QHttpNetworkConnection::ConnectionTypeHTTP2)
169 protocolHandler.reset(
new QHttpProtocolHandler(
this));
174#ifndef QT_NO_NETWORKPROXY
175 if (
auto *s = qobject_cast<QAbstractSocket *>(socket);
176 s && proxy.type() != QNetworkProxy::NoProxy) {
303 QAbstractSocket::SocketState socketState = QSocketAbstraction::socketState(socket);
310 if (socketState == QAbstractSocket::ClosingState ||
311 (socketState != QAbstractSocket::UnconnectedState && !socket->isOpen())) {
318 if (socketState == QAbstractSocket::HostLookupState ||
319 socketState == QAbstractSocket::ConnectingState) {
325 if (socketState != QAbstractSocket::ConnectedState) {
327 state = QHttpNetworkConnectionChannel::ConnectingState;
334 authenticator.detach();
335 QAuthenticatorPrivate *priv = QAuthenticatorPrivate::getPrivate(authenticator);
336 priv->hasFailed =
false;
337 proxyAuthenticator.detach();
338 priv = QAuthenticatorPrivate::getPrivate(proxyAuthenticator);
339 priv->hasFailed =
false;
347 priv = QAuthenticatorPrivate::getPrivate(authenticator);
348 if (priv && priv->phase == QAuthenticatorPrivate::Done)
349 priv->phase = QAuthenticatorPrivate::Start;
350 priv = QAuthenticatorPrivate::getPrivate(proxyAuthenticator);
351 if (priv && priv->phase == QAuthenticatorPrivate::Done)
352 priv->phase = QAuthenticatorPrivate::Start;
354 QString connectHost = connection->d_func()->hostName;
355 quint16 connectPort = connection->d_func()->port;
357 QHttpNetworkReply *potentialReply = connection->d_func()->predictNextRequestsReply();
358 if (potentialReply) {
359 QMetaObject::invokeMethod(potentialReply,
"socketStartedConnecting", Qt::QueuedConnection);
360 }
else if (!h2RequestsToSend.isEmpty()) {
361 QMetaObject::invokeMethod(std::as_const(h2RequestsToSend).first().second,
"socketStartedConnecting", Qt::QueuedConnection);
364#ifndef QT_NO_NETWORKPROXY
366 if (connection->d_func()->networkProxy.type() != QNetworkProxy::NoProxy && !ssl) {
367 connectHost = connection->d_func()->networkProxy.hostName();
368 connectPort = connection->d_func()->networkProxy.port();
370 if (
auto *abSocket = qobject_cast<QAbstractSocket *>(socket);
371 abSocket && abSocket->proxy().type() == QNetworkProxy::HttpProxy) {
376 if (request.url().isEmpty()) {
377 if (connection->connectionType()
378 == QHttpNetworkConnection::ConnectionTypeHTTP2Direct
379 || (connection->connectionType() == QHttpNetworkConnection::ConnectionTypeHTTP2
380 && !h2RequestsToSend.isEmpty())) {
381 value =
std::as_const(h2RequestsToSend).first().first.headerField(
"user-agent");
383 value = connection->d_func()->predictNextRequest().headerField(
"user-agent");
386 value = request.headerField(
"user-agent");
388 if (!value.isEmpty()) {
390 auto h = proxy.headers();
391 h.replaceOrAppend(QHttpHeaders::WellKnownHeader::UserAgent, value);
392 proxy.setHeaders(std::move(h));
393 abSocket->setProxy(proxy);
399 QSslSocket *sslSocket = qobject_cast<QSslSocket*>(socket);
404 if (
auto ctx = connection->sslContext())
405 QSslSocketPrivate::checkSettingSslContext(sslSocket, std::move(ctx));
407 sslSocket->setPeerVerifyName(connection->d_func()->peerVerifyName);
408 sslSocket->connectToHostEncrypted(connectHost, connectPort, QIODevice::ReadWrite, networkLayerPreference);
410 sslSocket->ignoreSslErrors();
411 sslSocket->ignoreSslErrors(ignoreSslErrorsList);
416 sslSocket->setReadBufferSize(64*1024);
420 connection->d_func()->dequeueRequest(socket);
421 connection->d_func()->emitReplyError(socket, reply, QNetworkReply::ProtocolUnknownError);
425#ifndef QT_NO_NETWORKPROXY
426 if (connection->d_func()->networkProxy.type() == QNetworkProxy::NoProxy
427 && connection->cacheProxy().type() == QNetworkProxy::NoProxy
428 && connection->transparentProxy().type() == QNetworkProxy::NoProxy) {
430 if (
auto *s = qobject_cast<QAbstractSocket *>(socket)) {
431 s->connectToHost(connectHost, connectPort,
432 QIODevice::ReadWrite | QIODevice::Unbuffered,
433 networkLayerPreference);
435 s->setReadBufferSize(1 * 1024);
436#if QT_CONFIG(localserver)
437 }
else if (
auto *s = qobject_cast<QLocalSocket *>(socket)) {
438 s->connectToServer(connectHost);
441#ifndef QT_NO_NETWORKPROXY
443 auto *s = qobject_cast<QAbstractSocket *>(socket);
448 s->connectToHost(connectHost, connectPort, QIODevice::ReadWrite, networkLayerPreference);
449 s->setReadBufferSize(64 * 1024);
471 qWarning(
"QHttpNetworkConnectionChannel::allDone() called without reply. Please report at http://bugreports.qt.io/");
479 if (connection->connectionType() == QHttpNetworkConnection::ConnectionTypeHTTP2
480 && !ssl && !switchedToHttp2) {
481 if (Http2::is_protocol_upgraded(*reply)) {
483 protocolHandler->setReply(
nullptr);
490 QMetaObject::invokeMethod(
this, [oldHandler = std::move(protocolHandler)]()
mutable {
492 }, Qt::QueuedConnection);
494 connection->fillHttp2Queue();
495 protocolHandler.reset(
new QHttp2ProtocolHandler(
this));
496 QHttp2ProtocolHandler *h2c =
static_cast<QHttp2ProtocolHandler *>(protocolHandler.get());
497 QMetaObject::invokeMethod(h2c,
"_q_receiveReply", Qt::QueuedConnection);
498 QMetaObject::invokeMethod(connection,
"_q_startNextRequest", Qt::QueuedConnection);
502 connection->setConnectionType(QHttpNetworkConnection::ConnectionTypeHTTP);
503 connection->d_func()->activeChannelCount = connection->d_func()->channelCount;
508 bool emitFinished =
reply->d_func()->shouldEmitSignals();
509 bool connectionCloseEnabled =
reply->d_func()->isConnectionCloseEnabled();
518 if (reply && emitFinished)
519 QMetaObject::invokeMethod(reply,
"finished", Qt::QueuedConnection);
527 if (state != QHttpNetworkConnectionChannel::ClosingState)
528 state = QHttpNetworkConnectionChannel::IdleState;
536 request = QHttpNetworkRequest();
538 protocolHandler->setReply(
nullptr);
542 if (!alreadyPipelinedRequests.isEmpty()) {
543 if (resendCurrent || connectionCloseEnabled || QSocketAbstraction::socketState(socket) != QAbstractSocket::ConnectedState) {
551 request = messagePair.first;
552 reply = messagePair.second;
553 protocolHandler->setReply(messagePair.second);
554 state = QHttpNetworkConnectionChannel::ReadingState;
561 connection->d_func()->fillPipeline(socket);
567 }
else if (alreadyPipelinedRequests.isEmpty() && socket->bytesAvailable() > 0) {
571 QMetaObject::invokeMethod(connection,
"_q_startNextRequest", Qt::QueuedConnection);
572 }
else if (alreadyPipelinedRequests.isEmpty()) {
573 if (connectionCloseEnabled)
574 if (QSocketAbstraction::socketState(socket) != QAbstractSocket::UnconnectedState)
576 if (qobject_cast<QHttpNetworkConnection*>(connection))
577 QMetaObject::invokeMethod(connection,
"_q_startNextRequest", Qt::QueuedConnection);
627 int statusCode =
reply->statusCode();
630 switch (statusCode) {
638 QUrl redirectUrl = connection->d_func()->parseRedirectResponse(socket, reply);
639 if (redirectUrl.isValid())
640 reply->setRedirectUrl(redirectUrl);
647 }
else if (qobject_cast<QHttpNetworkConnection *>(connection)) {
648 QMetaObject::invokeMethod(connection,
"_q_startNextRequest", Qt::QueuedConnection);
654 if (connection->d_func()->handleAuthenticateChallenge(socket, reply, (statusCode == 407), resend)) {
659 reply->d_func()->eraseData();
661 if (alreadyPipelinedRequests.isEmpty()) {
664 QMetaObject::invokeMethod(connection,
"_q_startNextRequest", Qt::QueuedConnection);
668 QMetaObject::invokeMethod(connection,
"_q_startNextRequest", Qt::QueuedConnection);
675 emit reply->headerChanged();
676 emit reply->readyRead();
677 QNetworkReply::NetworkError errorCode = (statusCode == 407)
678 ? QNetworkReply::ProxyAuthenticationRequiredError
679 : QNetworkReply::AuthenticationRequiredError;
680 reply->d_func()->errorString = connection->d_func()->errorDetail(errorCode, socket);
681 emit reply->finishedWithError(errorCode, reply->d_func()->errorString);
685 if (qobject_cast<QHttpNetworkConnection*>(connection))
686 QMetaObject::invokeMethod(connection,
"_q_startNextRequest", Qt::QueuedConnection);
759 QHttpNetworkRequest &request = pair.first;
760 QHttpNetworkReply *reply = pair.second;
761 reply->d_func()->clear();
762 reply->d_func()->connection = connection;
763 reply->d_func()->connectionChannel =
this;
764 reply->d_func()->autoDecompress = request.d->autoDecompress;
765 reply->d_func()->pipeliningUsed =
true;
767#ifndef QT_NO_NETWORKPROXY
768 pipeline.append(QHttpNetworkRequestPrivate::header(request,
769 (connection->d_func()->networkProxy.type() != QNetworkProxy::NoProxy)));
771 pipeline.append(QHttpNetworkRequestPrivate::header(request,
false));
774 alreadyPipelinedRequests.append(pair);
850 if (state == QHttpNetworkConnectionChannel::ClosingState) {
851 state = QHttpNetworkConnectionChannel::IdleState;
852 QMetaObject::invokeMethod(connection,
"_q_startNextRequest", Qt::QueuedConnection);
857 if ((isSocketWaiting() || isSocketReading()) && socket->bytesAvailable()) {
859 state = QHttpNetworkConnectionChannel::ReadingState;
862 }
else if (
reply &&
reply->contentLength() == -1 && !
reply->d_func()->isChunked()) {
866 }
else if (state == QHttpNetworkConnectionChannel::IdleState && resendCurrent) {
868 QMetaObject::invokeMethod(connection,
"_q_startNextRequest", Qt::QueuedConnection);
870 state = QHttpNetworkConnectionChannel::IdleState;
871 if (alreadyPipelinedRequests.size()) {
884 if (connection->d_func()->networkLayerState == QHttpNetworkConnectionPrivate::HostLookupPending || connection->d_func()->networkLayerState == QHttpNetworkConnectionPrivate::IPv4or6) {
885 if (connection->d_func()->delayedConnectionTimer.isActive())
886 connection->d_func()->delayedConnectionTimer.stop();
887 if (networkLayerPreference == QAbstractSocket::IPv4Protocol)
888 connection->d_func()->networkLayerState = QHttpNetworkConnectionPrivate::IPv4;
889 else if (networkLayerPreference == QAbstractSocket::IPv6Protocol)
890 connection->d_func()->networkLayerState = QHttpNetworkConnectionPrivate::IPv6;
892 if (absSocket->peerAddress().protocol() == QAbstractSocket::IPv4Protocol)
893 connection->d_func()->networkLayerState = QHttpNetworkConnectionPrivate::IPv4;
895 connection->d_func()->networkLayerState = QHttpNetworkConnectionPrivate::IPv6;
897 connection->d_func()->networkLayerDetected(networkLayerPreference);
898 if (connection->d_func()->activeChannelCount > 1 && !connection->d_func()->encrypt)
899 QMetaObject::invokeMethod(connection,
"_q_startNextRequest", Qt::QueuedConnection);
901 bool anyProtocol = networkLayerPreference == QAbstractSocket::AnyIPProtocol;
902 if (((connection->d_func()->networkLayerState == QHttpNetworkConnectionPrivate::IPv4)
903 && (networkLayerPreference != QAbstractSocket::IPv4Protocol && !anyProtocol))
904 || ((connection->d_func()->networkLayerState == QHttpNetworkConnectionPrivate::IPv6)
905 && (networkLayerPreference != QAbstractSocket::IPv6Protocol && !anyProtocol))) {
908 QMetaObject::invokeMethod(connection,
"_q_startNextRequest", Qt::QueuedConnection);
924 absSocket->setSocketOption(QAbstractSocket::KeepAliveOption, 1);
926 QTcpKeepAliveConfiguration keepAliveConfig = connection->tcpKeepAliveParameters();
928 auto getKeepAliveValue = [](
int configValue,
933 return static_cast<
int>(qEnvironmentVariableIntegerValue(envName).value_or(defaultValue));
939 absSocket->setSocketOption(QAbstractSocket::KeepAliveIdleOption, kaIdleOption);
940 absSocket->setSocketOption(QAbstractSocket::KeepAliveIntervalOption, kaIntervalOption);
941 absSocket->setSocketOption(QAbstractSocket::KeepAliveCountOption, kaCountOption);
949 if (!connection->sslContext()) {
952 if (
auto socketSslContext = QSslSocketPrivate::sslContext(
static_cast<QSslSocket*>(absSocket)))
953 connection->setSslContext(std::move(socketSslContext));
956 }
else if (connection->connectionType() == QHttpNetworkConnection::ConnectionTypeHTTP2Direct) {
957 state = QHttpNetworkConnectionChannel::IdleState;
958 protocolHandler.reset(
new QHttp2ProtocolHandler(
this));
959 if (h2RequestsToSend.size() > 0) {
962 QMetaObject::invokeMethod(connection,
"_q_startNextRequest", Qt::QueuedConnection);
965 state = QHttpNetworkConnectionChannel::IdleState;
966 const bool tryProtocolUpgrade = connection->connectionType() == QHttpNetworkConnection::ConnectionTypeHTTP2;
967 if (tryProtocolUpgrade) {
969 protocolHandler.reset(
new QHttpProtocolHandler(
this));
974 connection->d_func()->dequeueRequest(absSocket);
977 if (tryProtocolUpgrade) {
980 Http2::appendProtocolUpgradeHeaders(connection->http2Parameters(), &request);
1012 QNetworkReply::NetworkError errorCode = QNetworkReply::UnknownNetworkError;
1014 switch (socketError) {
1015 case QAbstractSocket::HostNotFoundError:
1016 errorCode = QNetworkReply::HostNotFoundError;
1018 case QAbstractSocket::ConnectionRefusedError:
1019 errorCode = QNetworkReply::ConnectionRefusedError;
1020#ifndef QT_NO_NETWORKPROXY
1021 if (connection->d_func()->networkProxy.type() != QNetworkProxy::NoProxy && !ssl)
1022 errorCode = QNetworkReply::ProxyConnectionRefusedError;
1025 case QAbstractSocket::RemoteHostClosedError:
1029 if (!reply && state == QHttpNetworkConnectionChannel::IdleState) {
1036 if (protocolHandler) {
1037 if (connection->connectionType() == QHttpNetworkConnection::ConnectionTypeHTTP2Direct
1038 || (connection->connectionType() == QHttpNetworkConnection::ConnectionTypeHTTP2
1039 && switchedToHttp2)) {
1040 auto h2Handler =
static_cast<QHttp2ProtocolHandler *>(protocolHandler.get());
1041 h2Handler->handleConnectionClosure();
1045 }
else if (state != QHttpNetworkConnectionChannel::IdleState && state != QHttpNetworkConnectionChannel::ReadingState) {
1055 errorCode = QNetworkReply::RemoteHostClosedError;
1057 }
else if (state == QHttpNetworkConnectionChannel::ReadingState) {
1061 if (!
reply->d_func()->expectContent()) {
1064 QMetaObject::invokeMethod(
this,
"_q_receiveReply", Qt::QueuedConnection);
1067 if (
reply->contentLength() == -1 && !
reply->d_func()->isChunked()) {
1071 QMetaObject::invokeMethod(
this,
"_q_receiveReply", Qt::QueuedConnection);
1076 if (socket->bytesAvailable()) {
1080 reply->setReadBufferSize(0);
1081 reply->setDownstreamLimited(
false);
1086 state = QHttpNetworkConnectionChannel::IdleState;
1087 QMetaObject::invokeMethod(connection,
"_q_startNextRequest", Qt::QueuedConnection);
1092 errorCode = QNetworkReply::RemoteHostClosedError;
1094 errorCode = QNetworkReply::RemoteHostClosedError;
1097 case QAbstractSocket::SocketTimeoutError:
1099 if (state == QHttpNetworkConnectionChannel::WritingState && (reconnectAttempts-- > 0)) {
1103 errorCode = QNetworkReply::TimeoutError;
1105 case QAbstractSocket::ProxyConnectionRefusedError:
1106 errorCode = QNetworkReply::ProxyConnectionRefusedError;
1108 case QAbstractSocket::ProxyAuthenticationRequiredError:
1109 errorCode = QNetworkReply::ProxyAuthenticationRequiredError;
1111 case QAbstractSocket::SslHandshakeFailedError:
1112 errorCode = QNetworkReply::SslHandshakeFailedError;
1114 case QAbstractSocket::ProxyConnectionClosedError:
1120 errorCode = QNetworkReply::ProxyConnectionClosedError;
1122 case QAbstractSocket::ProxyConnectionTimeoutError:
1128 errorCode = QNetworkReply::ProxyTimeoutError;
1132 errorCode = QNetworkReply::UnknownNetworkError;
1135 QPointer<QHttpNetworkConnection> that = connection;
1136 QString errorString = connection->d_func()->errorDetail(errorCode, socket, socket->errorString());
1140 if (!connection->d_func()->shouldEmitChannelError(socket))
1150 connection->d_func()->dequeueRequest(socket);
1153 reply->d_func()->errorString = errorString;
1154 reply->d_func()->httpErrorCode = errorCode;
1155 emit reply->finishedWithError(errorCode, errorString);
1157 if (protocolHandler)
1158 protocolHandler->setReply(
nullptr);
1160 }
while (!connection->d_func()->highPriorityQueue.isEmpty()
1161 || !connection->d_func()->lowPriorityQueue.isEmpty());
1163 if (connection->connectionType() == QHttpNetworkConnection::ConnectionTypeHTTP2
1164 || connection->connectionType() == QHttpNetworkConnection::ConnectionTypeHTTP2Direct) {
1165 const auto h2RequestsToSendCopy =
std::exchange(h2RequestsToSend, {});
1166 for (
const auto &httpMessagePair : h2RequestsToSendCopy) {
1168 QHttpNetworkReply *currentReply = httpMessagePair.second;
1169 currentReply->d_func()->errorString = errorString;
1170 currentReply->d_func()->httpErrorCode = errorCode;
1171 Q_ASSERT(currentReply);
1172 emit currentReply->finishedWithError(errorCode, errorString);
1177 QMetaObject::invokeMethod(that,
"_q_startNextRequest", Qt::QueuedConnection);
1182 state = QHttpNetworkConnectionChannel::IdleState;
1183 else if (QSocketAbstraction::socketState(socket) == QAbstractSocket::UnconnectedState)
1184 state = QHttpNetworkConnectionChannel::IdleState;
1186 state = QHttpNetworkConnectionChannel::ClosingState;
1233 QSslSocket *sslSocket = qobject_cast<QSslSocket *>(socket);
1234 Q_ASSERT(sslSocket);
1236 if (!protocolHandler && connection->connectionType() != QHttpNetworkConnection::ConnectionTypeHTTP2Direct) {
1240 switch (sslSocket->sslConfiguration().nextProtocolNegotiationStatus()) {
1241 case QSslConfiguration::NextProtocolNegotiationNegotiated: {
1242 QByteArray nextProtocol = sslSocket->sslConfiguration().nextNegotiatedProtocol();
1243 if (nextProtocol == QSslConfiguration::NextProtocolHttp1_1) {
1245 }
else if (nextProtocol == QSslConfiguration::ALPNProtocolHTTP2) {
1247 protocolHandler.reset(
new QHttp2ProtocolHandler(
this));
1248 connection->setConnectionType(QHttpNetworkConnection::ConnectionTypeHTTP2);
1251 emitFinishedWithError(QNetworkReply::SslHandshakeFailedError,
1252 "detected unknown Next Protocol Negotiation protocol");
1257 case QSslConfiguration::NextProtocolNegotiationUnsupported:
1258 case QSslConfiguration::NextProtocolNegotiationNone: {
1259 protocolHandler.reset(
new QHttpProtocolHandler(
this));
1261 QSslConfiguration newConfiguration = sslSocket->sslConfiguration();
1262 QList<QByteArray> protocols = newConfiguration.allowedNextProtocols();
1263 const int nProtocols = protocols.size();
1266 if (connection->connectionType() == QHttpNetworkConnection::ConnectionTypeHTTP2)
1267 protocols.removeAll(QSslConfiguration::ALPNProtocolHTTP2);
1269 if (nProtocols > protocols.size()) {
1270 newConfiguration.setAllowedNextProtocols(protocols);
1271 const int channelCount = connection->d_func()->channelCount;
1272 for (
int i = 0; i < channelCount; ++i)
1273 connection->d_func()->channels[i].setSslConfiguration(newConfiguration);
1276 connection->setConnectionType(QHttpNetworkConnection::ConnectionTypeHTTP);
1280 if (connection->d_func()->activeChannelCount < connection->d_func()->channelCount) {
1281 connection->d_func()->activeChannelCount = connection->d_func()->channelCount;
1288 emitFinishedWithError(QNetworkReply::SslHandshakeFailedError,
1289 "detected unknown Next Protocol Negotiation protocol");
1291 }
else if (connection->connectionType() == QHttpNetworkConnection::ConnectionTypeHTTP2
1292 || connection->connectionType() == QHttpNetworkConnection::ConnectionTypeHTTP2Direct) {
1295 protocolHandler.reset(
new QHttp2ProtocolHandler(
this));
1300 state = QHttpNetworkConnectionChannel::IdleState;
1303 if (connection->connectionType() == QHttpNetworkConnection::ConnectionTypeHTTP2 ||
1304 connection->connectionType() == QHttpNetworkConnection::ConnectionTypeHTTP2Direct) {
1305 if (!h2RequestsToSend.isEmpty()) {
1307 const auto &pair =
std::as_const(h2RequestsToSend).first();
1309 emit pair.second->encrypted();
1316 QMetaObject::invokeMethod(
this,
1317 &QHttpNetworkConnectionChannel::checkAndResumeCommunication,
1318 Qt::QueuedConnection);
1325 connection->d_func()->dequeueRequest(socket);
1327 reply->setHttp2WasUsed(
false);
1328 Q_ASSERT(
reply->d_func()->connectionChannel ==
this);
1329 emit reply->encrypted();
1334 QMetaObject::invokeMethod(connection,
"_q_startNextRequest", Qt::QueuedConnection);
1373 connection->d_func()->pauseConnection();
1374 if (pendingEncrypt && !reply)
1375 connection->d_func()->dequeueRequest(socket);
1376 if (connection->connectionType() == QHttpNetworkConnection::ConnectionTypeHTTP) {
1378 emit reply->sslErrors(errors);
1382 const auto h2RequestsToSendCopy = h2RequestsToSend;
1383 for (
const auto &httpMessagePair : h2RequestsToSendCopy) {
1385 QHttpNetworkReply *currentReply = httpMessagePair.second;
1386 Q_ASSERT(currentReply);
1387 emit currentReply->sslErrors(errors);
1391 connection->d_func()->resumeConnection();