qhttpnetworkconnectionchannel.cpp

Absolute File Name:/home/qt/qt5_coco/qt5/qtbase/src/network/access/qhttpnetworkconnectionchannel.cpp
Switch to Source codePreprocessed file
LineSourceCount
1-
2-
3-
4-
5-
6-
7-
8-
9-
10-
11-
12-
13-
14-
15-
16-
17-
18-
19static const int reconnectAttemptsDefault = 3;-
20-
21QHttpNetworkConnectionChannel::QHttpNetworkConnectionChannel()-
22 : socket(0)-
23 , ssl(false)-
24 , isInitialized(false)-
25 , state(IdleState)-
26 , reply(0)-
27 , written(0)-
28 , bytesTotal(0)-
29 , resendCurrent(false)-
30 , lastStatus(0)-
31 , pendingEncrypt(false)-
32 , reconnectAttempts(reconnectAttemptsDefault)-
33 , authMethod(QAuthenticatorPrivate::None)-
34 , proxyAuthMethod(QAuthenticatorPrivate::None)-
35 , authenticationCredentialsSent(false)-
36 , proxyCredentialsSent(false)-
37 , protocolHandler(0)-
38-
39 , ignoreAllSslErrors(false)-
40-
41 , pipeliningSupported(PipeliningSupportUnknown)-
42 , networkLayerPreference(QAbstractSocket::AnyIPProtocol)-
43 , connection(0)-
44{-
45-
46-
47}-
48-
49void QHttpNetworkConnectionChannel::init()-
50{-
51-
52 if (connection->d_func()->encrypt)-
53 socket = new QSslSocket;-
54 else-
55 socket = new QTcpSocket;-
56-
57-
58-
59-
60-
61 if (networkSession)-
62 socket->setProperty("_q_networksession", QVariant::fromValue(networkSession));-
63-
64-
65-
66 socket->setProxy(QNetworkProxy::NoProxy);-
67-
68-
69-
70-
71-
72 QObject::connect(socket, qFlagLocation("2""bytesWritten(qint64)" "\0" __FILE__ ":" "117""123"),-
73 this, qFlagLocation("1""_q_bytesWritten(qint64)" "\0" __FILE__ ":" "118""124"),-
74 Qt::DirectConnection);-
75 QObject::connect(socket, qFlagLocation("2""connected()" "\0" __FILE__ ":" "120""126"),-
76 this, qFlagLocation("1""_q_connected()" "\0" __FILE__ ":" "121""127"),-
77 Qt::DirectConnection);-
78 QObject::connect(socket, qFlagLocation("2""readyRead()" "\0" __FILE__ ":" "123""129"),-
79 this, qFlagLocation("1""_q_readyRead()" "\0" __FILE__ ":" "124""130"),-
80 Qt::DirectConnection);-
81-
82-
83-
84-
85-
86-
87-
88 qRegisterMetaType<QAbstractSocket::SocketError>();-
89 QObject::connect(socket, qFlagLocation("2""disconnected()" "\0" __FILE__ ":" "134""140"),-
90 this, qFlagLocation("1""_q_disconnected()" "\0" __FILE__ ":" "135""141"),-
91 Qt::DirectConnection);-
92 QObject::connect(socket, qFlagLocation("2""error(QAbstractSocket::SocketError)" "\0" __FILE__ ":" "137""143"),-
93 this, qFlagLocation("1""_q_error(QAbstractSocket::SocketError)" "\0" __FILE__ ":" "138""144"),-
94 Qt::DirectConnection);-
95-
96-
97-
98 QObject::connect(socket, qFlagLocation("2""proxyAuthenticationRequired(QNetworkProxy,QAuthenticator*)" "\0" __FILE__ ":" "143""149"),-
99 this, qFlagLocation("1""_q_proxyAuthenticationRequired(QNetworkProxy,QAuthenticator*)" "\0" __FILE__ ":" "144""150"),-
100 Qt::DirectConnection);-
101-
102-
103-
104 QSslSocket *sslSocket = qobject_cast<QSslSocket*>(socket);-
105 if (sslSocket) {-
106-
107 QObject::connect(sslSocket, qFlagLocation("2""encrypted()" "\0" __FILE__ ":" "152""158"),-
108 this, qFlagLocation("1""_q_encrypted()" "\0" __FILE__ ":" "153""159"),-
109 Qt::DirectConnection);-
110 QObject::connect(sslSocket, qFlagLocation("2""sslErrors(QList<QSslError>)" "\0" __FILE__ ":" "155""161"),-
111 this, qFlagLocation("1""_q_sslErrors(QList<QSslError>)" "\0" __FILE__ ":" "156""162"),-
112 Qt::DirectConnection);-
113 QObject::connect(sslSocket, qFlagLocation("2""preSharedKeyAuthenticationRequired(QSslPreSharedKeyAuthenticator*)" "\0" __FILE__ ":" "158""164"),-
114 this, qFlagLocation("1""_q_preSharedKeyAuthenticationRequired(QSslPreSharedKeyAuthenticator*)" "\0" __FILE__ ":" "159""165"),-
115 Qt::DirectConnection);-
116 QObject::connect(sslSocket, qFlagLocation("2""encryptedBytesWritten(qint64)" "\0" __FILE__ ":" "161""167"),-
117 this, qFlagLocation("1""_q_encryptedBytesWritten(qint64)" "\0" __FILE__ ":" "162""168"),-
118 Qt::DirectConnection);-
119-
120 if (ignoreAllSslErrors)-
121 sslSocket->ignoreSslErrors();-
122-
123 if (!ignoreSslErrorsList.isEmpty())-
124 sslSocket->ignoreSslErrors(ignoreSslErrorsList);-
125-
126 if (!sslConfiguration.isNull())-
127 sslSocket->setSslConfiguration(sslConfiguration);-
128 } else {-
129-
130 protocolHandler.reset(new QHttpProtocolHandler(this));-
131-
132 }-
133-
134-
135-
136 if (proxy.type() != QNetworkProxy::NoProxy)-
137 socket->setProxy(proxy);-
138-
139 isInitialized = true;-
140}-
141-
142-
143void QHttpNetworkConnectionChannel::close()-
144{-
145 if (!socket)-
146 state = QHttpNetworkConnectionChannel::IdleState;-
147 else if (socket->state() == QAbstractSocket::UnconnectedState)-
148 state = QHttpNetworkConnectionChannel::IdleState;-
149 else-
150 state = QHttpNetworkConnectionChannel::ClosingState;-
151-
152-
153 pendingEncrypt = false;-
154-
155 if (socket) {-
156-
157-
158 socket->close();-
159 }-
160}-
161-
162-
163void QHttpNetworkConnectionChannel::abort()-
164{-
165 if (!socket)-
166 state = QHttpNetworkConnectionChannel::IdleState;-
167 else if (socket->state() == QAbstractSocket::UnconnectedState)-
168 state = QHttpNetworkConnectionChannel::IdleState;-
169 else-
170 state = QHttpNetworkConnectionChannel::ClosingState;-
171-
172-
173 pendingEncrypt = false;-
174-
175 if (socket) {-
176-
177-
178 socket->abort();-
179 }-
180}-
181-
182-
183bool QHttpNetworkConnectionChannel::sendRequest()-
184{-
185 ((!(!protocolHandler.isNull())) ? qt_assert("!protocolHandler.isNull()",__FILE__,230236) : qt_noop());-
186 return protocolHandler->sendRequest();-
187}-
188-
189-
190void QHttpNetworkConnectionChannel::_q_receiveReply()-
191{-
192 ((!(!protocolHandler.isNull())) ? qt_assert("!protocolHandler.isNull()",__FILE__,237243) : qt_noop());-
193 protocolHandler->_q_receiveReply();-
194}-
195-
196void QHttpNetworkConnectionChannel::_q_readyRead()-
197{-
198 ((!(!protocolHandler.isNull())) ? qt_assert("!protocolHandler.isNull()",__FILE__,243249) : qt_noop());-
199 protocolHandler->_q_readyRead();-
200}-
201-
202-
203void QHttpNetworkConnectionChannel::handleUnexpectedEOF()-
204{-
205 ((!(reply)) ? qt_assert("reply",__FILE__,250256) : qt_noop());-
206 if (reconnectAttempts <= 0) {-
207-
208 requeueCurrentlyPipelinedRequests();-
209 close();-
210 reply->d_func()->errorString = connection->d_func()->errorDetail(QNetworkReply::RemoteHostClosedError, socket);-
211 reply->finishedWithError(QNetworkReply::RemoteHostClosedError, reply->d_func()->errorString);-
212 reply = 0;-
213 if (protocolHandler)-
214 protocolHandler->setReply(0);-
215 request = QHttpNetworkRequest();-
216 QMetaObject::invokeMethod(connection, "_q_startNextRequest", Qt::QueuedConnection);-
217 } else {-
218 reconnectAttempts--;-
219 reply->d_func()->clear();-
220 reply->d_func()->connection = connection;-
221 reply->d_func()->connectionChannel = this;-
222 closeAndResendCurrentRequest();-
223 }-
224}-
225-
226bool QHttpNetworkConnectionChannel::ensureConnection()-
227{-
228 if (!isInitialized)-
229 init();-
230-
231 QAbstractSocket::SocketState socketState = socket->state();-
232-
233-
234-
235-
236-
237-
238 if (socketState == QAbstractSocket::ClosingState ||-
239 (socketState != QAbstractSocket::UnconnectedState && !socket->isOpen())) {-
240 if (reply)-
241 resendCurrent = true;-
242 return false;-
243 }-
244-
245-
246 if (socketState == QAbstractSocket::HostLookupState ||-
247 socketState == QAbstractSocket::ConnectingState) {-
248 return false;-
249 }-
250-
251-
252-
253 if (socketState != QAbstractSocket::ConnectedState) {-
254-
255 state = QHttpNetworkConnectionChannel::ConnectingState;-
256 pendingEncrypt = ssl;-
257-
258-
259 pipeliningSupported = PipeliningSupportUnknown;-
260 authenticationCredentialsSent = false;-
261 proxyCredentialsSent = false;-
262 authenticator.detach();-
263 QAuthenticatorPrivate *priv = QAuthenticatorPrivate::getPrivate(authenticator);-
264 priv->hasFailed = false;-
265 proxyAuthenticator.detach();-
266 priv = QAuthenticatorPrivate::getPrivate(proxyAuthenticator);-
267 priv->hasFailed = false;-
268-
269-
270-
271-
272-
273-
274-
275 priv = QAuthenticatorPrivate::getPrivate(authenticator);-
276 if (priv && priv->phase == QAuthenticatorPrivate::Done)-
277 priv->phase = QAuthenticatorPrivate::Start;-
278 priv = QAuthenticatorPrivate::getPrivate(proxyAuthenticator);-
279 if (priv && priv->phase == QAuthenticatorPrivate::Done)-
280 priv->phase = QAuthenticatorPrivate::Start;-
281-
282 QString connectHost = connection->d_func()->hostName;-
283 quint16 connectPort = connection->d_func()->port;-
284-
285-
286-
287 if (connection->d_func()->networkProxy.type() != QNetworkProxy::NoProxy && !ssl) {-
288 connectHost = connection->d_func()->networkProxy.hostName();-
289 connectPort = connection->d_func()->networkProxy.port();-
290 }-
291 if (socket->proxy().type() == QNetworkProxy::HttpProxy) {-
292-
293 QByteArray value;-
294-
295 if (request.url().isEmpty())-
296 value = connection->d_func()->predictNextRequest().headerField("user-agent");-
297 else-
298 value = request.headerField("user-agent");-
299 if (!value.isEmpty()) {-
300 QNetworkProxy proxy(socket->proxy());-
301 proxy.setRawHeader("User-Agent", value);-
302 socket->setProxy(proxy);-
303 }-
304 }-
305-
306 if (ssl) {-
307-
308 QSslSocket *sslSocket = qobject_cast<QSslSocket*>(socket);-
309-
310-
311-
312-
313 if (!connection->sslContext().isNull())-
314 QSslSocketPrivate::checkSettingSslContext(sslSocket, connection->sslContext());-
315-
316 sslSocket->connectToHostEncrypted(connectHost, connectPort, QIODevice::ReadWrite, networkLayerPreference);-
317 if (ignoreAllSslErrors)-
318 sslSocket->ignoreSslErrors();-
319 sslSocket->ignoreSslErrors(ignoreSslErrorsList);-
320-
321-
322-
323-
324 socket->setReadBufferSize(64*1024);-
325-
326-
327-
328-
329-
330-
331 } else {-
332-
333-
334 if (connection->d_func()->networkProxy.type() == QNetworkProxy::NoProxy-
335 && connection->cacheProxy().type() == QNetworkProxy::NoProxy-
336 && connection->transparentProxy().type() == QNetworkProxy::NoProxy) {-
337-
338 socket->connectToHost(connectHost, connectPort, QIODevice::ReadWrite | QIODevice::Unbuffered, networkLayerPreference);-
339-
340 socket->setReadBufferSize(1*1024);-
341-
342 } else {-
343 socket->connectToHost(connectHost, connectPort, QIODevice::ReadWrite, networkLayerPreference);-
344-
345-
346-
347-
348 socket->setReadBufferSize(64*1024);-
349 }-
350-
351 }-
352 return false;-
353 }-
354-
355-
356 if (pendingEncrypt) {-
357-
358-
359 return false;-
360 }-
361-
362 return true;-
363}-
364-
365void QHttpNetworkConnectionChannel::allDone()-
366{-
367 ((!(reply)) ? qt_assert("reply",__FILE__,412418) : qt_noop());-
368-
369 if (!reply
!replyDescription
TRUEnever evaluated
FALSEevaluated 1762 times by 7 tests
Evaluated by:
  • tst_QAbstractNetworkCache
  • tst_QHttpNetworkConnection
  • tst_QNetworkAccessManager_And_QProgressDialog
  • tst_QNetworkDiskCache
  • tst_QNetworkProxyFactory
  • tst_QNetworkReply
  • tst_Spdy
) {
0-1762
370 QMessageLogger(__FILE__, 415421, __PRETTY_FUNCTION__).warning() << ("QHttpNetworkConnectionChannel::allDone() called without reply. Please report at http://bugreports.qt.io/";);-
371 return;
never executed: return;
0
372 }-
373-
374-
375 bool emitFinished = reply->d_func()->shouldEmitSignals();-
376 bool connectionCloseEnabled = reply->d_func()->isConnectionCloseEnabled();-
377 detectPipeliningSupport();-
378-
379 handleStatus();-
380-
381-
382-
383-
384-
385 if (reply
replyDescription
TRUEevaluated 1760 times by 7 tests
Evaluated by:
  • tst_QAbstractNetworkCache
  • tst_QHttpNetworkConnection
  • tst_QNetworkAccessManager_And_QProgressDialog
  • tst_QNetworkDiskCache
  • tst_QNetworkProxyFactory
  • tst_QNetworkReply
  • tst_Spdy
FALSEevaluated 2 times by 1 test
Evaluated by:
  • tst_QNetworkReply
&& emitFinished
emitFinishedDescription
TRUEevaluated 1405 times by 7 tests
Evaluated by:
  • tst_QAbstractNetworkCache
  • tst_QHttpNetworkConnection
  • tst_QNetworkAccessManager_And_QProgressDialog
  • tst_QNetworkDiskCache
  • tst_QNetworkProxyFactory
  • tst_QNetworkReply
  • tst_Spdy
FALSEevaluated 355 times by 2 tests
Evaluated by:
  • tst_QHttpNetworkConnection
  • tst_QNetworkReply
)
2-1760
386 QMetaObject::invokeMethod(reply, "finished", Qt::QueuedConnection);
executed 1405 times by 7 tests: QMetaObject::invokeMethod(reply, "finished", Qt::QueuedConnection);
Executed by:
  • tst_QAbstractNetworkCache
  • tst_QHttpNetworkConnection
  • tst_QNetworkAccessManager_And_QProgressDialog
  • tst_QNetworkDiskCache
  • tst_QNetworkProxyFactory
  • tst_QNetworkReply
  • tst_Spdy
1405
387-
388-
389-
390-
391 reconnectAttempts = reconnectAttemptsDefault;-
392-
393-
394 if (state != QHttpNetworkConnectionChannel::ClosingState
state != QHttp...::ClosingStateDescription
TRUEevaluated 1762 times by 7 tests
Evaluated by:
  • tst_QAbstractNetworkCache
  • tst_QHttpNetworkConnection
  • tst_QNetworkAccessManager_And_QProgressDialog
  • tst_QNetworkDiskCache
  • tst_QNetworkProxyFactory
  • tst_QNetworkReply
  • tst_Spdy
FALSEnever evaluated
)
0-1762
395 state = QHttpNetworkConnectionChannel::IdleState;
executed 1762 times by 7 tests: state = QHttpNetworkConnectionChannel::IdleState;
Executed by:
  • tst_QAbstractNetworkCache
  • tst_QHttpNetworkConnection
  • tst_QNetworkAccessManager_And_QProgressDialog
  • tst_QNetworkDiskCache
  • tst_QNetworkProxyFactory
  • tst_QNetworkReply
  • tst_Spdy
1762
396-
397-
398-
399-
400-
401-
402 if (!resendCurrent
!resendCurrentDescription
TRUEevaluated 1437 times by 7 tests
Evaluated by:
  • tst_QAbstractNetworkCache
  • tst_QHttpNetworkConnection
  • tst_QNetworkAccessManager_And_QProgressDialog
  • tst_QNetworkDiskCache
  • tst_QNetworkProxyFactory
  • tst_QNetworkReply
  • tst_Spdy
FALSEevaluated 325 times by 2 tests
Evaluated by:
  • tst_QHttpNetworkConnection
  • tst_QNetworkReply
) {
325-1437
403 request = QHttpNetworkRequest();-
404 reply = 0;-
405 protocolHandler->setReply(0);-
406 }
executed 1437 times by 7 tests: end of block
Executed by:
  • tst_QAbstractNetworkCache
  • tst_QHttpNetworkConnection
  • tst_QNetworkAccessManager_And_QProgressDialog
  • tst_QNetworkDiskCache
  • tst_QNetworkProxyFactory
  • tst_QNetworkReply
  • tst_Spdy
1437
407-
408-
409 if (!alreadyPipelinedRequests.isEmpty()
!alreadyPipeli...ests.isEmpty()Description
TRUEevaluated 402 times by 2 tests
Evaluated by:
  • tst_QHttpNetworkConnection
  • tst_QNetworkReply
FALSEevaluated 1360 times by 7 tests
Evaluated by:
  • tst_QAbstractNetworkCache
  • tst_QHttpNetworkConnection
  • tst_QNetworkAccessManager_And_QProgressDialog
  • tst_QNetworkDiskCache
  • tst_QNetworkProxyFactory
  • tst_QNetworkReply
  • tst_Spdy
) {
402-1360
410 if (resendCurrent
resendCurrentDescription
TRUEnever evaluated
FALSEevaluated 402 times by 2 tests
Evaluated by:
  • tst_QHttpNetworkConnection
  • tst_QNetworkReply
|| connectionCloseEnabled
connectionCloseEnabledDescription
TRUEnever evaluated
FALSEevaluated 402 times by 2 tests
Evaluated by:
  • tst_QHttpNetworkConnection
  • tst_QNetworkReply
|| socket->state() != QAbstractSocket::ConnectedState
socket->state(...ConnectedStateDescription
TRUEnever evaluated
FALSEevaluated 402 times by 2 tests
Evaluated by:
  • tst_QHttpNetworkConnection
  • tst_QNetworkReply
) {
0-402
411-
412 requeueCurrentlyPipelinedRequests();-
413 close();-
414 }
never executed: end of block
else {
0
415-
416 HttpMessagePair messagePair = alreadyPipelinedRequests.takeFirst();-
417-
418 request = messagePair.first;-
419 reply = messagePair.second;-
420 protocolHandler->setReply(messagePair.second);-
421 state = QHttpNetworkConnectionChannel::ReadingState;-
422 resendCurrent = false;-
423-
424 written = 0;-
425 bytesTotal = 0;-
426-
427-
428 connection->d_func()->fillPipeline(socket);-
429-
430-
431-
432-
433 }
executed 402 times by 2 tests: end of block
Executed by:
  • tst_QHttpNetworkConnection
  • tst_QNetworkReply
402
434 } else if (alreadyPipelinedRequests.isEmpty()
alreadyPipelin...ests.isEmpty()Description
TRUEevaluated 1360 times by 7 tests
Evaluated by:
  • tst_QAbstractNetworkCache
  • tst_QHttpNetworkConnection
  • tst_QNetworkAccessManager_And_QProgressDialog
  • tst_QNetworkDiskCache
  • tst_QNetworkProxyFactory
  • tst_QNetworkReply
  • tst_Spdy
FALSEnever evaluated
&& socket->bytesAvailable() > 0
socket->bytesAvailable() > 0Description
TRUEnever evaluated
FALSEevaluated 1360 times by 7 tests
Evaluated by:
  • tst_QAbstractNetworkCache
  • tst_QHttpNetworkConnection
  • tst_QNetworkAccessManager_And_QProgressDialog
  • tst_QNetworkDiskCache
  • tst_QNetworkProxyFactory
  • tst_QNetworkReply
  • tst_Spdy
) {
0-1360
435-
436 close();-
437-
438 QMetaObject::invokeMethod(connection, "_q_startNextRequest", Qt::QueuedConnection);-
439 }
never executed: end of block
else if (alreadyPipelinedRequests.isEmpty()
alreadyPipelin...ests.isEmpty()Description
TRUEevaluated 1360 times by 7 tests
Evaluated by:
  • tst_QAbstractNetworkCache
  • tst_QHttpNetworkConnection
  • tst_QNetworkAccessManager_And_QProgressDialog
  • tst_QNetworkDiskCache
  • tst_QNetworkProxyFactory
  • tst_QNetworkReply
  • tst_Spdy
FALSEnever evaluated
) {
0-1360
440 if (connectionCloseEnabled
connectionCloseEnabledDescription
TRUEevaluated 185 times by 2 tests
Evaluated by:
  • tst_QHttpNetworkConnection
  • tst_QNetworkReply
FALSEevaluated 1175 times by 7 tests
Evaluated by:
  • tst_QAbstractNetworkCache
  • tst_QHttpNetworkConnection
  • tst_QNetworkAccessManager_And_QProgressDialog
  • tst_QNetworkDiskCache
  • tst_QNetworkProxyFactory
  • tst_QNetworkReply
  • tst_Spdy
)
185-1175
441 if (socket->state() != QAbstractSocket::UnconnectedState
socket->state(...connectedStateDescription
TRUEevaluated 125 times by 2 tests
Evaluated by:
  • tst_QHttpNetworkConnection
  • tst_QNetworkReply
FALSEevaluated 60 times by 1 test
Evaluated by:
  • tst_QNetworkReply
)
60-125
442 close();
executed 125 times by 2 tests: close();
Executed by:
  • tst_QHttpNetworkConnection
  • tst_QNetworkReply
125
443 if (qobject_cast<QHttpNetworkConnection*>(connection)
qobject_cast<Q...*>(connection)Description
TRUEevaluated 1360 times by 7 tests
Evaluated by:
  • tst_QAbstractNetworkCache
  • tst_QHttpNetworkConnection
  • tst_QNetworkAccessManager_And_QProgressDialog
  • tst_QNetworkDiskCache
  • tst_QNetworkProxyFactory
  • tst_QNetworkReply
  • tst_Spdy
FALSEnever evaluated
)
0-1360
444 QMetaObject::invokeMethod(connection, "_q_startNextRequest", Qt::QueuedConnection);
executed 1360 times by 7 tests: QMetaObject::invokeMethod(connection, "_q_startNextRequest", Qt::QueuedConnection);
Executed by:
  • tst_QAbstractNetworkCache
  • tst_QHttpNetworkConnection
  • tst_QNetworkAccessManager_And_QProgressDialog
  • tst_QNetworkDiskCache
  • tst_QNetworkProxyFactory
  • tst_QNetworkReply
  • tst_Spdy
1360
445 }
executed 1360 times by 7 tests: end of block
Executed by:
  • tst_QAbstractNetworkCache
  • tst_QHttpNetworkConnection
  • tst_QNetworkAccessManager_And_QProgressDialog
  • tst_QNetworkDiskCache
  • tst_QNetworkProxyFactory
  • tst_QNetworkReply
  • tst_Spdy
1360
446}
executed 1762 times by 7 tests: end of block
Executed by:
  • tst_QAbstractNetworkCache
  • tst_QHttpNetworkConnection
  • tst_QNetworkAccessManager_And_QProgressDialog
  • tst_QNetworkDiskCache
  • tst_QNetworkProxyFactory
  • tst_QNetworkReply
  • tst_Spdy
1762
447-
448void QHttpNetworkConnectionChannel::detectPipeliningSupport()-
449{-
450 ((!(reply)) ? qt_assert("reply",__FILE__,495501) : qt_noop());-
451-
452 QByteArray serverHeaderField;-
453 if (-
454-
455 (reply->d_func()->majorVersion == 1 && reply->d_func()->minorVersion == 1)-
456-
457 && (!reply->d_func()->isConnectionCloseEnabled())-
458-
459 && (socket->state() == QAbstractSocket::ConnectedState)-
460-
461-
462 && (serverHeaderField = reply->headerField("Server"), !serverHeaderField.contains("Microsoft-IIS/4."))-
463 && (!serverHeaderField.contains("Microsoft-IIS/5."))-
464 && (!serverHeaderField.contains("Netscape-Enterprise/3."))-
465-
466 && (!serverHeaderField.contains("WebLogic"))-
467 && (!serverHeaderField.startsWith("Rocket"))-
468 ) {-
469 pipeliningSupported = QHttpNetworkConnectionChannel::PipeliningProbablySupported;-
470 } else {-
471 pipeliningSupported = QHttpNetworkConnectionChannel::PipeliningSupportUnknown;-
472 }-
473}-
474-
475-
476void QHttpNetworkConnectionChannel::requeueCurrentlyPipelinedRequests()-
477{-
478 for (int i = 0; i < alreadyPipelinedRequests.length(); i++)-
479 connection->d_func()->requeueRequest(alreadyPipelinedRequests.at(i));-
480 alreadyPipelinedRequests.clear();-
481-
482-
483-
484-
485 if (qobject_cast<QHttpNetworkConnection*>(connection))-
486 QMetaObject::invokeMethod(connection, "_q_startNextRequest", Qt::QueuedConnection);-
487}-
488-
489void QHttpNetworkConnectionChannel::handleStatus()-
490{-
491 ((!(socket)) ? qt_assert("socket",__FILE__,536542) : qt_noop());-
492 ((!(reply)) ? qt_assert("reply",__FILE__,537543) : qt_noop());-
493-
494 int statusCode = reply->statusCode();-
495 bool resend = false;-
496-
497 switch (statusCode) {-
498 case 301:-
499 case 302:-
500 case 303:-
501 case 305:-
502 case 307: {-
503-
504 QUrl redirectUrl = connection->d_func()->parseRedirectResponse(socket, reply);-
505 if (redirectUrl.isValid())-
506 reply->setRedirectUrl(redirectUrl);-
507-
508 if (qobject_cast<QHttpNetworkConnection *>(connection))-
509 QMetaObject::invokeMethod(connection, "_q_startNextRequest", Qt::QueuedConnection);-
510 break;-
511 }-
512 case 401:-
513 case 407:-
514 if (connection->d_func()->handleAuthenticateChallenge(socket, reply, (statusCode == 407), resend)) {-
515 if (resend) {-
516 if (!resetUploadData())-
517 break;-
518-
519 reply->d_func()->eraseData();-
520-
521 if (alreadyPipelinedRequests.isEmpty()) {-
522-
523 resendCurrent = true;-
524 QMetaObject::invokeMethod(connection, "_q_startNextRequest", Qt::QueuedConnection);-
525 } else {-
526-
527 closeAndResendCurrentRequest();-
528 QMetaObject::invokeMethod(connection, "_q_startNextRequest", Qt::QueuedConnection);-
529 }-
530 } else {-
531-
532 close();-
533 }-
534 } else {-
535 reply->headerChanged();-
536 reply->readyRead();-
537 QNetworkReply::NetworkError errorCode = (statusCode == 407)-
538 ? QNetworkReply::ProxyAuthenticationRequiredError-
539 : QNetworkReply::AuthenticationRequiredError;-
540 reply->d_func()->errorString = connection->d_func()->errorDetail(errorCode, socket);-
541 reply->finishedWithError(errorCode, reply->d_func()->errorString);-
542 }-
543 break;-
544 default:-
545 if (qobject_cast<QHttpNetworkConnection*>(connection))-
546 QMetaObject::invokeMethod(connection, "_q_startNextRequest", Qt::QueuedConnection);-
547 }-
548}-
549-
550bool QHttpNetworkConnectionChannel::resetUploadData()-
551{-
552 if (!reply) {-
553-
554 return false;-
555 }-
556 QNonContiguousByteDevice* uploadByteDevice = request.uploadByteDevice();-
557 if (!uploadByteDevice)-
558 return true;-
559-
560 if (uploadByteDevice->reset()) {-
561 written = 0;-
562 return true;-
563 } else {-
564 connection->d_func()->emitReplyError(socket, reply, QNetworkReply::ContentReSendError);-
565 return false;-
566 }-
567}-
568-
569-
570-
571void QHttpNetworkConnectionChannel::setProxy(const QNetworkProxy &networkProxy)-
572{-
573 if (socket)-
574 socket->setProxy(networkProxy);-
575-
576 proxy = networkProxy;-
577}-
578-
579-
580-
581-
582-
583void QHttpNetworkConnectionChannel::ignoreSslErrors()-
584{-
585 if (socket)-
586 static_cast<QSslSocket *>(socket)->ignoreSslErrors();-
587-
588 ignoreAllSslErrors = true;-
589}-
590-
591-
592void QHttpNetworkConnectionChannel::ignoreSslErrors(const QList<QSslError> &errors)-
593{-
594 if (socket)-
595 static_cast<QSslSocket *>(socket)->ignoreSslErrors(errors);-
596-
597 ignoreSslErrorsList = errors;-
598}-
599-
600void QHttpNetworkConnectionChannel::setSslConfiguration(const QSslConfiguration &config)-
601{-
602 if (socket)-
603 static_cast<QSslSocket *>(socket)->setSslConfiguration(config);-
604-
605 sslConfiguration = config;-
606}-
607-
608-
609-
610void QHttpNetworkConnectionChannel::pipelineInto(HttpMessagePair &pair)-
611{-
612-
613-
614 QHttpNetworkRequest &request = pair.first;-
615 QHttpNetworkReply *reply = pair.second;-
616 reply->d_func()->clear();-
617 reply->d_func()->connection = connection;-
618 reply->d_func()->connectionChannel = this;-
619 reply->d_func()->autoDecompress = request.d->autoDecompress;-
620 reply->d_func()->pipeliningUsed = true;-
621-
622-
623 pipeline.append(QHttpNetworkRequestPrivate::header(request,-
624 (connection->d_func()->networkProxy.type() != QNetworkProxy::NoProxy)));-
625-
626-
627-
628-
629 alreadyPipelinedRequests.append(pair);-
630-
631-
632}-
633-
634void QHttpNetworkConnectionChannel::pipelineFlush()-
635{-
636 if (pipeline.isEmpty())-
637 return;-
638-
639-
640-
641-
642-
643-
644 socket->write(pipeline);-
645 pipeline.clear();-
646}-
647-
648-
649void QHttpNetworkConnectionChannel::closeAndResendCurrentRequest()-
650{-
651 requeueCurrentlyPipelinedRequests();-
652 close();-
653 if (reply)-
654 resendCurrent = true;-
655 if (qobject_cast<QHttpNetworkConnection*>(connection))-
656 QMetaObject::invokeMethod(connection, "_q_startNextRequest", Qt::QueuedConnection);-
657}-
658-
659void QHttpNetworkConnectionChannel::resendCurrentRequest()-
660{-
661 requeueCurrentlyPipelinedRequests();-
662 if (reply)-
663 resendCurrent = true;-
664 if (qobject_cast<QHttpNetworkConnection*>(connection))-
665 QMetaObject::invokeMethod(connection, "_q_startNextRequest", Qt::QueuedConnection);-
666}-
667-
668bool QHttpNetworkConnectionChannel::isSocketBusy() const-
669{-
670 return (state & QHttpNetworkConnectionChannel::BusyState);-
671}-
672-
673bool QHttpNetworkConnectionChannel::isSocketWriting() const-
674{-
675 return (state & QHttpNetworkConnectionChannel::WritingState);-
676}-
677-
678bool QHttpNetworkConnectionChannel::isSocketWaiting() const-
679{-
680 return (state & QHttpNetworkConnectionChannel::WaitingState);-
681}-
682-
683bool QHttpNetworkConnectionChannel::isSocketReading() const-
684{-
685 return (state & QHttpNetworkConnectionChannel::ReadingState);-
686}-
687-
688void QHttpNetworkConnectionChannel::_q_bytesWritten(qint64 bytes)-
689{-
690 (void)bytes;;-
691 if (ssl) {-
692-
693-
694 return;-
695 }-
696-
697-
698 if (isSocketWriting())-
699 sendRequest();-
700-
701}-
702-
703void QHttpNetworkConnectionChannel::_q_disconnected()-
704{-
705 if (state == QHttpNetworkConnectionChannel::ClosingState) {-
706 state = QHttpNetworkConnectionChannel::IdleState;-
707 QMetaObject::invokeMethod(connection, "_q_startNextRequest", Qt::QueuedConnection);-
708 return;-
709 }-
710-
711-
712 if ((isSocketWaiting() || isSocketReading()) && socket->bytesAvailable()) {-
713 if (reply) {-
714 state = QHttpNetworkConnectionChannel::ReadingState;-
715 _q_receiveReply();-
716 }-
717 } else if (state == QHttpNetworkConnectionChannel::IdleState && resendCurrent) {-
718-
719 QMetaObject::invokeMethod(connection, "_q_startNextRequest", Qt::QueuedConnection);-
720 }-
721 state = QHttpNetworkConnectionChannel::IdleState;-
722-
723 requeueCurrentlyPipelinedRequests();-
724-
725 pendingEncrypt = false;-
726}-
727-
728-
729void QHttpNetworkConnectionChannel::_q_connected()-
730{-
731-
732 if (connection->d_func()->networkLayerState == QHttpNetworkConnectionPrivate::HostLookupPending || connection->d_func()->networkLayerState == QHttpNetworkConnectionPrivate::IPv4or6) {-
733 if (connection->d_func()->delayedConnectionTimer.isActive())-
734 connection->d_func()->delayedConnectionTimer.stop();-
735 if (networkLayerPreference == QAbstractSocket::IPv4Protocol)-
736 connection->d_func()->networkLayerState = QHttpNetworkConnectionPrivate::IPv4;-
737 else if (networkLayerPreference == QAbstractSocket::IPv6Protocol)-
738 connection->d_func()->networkLayerState = QHttpNetworkConnectionPrivate::IPv6;-
739 else {-
740 if (socket->peerAddress().protocol() == QAbstractSocket::IPv4Protocol)-
741 connection->d_func()->networkLayerState = QHttpNetworkConnectionPrivate::IPv4;-
742 else-
743 connection->d_func()->networkLayerState = QHttpNetworkConnectionPrivate::IPv6;-
744 }-
745 connection->d_func()->networkLayerDetected(networkLayerPreference);-
746 } else {-
747 if (((connection->d_func()->networkLayerState == QHttpNetworkConnectionPrivate::IPv4) && (networkLayerPreference != QAbstractSocket::IPv4Protocol))-
748 || ((connection->d_func()->networkLayerState == QHttpNetworkConnectionPrivate::IPv6) && (networkLayerPreference != QAbstractSocket::IPv6Protocol))) {-
749 close();-
750-
751 QMetaObject::invokeMethod(connection, "_q_startNextRequest", Qt::QueuedConnection);-
752 return;-
753 }-
754-
755 }-
756 socket->setSocketOption(QAbstractSocket::KeepAliveOption, 1);-
757-
758 pipeliningSupported = QHttpNetworkConnectionChannel::PipeliningSupportUnknown;-
759-
760-
761-
762 if (ssl || pendingEncrypt) {-
763-
764 if (connection->sslContext().isNull()) {-
765-
766-
767 QSharedPointer<QSslContext> socketSslContext = QSslSocketPrivate::sslContext(static_cast<QSslSocket*>(socket));-
768 if (!socketSslContext.isNull())-
769 connection->setSslContext(socketSslContext);-
770 }-
771-
772 } else {-
773 state = QHttpNetworkConnectionChannel::IdleState;-
774 if (!reply)-
775 connection->d_func()->dequeueRequest(socket);-
776 if (reply)-
777 sendRequest();-
778 }-
779}-
780-
781-
782void QHttpNetworkConnectionChannel::_q_error(QAbstractSocket::SocketError socketError)-
783{-
784 if (!socket)-
785 return;-
786 QNetworkReply::NetworkError errorCode = QNetworkReply::UnknownNetworkError;-
787-
788 switch (socketError) {-
789 case QAbstractSocket::HostNotFoundError:-
790 errorCode = QNetworkReply::HostNotFoundError;-
791 break;-
792 case QAbstractSocket::ConnectionRefusedError:-
793 errorCode = QNetworkReply::ConnectionRefusedError;-
794 break;-
795 case QAbstractSocket::RemoteHostClosedError:-
796-
797-
798-
799 if (!reply && state == QHttpNetworkConnectionChannel::IdleState) {-
800-
801-
802-
803 return;-
804 } else if (state != QHttpNetworkConnectionChannel::IdleState && state != QHttpNetworkConnectionChannel::ReadingState) {-
805-
806-
807 if (reconnectAttempts-- > 0) {-
808 resendCurrentRequest();-
809 return;-
810 } else {-
811 errorCode = QNetworkReply::RemoteHostClosedError;-
812 }-
813 } else if (state == QHttpNetworkConnectionChannel::ReadingState) {-
814 if (!reply)-
815 break;-
816-
817 if (!reply->d_func()->expectContent()) {-
818-
819-
820 QMetaObject::invokeMethod(this, "_q_receiveReply", Qt::QueuedConnection);-
821 return;-
822 }-
823 if (reply->contentLength() == -1 && !reply->d_func()->isChunked()) {-
824-
825-
826-
827 QMetaObject::invokeMethod(this, "_q_receiveReply", Qt::QueuedConnection);-
828 return;-
829 }-
830-
831-
832 if (socket->bytesAvailable()) {-
833-
834-
835-
836 reply->setReadBufferSize(0);-
837 reply->setDownstreamLimited(false);-
838 _q_receiveReply();-
839 if (!reply) {-
840-
841 requeueCurrentlyPipelinedRequests();-
842 state = QHttpNetworkConnectionChannel::IdleState;-
843 QMetaObject::invokeMethod(connection, "_q_startNextRequest", Qt::QueuedConnection);-
844 return;-
845 }-
846 }-
847-
848 errorCode = QNetworkReply::RemoteHostClosedError;-
849 } else {-
850 errorCode = QNetworkReply::RemoteHostClosedError;-
851 }-
852 break;-
853 case QAbstractSocket::SocketTimeoutError:-
854-
855 if (state == QHttpNetworkConnectionChannel::WritingState && (reconnectAttempts-- > 0)) {-
856 resendCurrentRequest();-
857 return;-
858 }-
859 errorCode = QNetworkReply::TimeoutError;-
860 break;-
861 case QAbstractSocket::ProxyAuthenticationRequiredError:-
862 errorCode = QNetworkReply::ProxyAuthenticationRequiredError;-
863 break;-
864 case QAbstractSocket::SslHandshakeFailedError:-
865 errorCode = QNetworkReply::SslHandshakeFailedError;-
866 break;-
867 case QAbstractSocket::ProxyConnectionClosedError:-
868-
869 if (reconnectAttempts-- > 0) {-
870 resendCurrentRequest();-
871 return;-
872 }-
873 errorCode = QNetworkReply::ProxyConnectionClosedError;-
874 break;-
875 case QAbstractSocket::ProxyConnectionTimeoutError:-
876-
877 if (reconnectAttempts-- > 0) {-
878 resendCurrentRequest();-
879 return;-
880 }-
881 errorCode = QNetworkReply::ProxyTimeoutError;-
882 break;-
883 default:-
884-
885 errorCode = QNetworkReply::UnknownNetworkError;-
886 break;-
887 }-
888 QPointer<QHttpNetworkConnection> that = connection;-
889 QString errorString = connection->d_func()->errorDetail(errorCode, socket, socket->errorString());-
890-
891-
892-
893 if (!connection->d_func()->shouldEmitChannelError(socket))-
894 return;-
895-
896-
897 do {-
898-
899 if (!reply)-
900 connection->d_func()->dequeueRequest(socket);-
901-
902 if (reply) {-
903 reply->d_func()->errorString = errorString;-
904 reply->finishedWithError(errorCode, errorString);-
905 reply = 0;-
906 if (protocolHandler)-
907 protocolHandler->setReply(0);-
908 }-
909 } while (!connection->d_func()->highPriorityQueue.isEmpty()-
910 || !connection->d_func()->lowPriorityQueue.isEmpty());-
911-
912 if (connection->connectionType() == QHttpNetworkConnection::ConnectionTypeSPDY) {-
913 QList<HttpMessagePair> spdyPairs = spdyRequestsToSend.values();-
914 for (int a = 0; a < spdyPairs.count(); ++a) {-
915-
916 QHttpNetworkReply *currentReply = spdyPairs.at(a).second;-
917 ((!(currentReply)) ? qt_assert("currentReply",__FILE__,973979) : qt_noop());-
918 currentReply->finishedWithError(errorCode, errorString);-
919 }-
920 }-
921-
922-
923-
924 QMetaObject::invokeMethod(that, "_q_startNextRequest", Qt::QueuedConnection);-
925-
926 if (that) {-
927-
928 if (!socket)-
929 state = QHttpNetworkConnectionChannel::IdleState;-
930 else if (socket->state() == QAbstractSocket::UnconnectedState)-
931 state = QHttpNetworkConnectionChannel::IdleState;-
932 else-
933 state = QHttpNetworkConnectionChannel::ClosingState;-
934-
935-
936 pendingEncrypt = false;-
937 }-
938}-
939-
940-
941void QHttpNetworkConnectionChannel::_q_proxyAuthenticationRequired(const QNetworkProxy &proxy, QAuthenticator* auth)-
942{-
943-
944 if (connection->connectionType() == QHttpNetworkConnection::ConnectionTypeSPDY) {-
945 connection->d_func()->emitProxyAuthenticationRequired(this, proxy, auth);-
946 } else {-
947-
948-
949 if (!reply)-
950 connection->d_func()->dequeueRequest(socket);-
951 if (reply)-
952 connection->d_func()->emitProxyAuthenticationRequired(this, proxy, auth);-
953-
954 }-
955-
956}-
957-
958-
959void QHttpNetworkConnectionChannel::_q_uploadDataReadyRead()-
960{-
961 if (reply)-
962 sendRequest();-
963}-
964-
965-
966void QHttpNetworkConnectionChannel::_q_encrypted()-
967{-
968 QSslSocket *sslSocket = qobject_cast<QSslSocket *>(socket);-
969 ((!(sslSocket)) ? qt_assert("sslSocket",__FILE__,10251031) : qt_noop());-
970-
971 if (!protocolHandler) {-
972 switch (sslSocket->sslConfiguration().nextProtocolNegotiationStatus()) {-
973 case QSslConfiguration::NextProtocolNegotiationNegotiated:-
974 case QSslConfiguration::NextProtocolNegotiationUnsupported: {-
975 QByteArray nextProtocol = sslSocket->sslConfiguration().nextNegotiatedProtocol();-
976 if (nextProtocol == QSslConfiguration::NextProtocolHttp1_1) {-
977-
978 } else if (nextProtocol == QSslConfiguration::NextProtocolSpdy3_0) {-
979 protocolHandler.reset(new QSpdyProtocolHandler(this));-
980 connection->setConnectionType(QHttpNetworkConnection::ConnectionTypeSPDY);-
981-
982-
983 break;-
984 } else {-
985 emitFinishedWithError(QNetworkReply::SslHandshakeFailedError,-
986 "detected unknown Next Protocol Negotiation protocol");-
987 break;-
988 }-
989 }-
990 case QSslConfiguration::NextProtocolNegotiationNone:-
991 protocolHandler.reset(new QHttpProtocolHandler(this));-
992 connection->setConnectionType(QHttpNetworkConnection::ConnectionTypeHTTP);-
993-
994 requeueSpdyRequests();-
995 break;-
996 default:-
997 emitFinishedWithError(QNetworkReply::SslHandshakeFailedError,-
998 "detected unknown Next Protocol Negotiation protocol");-
999 }-
1000 }-
1001-
1002 if (!socket)-
1003 return;-
1004 state = QHttpNetworkConnectionChannel::IdleState;-
1005 pendingEncrypt = false;-
1006-
1007 if (connection->connectionType() == QHttpNetworkConnection::ConnectionTypeSPDY) {-
1008-
1009 if (spdyRequestsToSend.count() > 0)-
1010-
1011 QMetaObject::invokeMethod(connection, "_q_startNextRequest", Qt::QueuedConnection);-
1012 } else {-
1013 if (!reply)-
1014 connection->d_func()->dequeueRequest(socket);-
1015 if (reply) {-
1016 reply->setSpdyWasUsed(false);-
1017 ((!(reply->d_func()->connectionChannel == this)) ? qt_assert("reply->d_func()->connectionChannel == this",__FILE__,10731079) : qt_noop());-
1018 reply->encrypted();-
1019 }-
1020 if (reply)-
1021 sendRequest();-
1022 }-
1023}-
1024-
1025void QHttpNetworkConnectionChannel::requeueSpdyRequests()-
1026{-
1027 QList<HttpMessagePair> spdyPairs = spdyRequestsToSend.values();-
1028 for (int a = 0; a < spdyPairs.count(); ++a) {-
1029 connection->d_func()->requeueRequest(spdyPairs.at(a));-
1030 }-
1031 spdyRequestsToSend.clear();-
1032}-
1033-
1034void QHttpNetworkConnectionChannel::emitFinishedWithError(QNetworkReply::NetworkError error,-
1035 const char *message)-
1036{-
1037 if (reply)-
1038 reply->finishedWithError(error, QHttpNetworkConnectionChannel::tr(message));-
1039 QList<HttpMessagePair> spdyPairs = spdyRequestsToSend.values();-
1040 for (int a = 0; a < spdyPairs.count(); ++a) {-
1041 QHttpNetworkReply *currentReply = spdyPairs.at(a).second;-
1042 ((!(currentReply)) ? qt_assert("currentReply",__FILE__,10981104) : qt_noop());-
1043 currentReply->finishedWithError(error, QHttpNetworkConnectionChannel::tr(message));-
1044 }-
1045}-
1046-
1047void QHttpNetworkConnectionChannel::_q_sslErrors(const QList<QSslError> &errors)-
1048{-
1049 if (!socket)-
1050 return;-
1051-
1052-
1053-
1054 connection->d_func()->pauseConnection();-
1055 if (pendingEncrypt && !reply)-
1056 connection->d_func()->dequeueRequest(socket);-
1057 if (connection->connectionType() == QHttpNetworkConnection::ConnectionTypeHTTP) {-
1058 if (reply)-
1059 reply->sslErrors(errors);-
1060 }-
1061-
1062 else {-
1063 QList<HttpMessagePair> spdyPairs = spdyRequestsToSend.values();-
1064 for (int a = 0; a < spdyPairs.count(); ++a) {-
1065-
1066 QHttpNetworkReply *currentReply = spdyPairs.at(a).second;-
1067 ((!(currentReply)) ? qt_assert("currentReply",__FILE__,11231129) : qt_noop());-
1068 currentReply->sslErrors(errors);-
1069 }-
1070 }-
1071-
1072 connection->d_func()->resumeConnection();-
1073}-
1074-
1075void QHttpNetworkConnectionChannel::_q_preSharedKeyAuthenticationRequired(QSslPreSharedKeyAuthenticator *authenticator)-
1076{-
1077 connection->d_func()->pauseConnection();-
1078-
1079 if (pendingEncrypt && !reply)-
1080 connection->d_func()->dequeueRequest(socket);-
1081-
1082 if (connection->connectionType() == QHttpNetworkConnection::ConnectionTypeHTTP) {-
1083 if (reply)-
1084 reply->preSharedKeyAuthenticationRequired(authenticator);-
1085 } else {-
1086 QList<HttpMessagePair> spdyPairs = spdyRequestsToSend.values();-
1087 for (int a = 0; a < spdyPairs.count(); ++a) {-
1088-
1089 QHttpNetworkReply *currentReply = spdyPairs.at(a).second;-
1090 ((!(currentReply)) ? qt_assert("currentReply",__FILE__,11461152) : qt_noop());-
1091 currentReply->preSharedKeyAuthenticationRequired(authenticator);-
1092 }-
1093 }-
1094-
1095 connection->d_func()->resumeConnection();-
1096}-
1097-
1098void QHttpNetworkConnectionChannel::_q_encryptedBytesWritten(qint64 bytes)-
1099{-
1100 (void)bytes;;-
1101-
1102 if (isSocketWriting())-
1103 sendRequest();-
1104-
1105}-
1106-
1107-
1108-
1109void QHttpNetworkConnectionChannel::setConnection(QHttpNetworkConnection *c)-
1110{-
1111-
1112-
1113 connection = c;-
1114}-
1115-
1116-
1117-
Switch to Source codePreprocessed file

Generated by Squish Coco Non-Commercial 4.3.0-BETA-master-30-08-2018-4cb69e9