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) {
305 QAbstractSocket::SocketState socketState = QSocketAbstraction::socketState(socket);
312 if (socketState == QAbstractSocket::ClosingState ||
313 (socketState != QAbstractSocket::UnconnectedState && !socket->isOpen())) {
320 if (socketState == QAbstractSocket::HostLookupState ||
321 socketState == QAbstractSocket::ConnectingState) {
327 if (socketState != QAbstractSocket::ConnectedState) {
329 state = QHttpNetworkConnectionChannel::ConnectingState;
336 authenticator.detach();
337 QAuthenticatorPrivate *priv = QAuthenticatorPrivate::getPrivate(authenticator);
338 priv->hasFailed =
false;
339 proxyAuthenticator.detach();
340 priv = QAuthenticatorPrivate::getPrivate(proxyAuthenticator);
341 priv->hasFailed =
false;
349 priv = QAuthenticatorPrivate::getPrivate(authenticator);
350 if (priv && priv->phase == QAuthenticatorPrivate::Done)
351 priv->phase = QAuthenticatorPrivate::Start;
352 priv = QAuthenticatorPrivate::getPrivate(proxyAuthenticator);
353 if (priv && priv->phase == QAuthenticatorPrivate::Done)
354 priv->phase = QAuthenticatorPrivate::Start;
356 QString connectHost = connection->d_func()->hostName;
357 quint16 connectPort = connection->d_func()->port;
359 QHttpNetworkReply *potentialReply = connection->d_func()->predictNextRequestsReply();
360 if (potentialReply) {
361 QMetaObject::invokeMethod(potentialReply,
"socketStartedConnecting", Qt::QueuedConnection);
362 }
else if (!h2RequestsToSend.isEmpty()) {
363 QMetaObject::invokeMethod(std::as_const(h2RequestsToSend).first().second,
"socketStartedConnecting", Qt::QueuedConnection);
366#ifndef QT_NO_NETWORKPROXY
368 if (connection->d_func()->networkProxy.type() != QNetworkProxy::NoProxy && !ssl) {
369 connectHost = connection->d_func()->networkProxy.hostName();
370 connectPort = connection->d_func()->networkProxy.port();
372 if (
auto *abSocket = qobject_cast<QAbstractSocket *>(socket);
373 abSocket && abSocket->proxy().type() == QNetworkProxy::HttpProxy) {
378 if (request.url().isEmpty()) {
379 if (connection->connectionType()
380 == QHttpNetworkConnection::ConnectionTypeHTTP2Direct
381 || (connection->connectionType() == QHttpNetworkConnection::ConnectionTypeHTTP2
382 && !h2RequestsToSend.isEmpty())) {
383 value =
std::as_const(h2RequestsToSend).first().first.headerField(
"user-agent");
385 value = connection->d_func()->predictNextRequest().headerField(
"user-agent");
388 value = request.headerField(
"user-agent");
390 if (!value.isEmpty()) {
392 auto h = proxy.headers();
393 h.replaceOrAppend(QHttpHeaders::WellKnownHeader::UserAgent, value);
394 proxy.setHeaders(std::move(h));
395 abSocket->setProxy(proxy);
401 QSslSocket *sslSocket = qobject_cast<QSslSocket*>(socket);
406 if (
auto ctx = connection->sslContext())
407 QSslSocketPrivate::checkSettingSslContext(sslSocket, std::move(ctx));
409 sslSocket->setPeerVerifyName(connection->d_func()->peerVerifyName);
410 sslSocket->connectToHostEncrypted(connectHost, connectPort, QIODevice::ReadWrite, networkLayerPreference);
413 sslSocket->ignoreSslErrors();
414 sslSocket->ignoreSslErrors(ignoreSslErrorsList);
420 sslSocket->setReadBufferSize(64*1024);
424 connection->d_func()->dequeueRequest(socket);
425 connection->d_func()->emitReplyError(socket, reply, QNetworkReply::ProtocolUnknownError);
429#ifndef QT_NO_NETWORKPROXY
430 if (connection->d_func()->networkProxy.type() == QNetworkProxy::NoProxy
431 && connection->cacheProxy().type() == QNetworkProxy::NoProxy
432 && connection->transparentProxy().type() == QNetworkProxy::NoProxy) {
434 if (
auto *s = qobject_cast<QAbstractSocket *>(socket)) {
435 s->connectToHost(connectHost, connectPort,
436 QIODevice::ReadWrite | QIODevice::Unbuffered,
437 networkLayerPreference);
439 s->setReadBufferSize(1 * 1024);
440#if QT_CONFIG(localserver)
441 }
else if (
auto *s = qobject_cast<QLocalSocket *>(socket)) {
442 s->connectToServer(connectHost);
445#ifndef QT_NO_NETWORKPROXY
447 auto *s = qobject_cast<QAbstractSocket *>(socket);
452 s->connectToHost(connectHost, connectPort, QIODevice::ReadWrite, networkLayerPreference);
453 s->setReadBufferSize(64 * 1024);
475 qWarning(
"QHttpNetworkConnectionChannel::allDone() called without reply. Please report at http://bugreports.qt.io/");
483 if (connection->connectionType() == QHttpNetworkConnection::ConnectionTypeHTTP2
484 && !ssl && !switchedToHttp2) {
485 if (Http2::is_protocol_upgraded(*reply)) {
487 protocolHandler->setReply(
nullptr);
494 QMetaObject::invokeMethod(
this, [oldHandler = std::move(protocolHandler)]()
mutable {
496 }, Qt::QueuedConnection);
498 connection->fillHttp2Queue();
499 protocolHandler.reset(
new QHttp2ProtocolHandler(
this));
501 QMetaObject::invokeMethod(h2c,
"_q_receiveReply", Qt::QueuedConnection);
502 QMetaObject::invokeMethod(connection,
"_q_startNextRequest", Qt::QueuedConnection);
506 connection->setConnectionType(QHttpNetworkConnection::ConnectionTypeHTTP);
507 connection->d_func()->activeChannelCount = connection->d_func()->channelCount;
512 bool emitFinished =
reply->d_func()->shouldEmitSignals();
513 bool connectionCloseEnabled =
reply->d_func()->isConnectionCloseEnabled();
522 if (reply && emitFinished)
523 QMetaObject::invokeMethod(reply,
"finished", Qt::QueuedConnection);
531 if (state != QHttpNetworkConnectionChannel::ClosingState)
532 state = QHttpNetworkConnectionChannel::IdleState;
540 request = QHttpNetworkRequest();
542 protocolHandler->setReply(
nullptr);
546 if (!alreadyPipelinedRequests.isEmpty()) {
547 if (resendCurrent || connectionCloseEnabled || QSocketAbstraction::socketState(socket) != QAbstractSocket::ConnectedState) {
555 request = messagePair.first;
556 reply = messagePair.second;
557 protocolHandler->setReply(messagePair.second);
558 state = QHttpNetworkConnectionChannel::ReadingState;
565 connection->d_func()->fillPipeline(socket);
571 }
else if (alreadyPipelinedRequests.isEmpty() && socket->bytesAvailable() > 0) {
575 QMetaObject::invokeMethod(connection,
"_q_startNextRequest", Qt::QueuedConnection);
576 }
else if (alreadyPipelinedRequests.isEmpty()) {
577 if (connectionCloseEnabled)
578 if (QSocketAbstraction::socketState(socket) != QAbstractSocket::UnconnectedState)
580 if (qobject_cast<QHttpNetworkConnection*>(connection))
581 QMetaObject::invokeMethod(connection,
"_q_startNextRequest", Qt::QueuedConnection);
631 int statusCode =
reply->statusCode();
634 switch (statusCode) {
642 QUrl redirectUrl = connection->d_func()->parseRedirectResponse(socket, reply);
643 if (redirectUrl.isValid())
644 reply->setRedirectUrl(redirectUrl);
651 }
else if (qobject_cast<QHttpNetworkConnection *>(connection)) {
652 QMetaObject::invokeMethod(connection,
"_q_startNextRequest", Qt::QueuedConnection);
658 if (connection->d_func()->handleAuthenticateChallenge(socket, reply, (statusCode == 407), resend)) {
663 reply->d_func()->eraseData();
665 if (alreadyPipelinedRequests.isEmpty()) {
668 QMetaObject::invokeMethod(connection,
"_q_startNextRequest", Qt::QueuedConnection);
672 QMetaObject::invokeMethod(connection,
"_q_startNextRequest", Qt::QueuedConnection);
679 emit reply->headerChanged();
680 emit reply->readyRead();
681 QNetworkReply::NetworkError errorCode = (statusCode == 407)
682 ? QNetworkReply::ProxyAuthenticationRequiredError
683 : QNetworkReply::AuthenticationRequiredError;
684 reply->d_func()->errorString = connection->d_func()->errorDetail(errorCode, socket);
685 emit reply->finishedWithError(errorCode, reply->d_func()->errorString);
689 if (qobject_cast<QHttpNetworkConnection*>(connection))
690 QMetaObject::invokeMethod(connection,
"_q_startNextRequest", Qt::QueuedConnection);
767 QHttpNetworkRequest &request = pair.first;
768 QHttpNetworkReply *reply = pair.second;
769 reply->d_func()->clear();
770 reply->d_func()->connection = connection;
771 reply->d_func()->connectionChannel =
this;
772 reply->d_func()->autoDecompress = request.d->autoDecompress;
773 reply->d_func()->pipeliningUsed =
true;
775#ifndef QT_NO_NETWORKPROXY
776 pipeline.append(QHttpNetworkRequestPrivate::header(request,
777 (connection->d_func()->networkProxy.type() != QNetworkProxy::NoProxy)));
779 pipeline.append(QHttpNetworkRequestPrivate::header(request,
false));
782 alreadyPipelinedRequests.append(pair);
870 if (state == QHttpNetworkConnectionChannel::ClosingState) {
871 state = QHttpNetworkConnectionChannel::IdleState;
872 QMetaObject::invokeMethod(connection,
"_q_startNextRequest", Qt::QueuedConnection);
877 if ((isSocketWaiting() || isSocketReading()) && socket->bytesAvailable()) {
879 state = QHttpNetworkConnectionChannel::ReadingState;
882 }
else if (
reply &&
reply->contentLength() == -1 && !
reply->d_func()->isChunked()) {
886 }
else if (state == QHttpNetworkConnectionChannel::IdleState && resendCurrent) {
888 QMetaObject::invokeMethod(connection,
"_q_startNextRequest", Qt::QueuedConnection);
890 state = QHttpNetworkConnectionChannel::IdleState;
891 if (alreadyPipelinedRequests.size()) {
904 if (connection->d_func()->networkLayerState == QHttpNetworkConnectionPrivate::HostLookupPending || connection->d_func()->networkLayerState == QHttpNetworkConnectionPrivate::IPv4or6) {
905 if (connection->d_func()->delayedConnectionTimer.isActive())
906 connection->d_func()->delayedConnectionTimer.stop();
907 if (networkLayerPreference == QAbstractSocket::IPv4Protocol)
908 connection->d_func()->networkLayerState = QHttpNetworkConnectionPrivate::IPv4;
909 else if (networkLayerPreference == QAbstractSocket::IPv6Protocol)
910 connection->d_func()->networkLayerState = QHttpNetworkConnectionPrivate::IPv6;
912 if (absSocket->peerAddress().protocol() == QAbstractSocket::IPv4Protocol)
913 connection->d_func()->networkLayerState = QHttpNetworkConnectionPrivate::IPv4;
915 connection->d_func()->networkLayerState = QHttpNetworkConnectionPrivate::IPv6;
917 connection->d_func()->networkLayerDetected(networkLayerPreference);
918 if (connection->d_func()->activeChannelCount > 1 && !connection->d_func()->encrypt)
919 QMetaObject::invokeMethod(connection,
"_q_startNextRequest", Qt::QueuedConnection);
921 bool anyProtocol = networkLayerPreference == QAbstractSocket::AnyIPProtocol;
922 if (((connection->d_func()->networkLayerState == QHttpNetworkConnectionPrivate::IPv4)
923 && (networkLayerPreference != QAbstractSocket::IPv4Protocol && !anyProtocol))
924 || ((connection->d_func()->networkLayerState == QHttpNetworkConnectionPrivate::IPv6)
925 && (networkLayerPreference != QAbstractSocket::IPv6Protocol && !anyProtocol))) {
928 QMetaObject::invokeMethod(connection,
"_q_startNextRequest", Qt::QueuedConnection);
944 absSocket->setSocketOption(QAbstractSocket::KeepAliveOption, 1);
946 QTcpKeepAliveConfiguration keepAliveConfig = connection->tcpKeepAliveParameters();
948 auto getKeepAliveValue = [](
int configValue,
953 return static_cast<
int>(qEnvironmentVariableIntegerValue(envName).value_or(defaultValue));
959 absSocket->setSocketOption(QAbstractSocket::KeepAliveIdleOption, kaIdleOption);
960 absSocket->setSocketOption(QAbstractSocket::KeepAliveIntervalOption, kaIntervalOption);
961 absSocket->setSocketOption(QAbstractSocket::KeepAliveCountOption, kaCountOption);
969 if (!connection->sslContext()) {
972 if (
auto socketSslContext = QSslSocketPrivate::sslContext(
static_cast<QSslSocket*>(absSocket)))
973 connection->setSslContext(std::move(socketSslContext));
976 }
else if (connection->connectionType() == QHttpNetworkConnection::ConnectionTypeHTTP2Direct) {
977 state = QHttpNetworkConnectionChannel::IdleState;
978 protocolHandler.reset(
new QHttp2ProtocolHandler(
this));
979 if (h2RequestsToSend.size() > 0) {
982 QMetaObject::invokeMethod(connection,
"_q_startNextRequest", Qt::QueuedConnection);
985 state = QHttpNetworkConnectionChannel::IdleState;
986 const bool tryProtocolUpgrade = connection->connectionType() == QHttpNetworkConnection::ConnectionTypeHTTP2;
987 if (tryProtocolUpgrade) {
989 protocolHandler.reset(
new QHttpProtocolHandler(
this));
994 connection->d_func()->dequeueRequest(absSocket);
997 if (tryProtocolUpgrade) {
1000 Http2::appendProtocolUpgradeHeaders(connection->http2Parameters(), &request);
1032 QNetworkReply::NetworkError errorCode = QNetworkReply::UnknownNetworkError;
1034 switch (socketError) {
1035 case QAbstractSocket::HostNotFoundError:
1036 errorCode = QNetworkReply::HostNotFoundError;
1038 case QAbstractSocket::ConnectionRefusedError:
1039 errorCode = QNetworkReply::ConnectionRefusedError;
1040#ifndef QT_NO_NETWORKPROXY
1041 if (connection->d_func()->networkProxy.type() != QNetworkProxy::NoProxy && !ssl)
1042 errorCode = QNetworkReply::ProxyConnectionRefusedError;
1045 case QAbstractSocket::RemoteHostClosedError:
1049 if (!reply && state == QHttpNetworkConnectionChannel::IdleState) {
1057 h2Handler->handleConnectionClosure();
1059 }
else if (state != QHttpNetworkConnectionChannel::IdleState && state != QHttpNetworkConnectionChannel::ReadingState) {
1069 errorCode = QNetworkReply::RemoteHostClosedError;
1071 }
else if (state == QHttpNetworkConnectionChannel::ReadingState) {
1075 if (!
reply->d_func()->expectContent()) {
1078 QMetaObject::invokeMethod(
this,
"_q_receiveReply", Qt::QueuedConnection);
1081 if (
reply->contentLength() == -1 && !
reply->d_func()->isChunked()) {
1085 QMetaObject::invokeMethod(
this,
"_q_receiveReply", Qt::QueuedConnection);
1090 if (socket->bytesAvailable()) {
1094 reply->setReadBufferSize(0);
1095 reply->setDownstreamLimited(
false);
1100 state = QHttpNetworkConnectionChannel::IdleState;
1101 QMetaObject::invokeMethod(connection,
"_q_startNextRequest", Qt::QueuedConnection);
1106 errorCode = QNetworkReply::RemoteHostClosedError;
1108 errorCode = QNetworkReply::RemoteHostClosedError;
1111 case QAbstractSocket::SocketTimeoutError:
1113 if (state == QHttpNetworkConnectionChannel::WritingState && (reconnectAttempts-- > 0)) {
1117 errorCode = QNetworkReply::TimeoutError;
1119 case QAbstractSocket::ProxyConnectionRefusedError:
1120 errorCode = QNetworkReply::ProxyConnectionRefusedError;
1122 case QAbstractSocket::ProxyAuthenticationRequiredError:
1123 errorCode = QNetworkReply::ProxyAuthenticationRequiredError;
1125 case QAbstractSocket::SslHandshakeFailedError:
1126 errorCode = QNetworkReply::SslHandshakeFailedError;
1128 case QAbstractSocket::ProxyConnectionClosedError:
1134 errorCode = QNetworkReply::ProxyConnectionClosedError;
1136 case QAbstractSocket::ProxyConnectionTimeoutError:
1142 errorCode = QNetworkReply::ProxyTimeoutError;
1146 errorCode = QNetworkReply::UnknownNetworkError;
1149 QPointer<QHttpNetworkConnection> that = connection;
1150 QString errorString = connection->d_func()->errorDetail(errorCode, socket, socket->errorString());
1154 if (!connection->d_func()->shouldEmitChannelError(socket))
1164 connection->d_func()->dequeueRequest(socket);
1167 reply->d_func()->errorString = errorString;
1168 reply->d_func()->httpErrorCode = errorCode;
1169 emit reply->finishedWithError(errorCode, errorString);
1171 if (protocolHandler)
1172 protocolHandler->setReply(
nullptr);
1174 }
while (!connection->d_func()->highPriorityQueue.isEmpty()
1175 || !connection->d_func()->lowPriorityQueue.isEmpty());
1177 if (connection->connectionType() == QHttpNetworkConnection::ConnectionTypeHTTP2
1178 || connection->connectionType() == QHttpNetworkConnection::ConnectionTypeHTTP2Direct) {
1179 const auto h2RequestsToSendCopy =
std::exchange(h2RequestsToSend, {});
1180 for (
const auto &httpMessagePair : h2RequestsToSendCopy) {
1182 QHttpNetworkReply *currentReply = httpMessagePair.second;
1183 currentReply->d_func()->errorString = errorString;
1184 currentReply->d_func()->httpErrorCode = errorCode;
1185 Q_ASSERT(currentReply);
1186 emit currentReply->finishedWithError(errorCode, errorString);
1191 QMetaObject::invokeMethod(that,
"_q_startNextRequest", Qt::QueuedConnection);
1196 state = QHttpNetworkConnectionChannel::IdleState;
1197 else if (QSocketAbstraction::socketState(socket) == QAbstractSocket::UnconnectedState)
1198 state = QHttpNetworkConnectionChannel::IdleState;
1200 state = QHttpNetworkConnectionChannel::ClosingState;
1247 QSslSocket *sslSocket = qobject_cast<QSslSocket *>(socket);
1248 Q_ASSERT(sslSocket);
1250 if (!protocolHandler && connection->connectionType() != QHttpNetworkConnection::ConnectionTypeHTTP2Direct) {
1254 switch (sslSocket->sslConfiguration().nextProtocolNegotiationStatus()) {
1255 case QSslConfiguration::NextProtocolNegotiationNegotiated: {
1256 QByteArray nextProtocol = sslSocket->sslConfiguration().nextNegotiatedProtocol();
1257 if (nextProtocol == QSslConfiguration::NextProtocolHttp1_1) {
1259 }
else if (nextProtocol == QSslConfiguration::ALPNProtocolHTTP2) {
1261 protocolHandler.reset(
new QHttp2ProtocolHandler(
this));
1262 connection->setConnectionType(QHttpNetworkConnection::ConnectionTypeHTTP2);
1265 emitFinishedWithError(QNetworkReply::SslHandshakeFailedError,
1266 "detected unknown Next Protocol Negotiation protocol");
1271 case QSslConfiguration::NextProtocolNegotiationUnsupported:
1272 case QSslConfiguration::NextProtocolNegotiationNone: {
1273 protocolHandler.reset(
new QHttpProtocolHandler(
this));
1275 QSslConfiguration newConfiguration = sslSocket->sslConfiguration();
1276 QList<QByteArray> protocols = newConfiguration.allowedNextProtocols();
1277 const int nProtocols = protocols.size();
1280 if (connection->connectionType() == QHttpNetworkConnection::ConnectionTypeHTTP2)
1281 protocols.removeAll(QSslConfiguration::ALPNProtocolHTTP2);
1283 if (nProtocols > protocols.size()) {
1284 newConfiguration.setAllowedNextProtocols(protocols);
1285 const int channelCount = connection->d_func()->channelCount;
1286 for (
int i = 0; i < channelCount; ++i)
1287 connection->d_func()->channels[i].setSslConfiguration(newConfiguration);
1290 connection->setConnectionType(QHttpNetworkConnection::ConnectionTypeHTTP);
1294 if (connection->d_func()->activeChannelCount < connection->d_func()->channelCount) {
1295 connection->d_func()->activeChannelCount = connection->d_func()->channelCount;
1302 emitFinishedWithError(QNetworkReply::SslHandshakeFailedError,
1303 "detected unknown Next Protocol Negotiation protocol");
1305 }
else if (connection->connectionType() == QHttpNetworkConnection::ConnectionTypeHTTP2
1306 || connection->connectionType() == QHttpNetworkConnection::ConnectionTypeHTTP2Direct) {
1309 protocolHandler.reset(
new QHttp2ProtocolHandler(
this));
1314 state = QHttpNetworkConnectionChannel::IdleState;
1317 if (connection->connectionType() == QHttpNetworkConnection::ConnectionTypeHTTP2 ||
1318 connection->connectionType() == QHttpNetworkConnection::ConnectionTypeHTTP2Direct) {
1319 if (!h2RequestsToSend.isEmpty()) {
1321 const auto &pair =
std::as_const(h2RequestsToSend).first();
1323 emit pair.second->encrypted();
1330 QMetaObject::invokeMethod(
this,
1331 &QHttpNetworkConnectionChannel::checkAndResumeCommunication,
1332 Qt::QueuedConnection);
1339 connection->d_func()->dequeueRequest(socket);
1341 reply->setHttp2WasUsed(
false);
1342 Q_ASSERT(
reply->d_func()->connectionChannel ==
this);
1343 emit reply->encrypted();
1348 QMetaObject::invokeMethod(connection,
"_q_startNextRequest", Qt::QueuedConnection);
1387 connection->d_func()->pauseConnection();
1388 if (pendingEncrypt && !reply)
1389 connection->d_func()->dequeueRequest(socket);
1390 if (connection->connectionType() == QHttpNetworkConnection::ConnectionTypeHTTP) {
1392 emit reply->sslErrors(errors);
1396 const auto h2RequestsToSendCopy = h2RequestsToSend;
1397 for (
const auto &httpMessagePair : h2RequestsToSendCopy) {
1399 QHttpNetworkReply *currentReply = httpMessagePair.second;
1400 Q_ASSERT(currentReply);
1401 emit currentReply->sslErrors(errors);
1405 connection->d_func()->resumeConnection();