Line | Source Code | Coverage |
---|
1 | /**************************************************************************** | - |
2 | ** | - |
3 | ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). | - |
4 | ** Contact: http://www.qt-project.org/legal | - |
5 | ** | - |
6 | ** This file is part of the QtNetwork module of the Qt Toolkit. | - |
7 | ** | - |
8 | ** $QT_BEGIN_LICENSE:LGPL$ | - |
9 | ** Commercial License Usage | - |
10 | ** Licensees holding valid commercial Qt licenses may use this file in | - |
11 | ** accordance with the commercial license agreement provided with the | - |
12 | ** Software or, alternatively, in accordance with the terms contained in | - |
13 | ** a written agreement between you and Digia. For licensing terms and | - |
14 | ** conditions see http://qt.digia.com/licensing. For further information | - |
15 | ** use the contact form at http://qt.digia.com/contact-us. | - |
16 | ** | - |
17 | ** GNU Lesser General Public License Usage | - |
18 | ** Alternatively, this file may be used under the terms of the GNU Lesser | - |
19 | ** General Public License version 2.1 as published by the Free Software | - |
20 | ** Foundation and appearing in the file LICENSE.LGPL included in the | - |
21 | ** packaging of this file. Please review the following information to | - |
22 | ** ensure the GNU Lesser General Public License version 2.1 requirements | - |
23 | ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. | - |
24 | ** | - |
25 | ** In addition, as a special exception, Digia gives you certain additional | - |
26 | ** rights. These rights are described in the Digia Qt LGPL Exception | - |
27 | ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. | - |
28 | ** | - |
29 | ** GNU General Public License Usage | - |
30 | ** Alternatively, this file may be used under the terms of the GNU | - |
31 | ** General Public License version 3.0 as published by the Free Software | - |
32 | ** Foundation and appearing in the file LICENSE.GPL included in the | - |
33 | ** packaging of this file. Please review the following information to | - |
34 | ** ensure the GNU General Public License version 3.0 requirements will be | - |
35 | ** met: http://www.gnu.org/copyleft/gpl.html. | - |
36 | ** | - |
37 | ** | - |
38 | ** $QT_END_LICENSE$ | - |
39 | ** | - |
40 | ****************************************************************************/ | - |
41 | | - |
42 | #include "qhttpsocketengine_p.h" | - |
43 | #include "qtcpsocket.h" | - |
44 | #include "qhostaddress.h" | - |
45 | #include "qurl.h" | - |
46 | #include "private/qhttpnetworkreply_p.h" | - |
47 | #include "qelapsedtimer.h" | - |
48 | #include "qnetworkinterface.h" | - |
49 | | - |
50 | #if !defined(QT_NO_NETWORKPROXY) && !defined(QT_NO_HTTP) | - |
51 | #include <qdebug.h> | - |
52 | | - |
53 | QT_BEGIN_NAMESPACE | - |
54 | | - |
55 | #define DEBUG | - |
56 | | - |
57 | QHttpSocketEngine::QHttpSocketEngine(QObject *parent) | - |
58 | : QAbstractSocketEngine(*new QHttpSocketEnginePrivate, parent) | - |
59 | { | - |
60 | } executed: } Execution Count:17 | 17 |
61 | | - |
62 | QHttpSocketEngine::~QHttpSocketEngine() | - |
63 | { | - |
64 | } | - |
65 | | - |
66 | bool QHttpSocketEngine::initialize(QAbstractSocket::SocketType type, QAbstractSocket::NetworkLayerProtocol protocol) | - |
67 | { | - |
68 | Q_D(QHttpSocketEngine); executed (the execution status of this line is deduced): QHttpSocketEnginePrivate * const d = d_func(); | - |
69 | if (type != QAbstractSocket::TcpSocket) partially evaluated: type != QAbstractSocket::TcpSocket no Evaluation Count:0 | yes Evaluation Count:17 |
| 0-17 |
70 | return false; never executed: return false; | 0 |
71 | | - |
72 | setProtocol(protocol); executed (the execution status of this line is deduced): setProtocol(protocol); | - |
73 | setSocketType(type); executed (the execution status of this line is deduced): setSocketType(type); | - |
74 | d->socket = new QTcpSocket(this); executed (the execution status of this line is deduced): d->socket = new QTcpSocket(this); | - |
75 | d->reply = new QHttpNetworkReply(QUrl(), this); executed (the execution status of this line is deduced): d->reply = new QHttpNetworkReply(QUrl(), this); | - |
76 | #ifndef QT_NO_BEARERMANAGEMENT | - |
77 | d->socket->setProperty("_q_networkSession", property("_q_networkSession")); executed (the execution status of this line is deduced): d->socket->setProperty("_q_networkSession", property("_q_networkSession")); | - |
78 | #endif | - |
79 | | - |
80 | // Explicitly disable proxying on the proxy socket itself to avoid | - |
81 | // unwanted recursion. | - |
82 | d->socket->setProxy(QNetworkProxy::NoProxy); executed (the execution status of this line is deduced): d->socket->setProxy(QNetworkProxy::NoProxy); | - |
83 | | - |
84 | // Intercept all the signals. | - |
85 | connect(d->socket, SIGNAL(connected()), executed (the execution status of this line is deduced): connect(d->socket, "2""connected()", | - |
86 | this, SLOT(slotSocketConnected()), executed (the execution status of this line is deduced): this, "1""slotSocketConnected()", | - |
87 | Qt::DirectConnection); executed (the execution status of this line is deduced): Qt::DirectConnection); | - |
88 | connect(d->socket, SIGNAL(disconnected()), executed (the execution status of this line is deduced): connect(d->socket, "2""disconnected()", | - |
89 | this, SLOT(slotSocketDisconnected()), executed (the execution status of this line is deduced): this, "1""slotSocketDisconnected()", | - |
90 | Qt::DirectConnection); executed (the execution status of this line is deduced): Qt::DirectConnection); | - |
91 | connect(d->socket, SIGNAL(readyRead()), executed (the execution status of this line is deduced): connect(d->socket, "2""readyRead()", | - |
92 | this, SLOT(slotSocketReadNotification()), executed (the execution status of this line is deduced): this, "1""slotSocketReadNotification()", | - |
93 | Qt::DirectConnection); executed (the execution status of this line is deduced): Qt::DirectConnection); | - |
94 | connect(d->socket, SIGNAL(bytesWritten(qint64)), executed (the execution status of this line is deduced): connect(d->socket, "2""bytesWritten(qint64)", | - |
95 | this, SLOT(slotSocketBytesWritten()), executed (the execution status of this line is deduced): this, "1""slotSocketBytesWritten()", | - |
96 | Qt::DirectConnection); executed (the execution status of this line is deduced): Qt::DirectConnection); | - |
97 | connect(d->socket, SIGNAL(error(QAbstractSocket::SocketError)), executed (the execution status of this line is deduced): connect(d->socket, "2""error(QAbstractSocket::SocketError)", | - |
98 | this, SLOT(slotSocketError(QAbstractSocket::SocketError)), executed (the execution status of this line is deduced): this, "1""slotSocketError(QAbstractSocket::SocketError)", | - |
99 | Qt::DirectConnection); executed (the execution status of this line is deduced): Qt::DirectConnection); | - |
100 | connect(d->socket, SIGNAL(stateChanged(QAbstractSocket::SocketState)), executed (the execution status of this line is deduced): connect(d->socket, "2""stateChanged(QAbstractSocket::SocketState)", | - |
101 | this, SLOT(slotSocketStateChanged(QAbstractSocket::SocketState)), executed (the execution status of this line is deduced): this, "1""slotSocketStateChanged(QAbstractSocket::SocketState)", | - |
102 | Qt::DirectConnection); executed (the execution status of this line is deduced): Qt::DirectConnection); | - |
103 | | - |
104 | return true; executed: return true; Execution Count:17 | 17 |
105 | } | - |
106 | | - |
107 | bool QHttpSocketEngine::initialize(qintptr, QAbstractSocket::SocketState) | - |
108 | { | - |
109 | return false; never executed: return false; | 0 |
110 | } | - |
111 | | - |
112 | void QHttpSocketEngine::setProxy(const QNetworkProxy &proxy) | - |
113 | { | - |
114 | Q_D(QHttpSocketEngine); executed (the execution status of this line is deduced): QHttpSocketEnginePrivate * const d = d_func(); | - |
115 | d->proxy = proxy; executed (the execution status of this line is deduced): d->proxy = proxy; | - |
116 | QString user = proxy.user(); executed (the execution status of this line is deduced): QString user = proxy.user(); | - |
117 | if (!user.isEmpty()) partially evaluated: !user.isEmpty() no Evaluation Count:0 | yes Evaluation Count:17 |
| 0-17 |
118 | d->authenticator.setUser(user); never executed: d->authenticator.setUser(user); | 0 |
119 | QString password = proxy.password(); executed (the execution status of this line is deduced): QString password = proxy.password(); | - |
120 | if (!password.isEmpty()) partially evaluated: !password.isEmpty() no Evaluation Count:0 | yes Evaluation Count:17 |
| 0-17 |
121 | d->authenticator.setPassword(password); never executed: d->authenticator.setPassword(password); | 0 |
122 | } executed: } Execution Count:17 | 17 |
123 | | - |
124 | qintptr QHttpSocketEngine::socketDescriptor() const | - |
125 | { | - |
126 | Q_D(const QHttpSocketEngine); executed (the execution status of this line is deduced): const QHttpSocketEnginePrivate * const d = d_func(); | - |
127 | return d->socket ? d->socket->socketDescriptor() : 0; executed: return d->socket ? d->socket->socketDescriptor() : 0; Execution Count:32 | 32 |
128 | } | - |
129 | | - |
130 | bool QHttpSocketEngine::isValid() const | - |
131 | { | - |
132 | Q_D(const QHttpSocketEngine); executed (the execution status of this line is deduced): const QHttpSocketEnginePrivate * const d = d_func(); | - |
133 | return d->socket; executed: return d->socket; Execution Count:368 | 368 |
134 | } | - |
135 | | - |
136 | bool QHttpSocketEngine::connectInternal() | - |
137 | { | - |
138 | Q_D(QHttpSocketEngine); executed (the execution status of this line is deduced): QHttpSocketEnginePrivate * const d = d_func(); | - |
139 | | - |
140 | d->credentialsSent = false; executed (the execution status of this line is deduced): d->credentialsSent = false; | - |
141 | | - |
142 | // If the handshake is done, enter ConnectedState state and return true. | - |
143 | if (d->state == Connected) { partially evaluated: d->state == Connected no Evaluation Count:0 | yes Evaluation Count:17 |
| 0-17 |
144 | qWarning("QHttpSocketEngine::connectToHost: called when already connected"); never executed (the execution status of this line is deduced): QMessageLogger("socket/qhttpsocketengine.cpp", 144, __PRETTY_FUNCTION__).warning("QHttpSocketEngine::connectToHost: called when already connected"); | - |
145 | setState(QAbstractSocket::ConnectedState); never executed (the execution status of this line is deduced): setState(QAbstractSocket::ConnectedState); | - |
146 | return true; never executed: return true; | 0 |
147 | } | - |
148 | | - |
149 | if (d->state == ConnectSent && d->socketState != QAbstractSocket::ConnectedState) partially evaluated: d->state == ConnectSent no Evaluation Count:0 | yes Evaluation Count:17 |
never evaluated: d->socketState != QAbstractSocket::ConnectedState | 0-17 |
150 | setState(QAbstractSocket::UnconnectedState); never executed: setState(QAbstractSocket::UnconnectedState); | 0 |
151 | | - |
152 | // Handshake isn't done. If unconnected, start connecting. | - |
153 | if (d->state == None && d->socket->state() == QAbstractSocket::UnconnectedState) { partially evaluated: d->state == None yes Evaluation Count:17 | no Evaluation Count:0 |
partially evaluated: d->socket->state() == QAbstractSocket::UnconnectedState yes Evaluation Count:17 | no Evaluation Count:0 |
| 0-17 |
154 | setState(QAbstractSocket::ConnectingState); executed (the execution status of this line is deduced): setState(QAbstractSocket::ConnectingState); | - |
155 | //limit buffer in internal socket, data is buffered in the external socket under application control | - |
156 | d->socket->setReadBufferSize(65536); executed (the execution status of this line is deduced): d->socket->setReadBufferSize(65536); | - |
157 | d->socket->connectToHost(d->proxy.hostName(), d->proxy.port()); executed (the execution status of this line is deduced): d->socket->connectToHost(d->proxy.hostName(), d->proxy.port()); | - |
158 | } executed: } Execution Count:17 | 17 |
159 | | - |
160 | // If connected (might happen right away, at least for localhost services | - |
161 | // on some BSD systems), there might already be bytes available. | - |
162 | if (bytesAvailable()) partially evaluated: bytesAvailable() no Evaluation Count:0 | yes Evaluation Count:17 |
| 0-17 |
163 | slotSocketReadNotification(); never executed: slotSocketReadNotification(); | 0 |
164 | | - |
165 | return d->socketState == QAbstractSocket::ConnectedState; executed: return d->socketState == QAbstractSocket::ConnectedState; Execution Count:17 | 17 |
166 | } | - |
167 | | - |
168 | bool QHttpSocketEngine::connectToHost(const QHostAddress &address, quint16 port) | - |
169 | { | - |
170 | Q_D(QHttpSocketEngine); executed (the execution status of this line is deduced): QHttpSocketEnginePrivate * const d = d_func(); | - |
171 | | - |
172 | setPeerAddress(address); executed (the execution status of this line is deduced): setPeerAddress(address); | - |
173 | setPeerPort(port); executed (the execution status of this line is deduced): setPeerPort(port); | - |
174 | d->peerName.clear(); executed (the execution status of this line is deduced): d->peerName.clear(); | - |
175 | | - |
176 | return connectInternal(); executed: return connectInternal(); Execution Count:6 | 6 |
177 | } | - |
178 | | - |
179 | bool QHttpSocketEngine::connectToHostByName(const QString &hostname, quint16 port) | - |
180 | { | - |
181 | Q_D(QHttpSocketEngine); executed (the execution status of this line is deduced): QHttpSocketEnginePrivate * const d = d_func(); | - |
182 | | - |
183 | setPeerAddress(QHostAddress()); executed (the execution status of this line is deduced): setPeerAddress(QHostAddress()); | - |
184 | setPeerPort(port); executed (the execution status of this line is deduced): setPeerPort(port); | - |
185 | d->peerName = hostname; executed (the execution status of this line is deduced): d->peerName = hostname; | - |
186 | | - |
187 | return connectInternal(); executed: return connectInternal(); Execution Count:11 | 11 |
188 | } | - |
189 | | - |
190 | bool QHttpSocketEngine::bind(const QHostAddress &, quint16) | - |
191 | { | - |
192 | return false; never executed: return false; | 0 |
193 | } | - |
194 | | - |
195 | bool QHttpSocketEngine::listen() | - |
196 | { | - |
197 | return false; never executed: return false; | 0 |
198 | } | - |
199 | | - |
200 | int QHttpSocketEngine::accept() | - |
201 | { | - |
202 | return 0; never executed: return 0; | 0 |
203 | } | - |
204 | | - |
205 | void QHttpSocketEngine::close() | - |
206 | { | - |
207 | Q_D(QHttpSocketEngine); executed (the execution status of this line is deduced): QHttpSocketEnginePrivate * const d = d_func(); | - |
208 | if (d->socket) { partially evaluated: d->socket yes Evaluation Count:17 | no Evaluation Count:0 |
| 0-17 |
209 | d->socket->close(); executed (the execution status of this line is deduced): d->socket->close(); | - |
210 | delete d->socket; executed (the execution status of this line is deduced): delete d->socket; | - |
211 | d->socket = 0; executed (the execution status of this line is deduced): d->socket = 0; | - |
212 | } executed: } Execution Count:17 | 17 |
213 | } executed: } Execution Count:17 | 17 |
214 | | - |
215 | qint64 QHttpSocketEngine::bytesAvailable() const | - |
216 | { | - |
217 | Q_D(const QHttpSocketEngine); executed (the execution status of this line is deduced): const QHttpSocketEnginePrivate * const d = d_func(); | - |
218 | return d->socket ? d->socket->bytesAvailable() : 0; executed: return d->socket ? d->socket->bytesAvailable() : 0; Execution Count:108 | 108 |
219 | } | - |
220 | | - |
221 | qint64 QHttpSocketEngine::read(char *data, qint64 maxlen) | - |
222 | { | - |
223 | Q_D(QHttpSocketEngine); executed (the execution status of this line is deduced): QHttpSocketEnginePrivate * const d = d_func(); | - |
224 | qint64 bytesRead = d->socket->read(data, maxlen); executed (the execution status of this line is deduced): qint64 bytesRead = d->socket->read(data, maxlen); | - |
225 | | - |
226 | if (d->socket->state() == QAbstractSocket::UnconnectedState partially evaluated: d->socket->state() == QAbstractSocket::UnconnectedState no Evaluation Count:0 | yes Evaluation Count:55 |
| 0-55 |
227 | && d->socket->bytesAvailable() == 0) { never evaluated: d->socket->bytesAvailable() == 0 | 0 |
228 | emitReadNotification(); never executed (the execution status of this line is deduced): emitReadNotification(); | - |
229 | } | 0 |
230 | | - |
231 | if (bytesRead == -1) { partially evaluated: bytesRead == -1 no Evaluation Count:0 | yes Evaluation Count:55 |
| 0-55 |
232 | // If nothing has been read so far, and the direct socket read | - |
233 | // failed, return the socket's error. Otherwise, fall through and | - |
234 | // return as much as we read so far. | - |
235 | close(); never executed (the execution status of this line is deduced): close(); | - |
236 | setError(QAbstractSocket::RemoteHostClosedError, never executed (the execution status of this line is deduced): setError(QAbstractSocket::RemoteHostClosedError, | - |
237 | QLatin1String("Remote host closed")); never executed (the execution status of this line is deduced): QLatin1String("Remote host closed")); | - |
238 | setState(QAbstractSocket::UnconnectedState); never executed (the execution status of this line is deduced): setState(QAbstractSocket::UnconnectedState); | - |
239 | return -1; never executed: return -1; | 0 |
240 | } | - |
241 | return bytesRead; executed: return bytesRead; Execution Count:55 | 55 |
242 | } | - |
243 | | - |
244 | qint64 QHttpSocketEngine::write(const char *data, qint64 len) | - |
245 | { | - |
246 | Q_D(QHttpSocketEngine); executed (the execution status of this line is deduced): QHttpSocketEnginePrivate * const d = d_func(); | - |
247 | return d->socket->write(data, len); executed: return d->socket->write(data, len); Execution Count:58 | 58 |
248 | } | - |
249 | | - |
250 | #ifndef QT_NO_UDPSOCKET | - |
251 | #ifndef QT_NO_NETWORKINTERFACE | - |
252 | bool QHttpSocketEngine::joinMulticastGroup(const QHostAddress &, | - |
253 | const QNetworkInterface &) | - |
254 | { | - |
255 | setError(QAbstractSocket::UnsupportedSocketOperationError, never executed (the execution status of this line is deduced): setError(QAbstractSocket::UnsupportedSocketOperationError, | - |
256 | QLatin1String("Operation on socket is not supported")); never executed (the execution status of this line is deduced): QLatin1String("Operation on socket is not supported")); | - |
257 | return false; never executed: return false; | 0 |
258 | } | - |
259 | | - |
260 | bool QHttpSocketEngine::leaveMulticastGroup(const QHostAddress &, | - |
261 | const QNetworkInterface &) | - |
262 | { | - |
263 | setError(QAbstractSocket::UnsupportedSocketOperationError, never executed (the execution status of this line is deduced): setError(QAbstractSocket::UnsupportedSocketOperationError, | - |
264 | QLatin1String("Operation on socket is not supported")); never executed (the execution status of this line is deduced): QLatin1String("Operation on socket is not supported")); | - |
265 | return false; never executed: return false; | 0 |
266 | } | - |
267 | | - |
268 | QNetworkInterface QHttpSocketEngine::multicastInterface() const | - |
269 | { | - |
270 | return QNetworkInterface(); never executed: return QNetworkInterface(); | 0 |
271 | } | - |
272 | | - |
273 | bool QHttpSocketEngine::setMulticastInterface(const QNetworkInterface &) | - |
274 | { | - |
275 | setError(QAbstractSocket::UnsupportedSocketOperationError, never executed (the execution status of this line is deduced): setError(QAbstractSocket::UnsupportedSocketOperationError, | - |
276 | QLatin1String("Operation on socket is not supported")); never executed (the execution status of this line is deduced): QLatin1String("Operation on socket is not supported")); | - |
277 | return false; never executed: return false; | 0 |
278 | } | - |
279 | #endif // QT_NO_NETWORKINTERFACE | - |
280 | | - |
281 | qint64 QHttpSocketEngine::readDatagram(char *, qint64, QHostAddress *, | - |
282 | quint16 *) | - |
283 | { | - |
284 | return 0; never executed: return 0; | 0 |
285 | } | - |
286 | | - |
287 | qint64 QHttpSocketEngine::writeDatagram(const char *, qint64, const QHostAddress &, | - |
288 | quint16) | - |
289 | { | - |
290 | return 0; never executed: return 0; | 0 |
291 | } | - |
292 | | - |
293 | bool QHttpSocketEngine::hasPendingDatagrams() const | - |
294 | { | - |
295 | return false; never executed: return false; | 0 |
296 | } | - |
297 | | - |
298 | qint64 QHttpSocketEngine::pendingDatagramSize() const | - |
299 | { | - |
300 | return 0; never executed: return 0; | 0 |
301 | } | - |
302 | #endif // QT_NO_UDPSOCKET | - |
303 | | - |
304 | qint64 QHttpSocketEngine::bytesToWrite() const | - |
305 | { | - |
306 | Q_D(const QHttpSocketEngine); executed (the execution status of this line is deduced): const QHttpSocketEnginePrivate * const d = d_func(); | - |
307 | if (d->socket) { partially evaluated: d->socket yes Evaluation Count:192 | no Evaluation Count:0 |
| 0-192 |
308 | return d->socket->bytesToWrite(); executed: return d->socket->bytesToWrite(); Execution Count:192 | 192 |
309 | } else { | - |
310 | return 0; never executed: return 0; | 0 |
311 | } | - |
312 | } | - |
313 | | - |
314 | int QHttpSocketEngine::option(SocketOption option) const | - |
315 | { | - |
316 | Q_D(const QHttpSocketEngine); never executed (the execution status of this line is deduced): const QHttpSocketEnginePrivate * const d = d_func(); | - |
317 | if (d->socket) { never evaluated: d->socket | 0 |
318 | // convert the enum and call the real socket | - |
319 | if (option == QAbstractSocketEngine::LowDelayOption) never evaluated: option == QAbstractSocketEngine::LowDelayOption | 0 |
320 | return d->socket->socketOption(QAbstractSocket::LowDelayOption).toInt(); never executed: return d->socket->socketOption(QAbstractSocket::LowDelayOption).toInt(); | 0 |
321 | if (option == QAbstractSocketEngine::KeepAliveOption) never evaluated: option == QAbstractSocketEngine::KeepAliveOption | 0 |
322 | return d->socket->socketOption(QAbstractSocket::KeepAliveOption).toInt(); never executed: return d->socket->socketOption(QAbstractSocket::KeepAliveOption).toInt(); | 0 |
323 | } | 0 |
324 | return -1; never executed: return -1; | 0 |
325 | } | - |
326 | | - |
327 | bool QHttpSocketEngine::setOption(SocketOption option, int value) | - |
328 | { | - |
329 | Q_D(QHttpSocketEngine); executed (the execution status of this line is deduced): QHttpSocketEnginePrivate * const d = d_func(); | - |
330 | if (d->socket) { partially evaluated: d->socket yes Evaluation Count:15 | no Evaluation Count:0 |
| 0-15 |
331 | // convert the enum and call the real socket | - |
332 | if (option == QAbstractSocketEngine::LowDelayOption) partially evaluated: option == QAbstractSocketEngine::LowDelayOption no Evaluation Count:0 | yes Evaluation Count:15 |
| 0-15 |
333 | d->socket->setSocketOption(QAbstractSocket::LowDelayOption, value); never executed: d->socket->setSocketOption(QAbstractSocket::LowDelayOption, value); | 0 |
334 | if (option == QAbstractSocketEngine::KeepAliveOption) partially evaluated: option == QAbstractSocketEngine::KeepAliveOption yes Evaluation Count:15 | no Evaluation Count:0 |
| 0-15 |
335 | d->socket->setSocketOption(QAbstractSocket::KeepAliveOption, value); executed: d->socket->setSocketOption(QAbstractSocket::KeepAliveOption, value); Execution Count:15 | 15 |
336 | return true; executed: return true; Execution Count:15 | 15 |
337 | } | - |
338 | return false; never executed: return false; | 0 |
339 | } | - |
340 | | - |
341 | /* | - |
342 | Returns the difference between msecs and elapsed. If msecs is -1, | - |
343 | however, -1 is returned. | - |
344 | */ | - |
345 | static int qt_timeout_value(int msecs, int elapsed) | - |
346 | { | - |
347 | if (msecs == -1) never evaluated: msecs == -1 | 0 |
348 | return -1; never executed: return -1; | 0 |
349 | | - |
350 | int timeout = msecs - elapsed; never executed (the execution status of this line is deduced): int timeout = msecs - elapsed; | - |
351 | return timeout < 0 ? 0 : timeout; never executed: return timeout < 0 ? 0 : timeout; | 0 |
352 | } | - |
353 | | - |
354 | bool QHttpSocketEngine::waitForRead(int msecs, bool *timedOut) | - |
355 | { | - |
356 | Q_D(const QHttpSocketEngine); never executed (the execution status of this line is deduced): const QHttpSocketEnginePrivate * const d = d_func(); | - |
357 | | - |
358 | if (!d->socket || d->socket->state() == QAbstractSocket::UnconnectedState) never evaluated: !d->socket never evaluated: d->socket->state() == QAbstractSocket::UnconnectedState | 0 |
359 | return false; never executed: return false; | 0 |
360 | | - |
361 | QElapsedTimer stopWatch; never executed (the execution status of this line is deduced): QElapsedTimer stopWatch; | - |
362 | stopWatch.start(); never executed (the execution status of this line is deduced): stopWatch.start(); | - |
363 | | - |
364 | // Wait for more data if nothing is available. | - |
365 | if (!d->socket->bytesAvailable()) { never evaluated: !d->socket->bytesAvailable() | 0 |
366 | if (!d->socket->waitForReadyRead(qt_timeout_value(msecs, stopWatch.elapsed()))) { never evaluated: !d->socket->waitForReadyRead(qt_timeout_value(msecs, stopWatch.elapsed())) | 0 |
367 | if (d->socket->state() == QAbstractSocket::UnconnectedState) never evaluated: d->socket->state() == QAbstractSocket::UnconnectedState | 0 |
368 | return true; never executed: return true; | 0 |
369 | setError(d->socket->error(), d->socket->errorString()); never executed (the execution status of this line is deduced): setError(d->socket->error(), d->socket->errorString()); | - |
370 | if (timedOut && d->socket->error() == QAbstractSocket::SocketTimeoutError) never evaluated: timedOut never evaluated: d->socket->error() == QAbstractSocket::SocketTimeoutError | 0 |
371 | *timedOut = true; never executed: *timedOut = true; | 0 |
372 | return false; never executed: return false; | 0 |
373 | } | - |
374 | } | 0 |
375 | | - |
376 | // If we're not connected yet, wait until we are, or until an error | - |
377 | // occurs. | - |
378 | while (d->state != Connected && d->socket->waitForReadyRead(qt_timeout_value(msecs, stopWatch.elapsed()))) { never evaluated: d->state != Connected never evaluated: d->socket->waitForReadyRead(qt_timeout_value(msecs, stopWatch.elapsed())) | 0 |
379 | // Loop while the protocol handshake is taking place. | - |
380 | } | 0 |
381 | | - |
382 | // Report any error that may occur. | - |
383 | if (d->state != Connected) { never evaluated: d->state != Connected | 0 |
384 | setError(d->socket->error(), d->socket->errorString()); never executed (the execution status of this line is deduced): setError(d->socket->error(), d->socket->errorString()); | - |
385 | if (timedOut && d->socket->error() == QAbstractSocket::SocketTimeoutError) never evaluated: timedOut never evaluated: d->socket->error() == QAbstractSocket::SocketTimeoutError | 0 |
386 | *timedOut = true; never executed: *timedOut = true; | 0 |
387 | return false; never executed: return false; | 0 |
388 | } | - |
389 | return true; never executed: return true; | 0 |
390 | } | - |
391 | | - |
392 | bool QHttpSocketEngine::waitForWrite(int msecs, bool *timedOut) | - |
393 | { | - |
394 | Q_D(const QHttpSocketEngine); never executed (the execution status of this line is deduced): const QHttpSocketEnginePrivate * const d = d_func(); | - |
395 | | - |
396 | // If we're connected, just forward the call. | - |
397 | if (d->state == Connected) { never evaluated: d->state == Connected | 0 |
398 | if (d->socket->bytesToWrite()) { never evaluated: d->socket->bytesToWrite() | 0 |
399 | if (!d->socket->waitForBytesWritten(msecs)) { never evaluated: !d->socket->waitForBytesWritten(msecs) | 0 |
400 | if (d->socket->error() == QAbstractSocket::SocketTimeoutError && timedOut) never evaluated: d->socket->error() == QAbstractSocket::SocketTimeoutError never evaluated: timedOut | 0 |
401 | *timedOut = true; never executed: *timedOut = true; | 0 |
402 | return false; never executed: return false; | 0 |
403 | } | - |
404 | } | 0 |
405 | return true; never executed: return true; | 0 |
406 | } | - |
407 | | - |
408 | QElapsedTimer stopWatch; never executed (the execution status of this line is deduced): QElapsedTimer stopWatch; | - |
409 | stopWatch.start(); never executed (the execution status of this line is deduced): stopWatch.start(); | - |
410 | | - |
411 | // If we're not connected yet, wait until we are, and until bytes have | - |
412 | // been received (i.e., the socket has connected, we have sent the | - |
413 | // greeting, and then received the response). | - |
414 | while (d->state != Connected && d->socket->waitForReadyRead(qt_timeout_value(msecs, stopWatch.elapsed()))) { never evaluated: d->state != Connected never evaluated: d->socket->waitForReadyRead(qt_timeout_value(msecs, stopWatch.elapsed())) | 0 |
415 | // Loop while the protocol handshake is taking place. | - |
416 | } | 0 |
417 | | - |
418 | // Report any error that may occur. | - |
419 | if (d->state != Connected) { never evaluated: d->state != Connected | 0 |
420 | // setError(d->socket->error(), d->socket->errorString()); | - |
421 | if (timedOut && d->socket->error() == QAbstractSocket::SocketTimeoutError) never evaluated: timedOut never evaluated: d->socket->error() == QAbstractSocket::SocketTimeoutError | 0 |
422 | *timedOut = true; never executed: *timedOut = true; | 0 |
423 | } | 0 |
424 | | - |
425 | return true; never executed: return true; | 0 |
426 | } | - |
427 | | - |
428 | bool QHttpSocketEngine::waitForReadOrWrite(bool *readyToRead, bool *readyToWrite, | - |
429 | bool checkRead, bool checkWrite, | - |
430 | int msecs, bool *timedOut) | - |
431 | { | - |
432 | Q_UNUSED(checkRead); never executed (the execution status of this line is deduced): (void)checkRead;; | - |
433 | | - |
434 | if (!checkWrite) { never evaluated: !checkWrite | 0 |
435 | // Not interested in writing? Then we wait for read notifications. | - |
436 | bool canRead = waitForRead(msecs, timedOut); never executed (the execution status of this line is deduced): bool canRead = waitForRead(msecs, timedOut); | - |
437 | if (readyToRead) never evaluated: readyToRead | 0 |
438 | *readyToRead = canRead; never executed: *readyToRead = canRead; | 0 |
439 | return canRead; never executed: return canRead; | 0 |
440 | } | - |
441 | | - |
442 | // Interested in writing? Then we wait for write notifications. | - |
443 | bool canWrite = waitForWrite(msecs, timedOut); never executed (the execution status of this line is deduced): bool canWrite = waitForWrite(msecs, timedOut); | - |
444 | if (readyToWrite) never evaluated: readyToWrite | 0 |
445 | *readyToWrite = canWrite; never executed: *readyToWrite = canWrite; | 0 |
446 | return canWrite; never executed: return canWrite; | 0 |
447 | } | - |
448 | | - |
449 | bool QHttpSocketEngine::isReadNotificationEnabled() const | - |
450 | { | - |
451 | Q_D(const QHttpSocketEngine); executed (the execution status of this line is deduced): const QHttpSocketEnginePrivate * const d = d_func(); | - |
452 | return d->readNotificationEnabled; executed: return d->readNotificationEnabled; Execution Count:141 | 141 |
453 | } | - |
454 | | - |
455 | void QHttpSocketEngine::setReadNotificationEnabled(bool enable) | - |
456 | { | - |
457 | Q_D(QHttpSocketEngine); executed (the execution status of this line is deduced): QHttpSocketEnginePrivate * const d = d_func(); | - |
458 | if (d->readNotificationEnabled == enable) evaluated: d->readNotificationEnabled == enable yes Evaluation Count:20 | yes Evaluation Count:72 |
| 20-72 |
459 | return; executed: return; Execution Count:20 | 20 |
460 | | - |
461 | d->readNotificationEnabled = enable; executed (the execution status of this line is deduced): d->readNotificationEnabled = enable; | - |
462 | if (enable) { evaluated: enable yes Evaluation Count:36 | yes Evaluation Count:36 |
| 36 |
463 | // Enabling read notification can trigger a notification. | - |
464 | if (bytesAvailable()) partially evaluated: bytesAvailable() no Evaluation Count:0 | yes Evaluation Count:36 |
| 0-36 |
465 | slotSocketReadNotification(); never executed: slotSocketReadNotification(); | 0 |
466 | } executed: } Execution Count:36 | 36 |
467 | } executed: } Execution Count:72 | 72 |
468 | | - |
469 | bool QHttpSocketEngine::isWriteNotificationEnabled() const | - |
470 | { | - |
471 | Q_D(const QHttpSocketEngine); executed (the execution status of this line is deduced): const QHttpSocketEnginePrivate * const d = d_func(); | - |
472 | return d->writeNotificationEnabled; executed: return d->writeNotificationEnabled; Execution Count:83 | 83 |
473 | } | - |
474 | | - |
475 | void QHttpSocketEngine::setWriteNotificationEnabled(bool enable) | - |
476 | { | - |
477 | Q_D(QHttpSocketEngine); executed (the execution status of this line is deduced): QHttpSocketEnginePrivate * const d = d_func(); | - |
478 | d->writeNotificationEnabled = enable; executed (the execution status of this line is deduced): d->writeNotificationEnabled = enable; | - |
479 | if (enable && d->state == Connected && d->socket->state() == QAbstractSocket::ConnectedState) evaluated: enable yes Evaluation Count:62 | yes Evaluation Count:97 |
evaluated: d->state == Connected yes Evaluation Count:56 | yes Evaluation Count:6 |
partially evaluated: d->socket->state() == QAbstractSocket::ConnectedState yes Evaluation Count:56 | no Evaluation Count:0 |
| 0-97 |
480 | QMetaObject::invokeMethod(this, "writeNotification", Qt::QueuedConnection); executed: QMetaObject::invokeMethod(this, "writeNotification", Qt::QueuedConnection); Execution Count:56 | 56 |
481 | } executed: } Execution Count:159 | 159 |
482 | | - |
483 | bool QHttpSocketEngine::isExceptionNotificationEnabled() const | - |
484 | { | - |
485 | Q_D(const QHttpSocketEngine); executed (the execution status of this line is deduced): const QHttpSocketEnginePrivate * const d = d_func(); | - |
486 | return d->exceptNotificationEnabled; executed: return d->exceptNotificationEnabled; Execution Count:31 | 31 |
487 | } | - |
488 | | - |
489 | void QHttpSocketEngine::setExceptionNotificationEnabled(bool enable) | - |
490 | { | - |
491 | Q_D(QHttpSocketEngine); executed (the execution status of this line is deduced): QHttpSocketEnginePrivate * const d = d_func(); | - |
492 | d->exceptNotificationEnabled = enable; executed (the execution status of this line is deduced): d->exceptNotificationEnabled = enable; | - |
493 | } executed: } Execution Count:62 | 62 |
494 | | - |
495 | void QHttpSocketEngine::slotSocketConnected() | - |
496 | { | - |
497 | Q_D(QHttpSocketEngine); executed (the execution status of this line is deduced): QHttpSocketEnginePrivate * const d = d_func(); | - |
498 | | - |
499 | // Send the greeting. | - |
500 | const char method[] = "CONNECT "; executed (the execution status of this line is deduced): const char method[] = "CONNECT "; | - |
501 | QByteArray peerAddress = d->peerName.isEmpty() ? evaluated: d->peerName.isEmpty() yes Evaluation Count:6 | yes Evaluation Count:19 |
| 6-19 |
502 | d->peerAddress.toString().toLatin1() : executed (the execution status of this line is deduced): d->peerAddress.toString().toLatin1() : | - |
503 | QUrl::toAce(d->peerName); executed (the execution status of this line is deduced): QUrl::toAce(d->peerName); | - |
504 | QByteArray path = peerAddress + ':' + QByteArray::number(d->peerPort); executed (the execution status of this line is deduced): QByteArray path = peerAddress + ':' + QByteArray::number(d->peerPort); | - |
505 | QByteArray data = method; executed (the execution status of this line is deduced): QByteArray data = method; | - |
506 | data += path; executed (the execution status of this line is deduced): data += path; | - |
507 | data += " HTTP/1.1\r\n"; executed (the execution status of this line is deduced): data += " HTTP/1.1\r\n"; | - |
508 | data += "Proxy-Connection: keep-alive\r\n"; executed (the execution status of this line is deduced): data += "Proxy-Connection: keep-alive\r\n"; | - |
509 | data += "Host: " + peerAddress + "\r\n"; executed (the execution status of this line is deduced): data += "Host: " + peerAddress + "\r\n"; | - |
510 | if (!d->proxy.hasRawHeader("User-Agent")) evaluated: !d->proxy.hasRawHeader("User-Agent") yes Evaluation Count:13 | yes Evaluation Count:12 |
| 12-13 |
511 | data += "User-Agent: Mozilla/5.0\r\n"; executed: data += "User-Agent: Mozilla/5.0\r\n"; Execution Count:13 | 13 |
512 | foreach (const QByteArray &header, d->proxy.rawHeaderList()) { executed (the execution status of this line is deduced): for (QForeachContainer<__typeof__(d->proxy.rawHeaderList())> _container_(d->proxy.rawHeaderList()); !_container_.brk && _container_.i != _container_.e; __extension__ ({ ++_container_.brk; ++_container_.i; })) for (const QByteArray &header = *_container_.i;; __extension__ ({--_container_.brk; break;})) { | - |
513 | data += header + ": " + d->proxy.rawHeader(header) + "\r\n"; executed (the execution status of this line is deduced): data += header + ": " + d->proxy.rawHeader(header) + "\r\n"; | - |
514 | } executed: } Execution Count:12 | 12 |
515 | QAuthenticatorPrivate *priv = QAuthenticatorPrivate::getPrivate(d->authenticator); executed (the execution status of this line is deduced): QAuthenticatorPrivate *priv = QAuthenticatorPrivate::getPrivate(d->authenticator); | - |
516 | //qDebug() << "slotSocketConnected: priv=" << priv << (priv ? (int)priv->method : -1); | - |
517 | if (priv && priv->method != QAuthenticatorPrivate::None) { evaluated: priv yes Evaluation Count:8 | yes Evaluation Count:17 |
partially evaluated: priv->method != QAuthenticatorPrivate::None yes Evaluation Count:8 | no Evaluation Count:0 |
| 0-17 |
518 | d->credentialsSent = true; executed (the execution status of this line is deduced): d->credentialsSent = true; | - |
519 | data += "Proxy-Authorization: " + priv->calculateResponse(method, path); executed (the execution status of this line is deduced): data += "Proxy-Authorization: " + priv->calculateResponse(method, path); | - |
520 | data += "\r\n"; executed (the execution status of this line is deduced): data += "\r\n"; | - |
521 | } executed: } Execution Count:8 | 8 |
522 | data += "\r\n"; executed (the execution status of this line is deduced): data += "\r\n"; | - |
523 | // qDebug() << ">>>>>>>> sending request" << this; | - |
524 | // qDebug() << data; | - |
525 | // qDebug() << ">>>>>>>"; | - |
526 | d->socket->write(data); executed (the execution status of this line is deduced): d->socket->write(data); | - |
527 | d->state = ConnectSent; executed (the execution status of this line is deduced): d->state = ConnectSent; | - |
528 | } executed: } Execution Count:25 | 25 |
529 | | - |
530 | void QHttpSocketEngine::slotSocketDisconnected() | - |
531 | { | - |
532 | } | - |
533 | | - |
534 | void QHttpSocketEngine::slotSocketReadNotification() | - |
535 | { | - |
536 | Q_D(QHttpSocketEngine); executed (the execution status of this line is deduced): QHttpSocketEnginePrivate * const d = d_func(); | - |
537 | if (d->state != Connected && d->socket->bytesAvailable() == 0) evaluated: d->state != Connected yes Evaluation Count:25 | yes Evaluation Count:55 |
partially evaluated: d->socket->bytesAvailable() == 0 no Evaluation Count:0 | yes Evaluation Count:25 |
| 0-55 |
538 | return; | 0 |
539 | | - |
540 | if (d->state == Connected) { evaluated: d->state == Connected yes Evaluation Count:55 | yes Evaluation Count:25 |
| 25-55 |
541 | // Forward as a read notification. | - |
542 | if (d->readNotificationEnabled) partially evaluated: d->readNotificationEnabled yes Evaluation Count:55 | no Evaluation Count:0 |
| 0-55 |
543 | emitReadNotification(); executed: emitReadNotification(); Execution Count:55 | 55 |
544 | return; executed: return; Execution Count:55 | 55 |
545 | } | - |
546 | | - |
547 | readResponseContent: code before this statement executed: readResponseContent: Execution Count:25 | 25 |
548 | if (d->state == ReadResponseContent) { partially evaluated: d->state == ReadResponseContent no Evaluation Count:0 | yes Evaluation Count:25 |
| 0-25 |
549 | char dummybuffer[4096]; never executed (the execution status of this line is deduced): char dummybuffer[4096]; | - |
550 | while (d->pendingResponseData) { never evaluated: d->pendingResponseData | 0 |
551 | int read = d->socket->read(dummybuffer, qMin(sizeof(dummybuffer), (size_t)d->pendingResponseData)); never executed (the execution status of this line is deduced): int read = d->socket->read(dummybuffer, qMin(sizeof(dummybuffer), (size_t)d->pendingResponseData)); | - |
552 | if (read >= 0) never evaluated: read >= 0 | 0 |
553 | dummybuffer[read] = 0; never executed: dummybuffer[read] = 0; | 0 |
554 | | - |
555 | if (read == 0) never evaluated: read == 0 | 0 |
556 | return; | 0 |
557 | if (read == -1) { never evaluated: read == -1 | 0 |
558 | d->socket->disconnectFromHost(); never executed (the execution status of this line is deduced): d->socket->disconnectFromHost(); | - |
559 | emitWriteNotification(); never executed (the execution status of this line is deduced): emitWriteNotification(); | - |
560 | return; | 0 |
561 | } | - |
562 | d->pendingResponseData -= read; never executed (the execution status of this line is deduced): d->pendingResponseData -= read; | - |
563 | } | 0 |
564 | if (d->pendingResponseData > 0) never evaluated: d->pendingResponseData > 0 | 0 |
565 | return; | 0 |
566 | d->state = SendAuthentication; never executed (the execution status of this line is deduced): d->state = SendAuthentication; | - |
567 | slotSocketConnected(); never executed (the execution status of this line is deduced): slotSocketConnected(); | - |
568 | return; | 0 |
569 | } | - |
570 | | - |
571 | bool ok = true; executed (the execution status of this line is deduced): bool ok = true; | - |
572 | if (d->reply->d_func()->state == QHttpNetworkReplyPrivate::NothingDoneState) partially evaluated: d->reply->d_func()->state == QHttpNetworkReplyPrivate::NothingDoneState yes Evaluation Count:25 | no Evaluation Count:0 |
| 0-25 |
573 | d->reply->d_func()->state = QHttpNetworkReplyPrivate::ReadingStatusState; executed: d->reply->d_func()->state = QHttpNetworkReplyPrivate::ReadingStatusState; Execution Count:25 | 25 |
574 | if (d->reply->d_func()->state == QHttpNetworkReplyPrivate::ReadingStatusState) { partially evaluated: d->reply->d_func()->state == QHttpNetworkReplyPrivate::ReadingStatusState yes Evaluation Count:25 | no Evaluation Count:0 |
| 0-25 |
575 | ok = d->reply->d_func()->readStatus(d->socket) != -1; executed (the execution status of this line is deduced): ok = d->reply->d_func()->readStatus(d->socket) != -1; | - |
576 | if (ok && d->reply->d_func()->state == QHttpNetworkReplyPrivate::ReadingStatusState) partially evaluated: ok yes Evaluation Count:25 | no Evaluation Count:0 |
partially evaluated: d->reply->d_func()->state == QHttpNetworkReplyPrivate::ReadingStatusState no Evaluation Count:0 | yes Evaluation Count:25 |
| 0-25 |
577 | return; //Not done parsing headers yet, wait for more data | 0 |
578 | } executed: } Execution Count:25 | 25 |
579 | if (ok && d->reply->d_func()->state == QHttpNetworkReplyPrivate::ReadingHeaderState) { partially evaluated: ok yes Evaluation Count:25 | no Evaluation Count:0 |
partially evaluated: d->reply->d_func()->state == QHttpNetworkReplyPrivate::ReadingHeaderState yes Evaluation Count:25 | no Evaluation Count:0 |
| 0-25 |
580 | ok = d->reply->d_func()->readHeader(d->socket) != -1; executed (the execution status of this line is deduced): ok = d->reply->d_func()->readHeader(d->socket) != -1; | - |
581 | if (ok && d->reply->d_func()->state == QHttpNetworkReplyPrivate::ReadingHeaderState) partially evaluated: ok yes Evaluation Count:25 | no Evaluation Count:0 |
partially evaluated: d->reply->d_func()->state == QHttpNetworkReplyPrivate::ReadingHeaderState no Evaluation Count:0 | yes Evaluation Count:25 |
| 0-25 |
582 | return; //Not done parsing headers yet, wait for more data | 0 |
583 | } executed: } Execution Count:25 | 25 |
584 | if (!ok) { partially evaluated: !ok no Evaluation Count:0 | yes Evaluation Count:25 |
| 0-25 |
585 | // protocol error, this isn't HTTP | - |
586 | d->socket->close(); never executed (the execution status of this line is deduced): d->socket->close(); | - |
587 | setState(QAbstractSocket::UnconnectedState); never executed (the execution status of this line is deduced): setState(QAbstractSocket::UnconnectedState); | - |
588 | setError(QAbstractSocket::ProxyProtocolError, tr("Did not receive HTTP response from proxy")); never executed (the execution status of this line is deduced): setError(QAbstractSocket::ProxyProtocolError, tr("Did not receive HTTP response from proxy")); | - |
589 | emitConnectionNotification(); never executed (the execution status of this line is deduced): emitConnectionNotification(); | - |
590 | return; | 0 |
591 | } | - |
592 | | - |
593 | int statusCode = d->reply->statusCode(); executed (the execution status of this line is deduced): int statusCode = d->reply->statusCode(); | - |
594 | QAuthenticatorPrivate *priv = 0; executed (the execution status of this line is deduced): QAuthenticatorPrivate *priv = 0; | - |
595 | if (statusCode == 200) { evaluated: statusCode == 200 yes Evaluation Count:15 | yes Evaluation Count:10 |
| 10-15 |
596 | d->state = Connected; executed (the execution status of this line is deduced): d->state = Connected; | - |
597 | setLocalAddress(d->socket->localAddress()); executed (the execution status of this line is deduced): setLocalAddress(d->socket->localAddress()); | - |
598 | setLocalPort(d->socket->localPort()); executed (the execution status of this line is deduced): setLocalPort(d->socket->localPort()); | - |
599 | setState(QAbstractSocket::ConnectedState); executed (the execution status of this line is deduced): setState(QAbstractSocket::ConnectedState); | - |
600 | d->authenticator.detach(); executed (the execution status of this line is deduced): d->authenticator.detach(); | - |
601 | priv = QAuthenticatorPrivate::getPrivate(d->authenticator); executed (the execution status of this line is deduced): priv = QAuthenticatorPrivate::getPrivate(d->authenticator); | - |
602 | priv->hasFailed = false; executed (the execution status of this line is deduced): priv->hasFailed = false; | - |
603 | } else if (statusCode == 407) { executed: } Execution Count:15 partially evaluated: statusCode == 407 yes Evaluation Count:10 | no Evaluation Count:0 |
| 0-15 |
604 | if (d->credentialsSent) { evaluated: d->credentialsSent yes Evaluation Count:2 | yes Evaluation Count:8 |
| 2-8 |
605 | //407 response again means the provided username/password were invalid. | - |
606 | d->authenticator = QAuthenticator(); //this is needed otherwise parseHttpResponse won't set the state, and then signal isn't emitted. executed (the execution status of this line is deduced): d->authenticator = QAuthenticator(); | - |
607 | d->authenticator.detach(); executed (the execution status of this line is deduced): d->authenticator.detach(); | - |
608 | priv = QAuthenticatorPrivate::getPrivate(d->authenticator); executed (the execution status of this line is deduced): priv = QAuthenticatorPrivate::getPrivate(d->authenticator); | - |
609 | priv->hasFailed = true; executed (the execution status of this line is deduced): priv->hasFailed = true; | - |
610 | } executed: } Execution Count:2 | 2 |
611 | else if (d->authenticator.isNull()) partially evaluated: d->authenticator.isNull() yes Evaluation Count:8 | no Evaluation Count:0 |
| 0-8 |
612 | d->authenticator.detach(); executed: d->authenticator.detach(); Execution Count:8 | 8 |
613 | priv = QAuthenticatorPrivate::getPrivate(d->authenticator); executed (the execution status of this line is deduced): priv = QAuthenticatorPrivate::getPrivate(d->authenticator); | - |
614 | | - |
615 | priv->parseHttpResponse(d->reply->header(), true); executed (the execution status of this line is deduced): priv->parseHttpResponse(d->reply->header(), true); | - |
616 | | - |
617 | if (priv->phase == QAuthenticatorPrivate::Invalid) { partially evaluated: priv->phase == QAuthenticatorPrivate::Invalid no Evaluation Count:0 | yes Evaluation Count:10 |
| 0-10 |
618 | // problem parsing the reply | - |
619 | d->socket->close(); never executed (the execution status of this line is deduced): d->socket->close(); | - |
620 | setState(QAbstractSocket::UnconnectedState); never executed (the execution status of this line is deduced): setState(QAbstractSocket::UnconnectedState); | - |
621 | setError(QAbstractSocket::ProxyProtocolError, tr("Error parsing authentication request from proxy")); never executed (the execution status of this line is deduced): setError(QAbstractSocket::ProxyProtocolError, tr("Error parsing authentication request from proxy")); | - |
622 | emitConnectionNotification(); never executed (the execution status of this line is deduced): emitConnectionNotification(); | - |
623 | return; | 0 |
624 | } | - |
625 | | - |
626 | bool willClose; executed (the execution status of this line is deduced): bool willClose; | - |
627 | QByteArray proxyConnectionHeader = d->reply->headerField("Proxy-Connection"); executed (the execution status of this line is deduced): QByteArray proxyConnectionHeader = d->reply->headerField("Proxy-Connection"); | - |
628 | // Although most proxies use the unofficial Proxy-Connection header, the Connection header | - |
629 | // from http spec is also allowed. | - |
630 | if (proxyConnectionHeader.isEmpty()) partially evaluated: proxyConnectionHeader.isEmpty() no Evaluation Count:0 | yes Evaluation Count:10 |
| 0-10 |
631 | proxyConnectionHeader = d->reply->headerField("Connection"); never executed: proxyConnectionHeader = d->reply->headerField("Connection"); | 0 |
632 | proxyConnectionHeader = proxyConnectionHeader.toLower(); never executed (the execution status of this line is deduced): proxyConnectionHeader = proxyConnectionHeader.toLower(); | - |
633 | if (proxyConnectionHeader == "close") { partially evaluated: proxyConnectionHeader == "close" yes Evaluation Count:10 | no Evaluation Count:0 |
| 0-10 |
634 | willClose = true; executed (the execution status of this line is deduced): willClose = true; | - |
635 | } else if (proxyConnectionHeader == "keep-alive") { executed: } Execution Count:10 never evaluated: proxyConnectionHeader == "keep-alive" | 0-10 |
636 | willClose = false; never executed (the execution status of this line is deduced): willClose = false; | - |
637 | } else { | 0 |
638 | // no Proxy-Connection header, so use the default | - |
639 | // HTTP 1.1's default behaviour is to keep persistent connections | - |
640 | // HTTP 1.0 or earlier, so we expect the server to close | - |
641 | willClose = (d->reply->majorVersion() * 0x100 + d->reply->minorVersion()) <= 0x0100; never executed (the execution status of this line is deduced): willClose = (d->reply->majorVersion() * 0x100 + d->reply->minorVersion()) <= 0x0100; | - |
642 | } | 0 |
643 | | - |
644 | if (willClose) { partially evaluated: willClose yes Evaluation Count:10 | no Evaluation Count:0 |
| 0-10 |
645 | // the server will disconnect, so let's avoid receiving an error | - |
646 | // especially since the signal below may trigger a new event loop | - |
647 | d->socket->disconnectFromHost(); executed (the execution status of this line is deduced): d->socket->disconnectFromHost(); | - |
648 | d->socket->readAll(); executed (the execution status of this line is deduced): d->socket->readAll(); | - |
649 | //We're done with the reply and need to reset it for the next connection | - |
650 | delete d->reply; executed (the execution status of this line is deduced): delete d->reply; | - |
651 | d->reply = new QHttpNetworkReply; executed (the execution status of this line is deduced): d->reply = new QHttpNetworkReply; | - |
652 | } executed: } Execution Count:10 | 10 |
653 | | - |
654 | if (priv->phase == QAuthenticatorPrivate::Done) partially evaluated: priv->phase == QAuthenticatorPrivate::Done yes Evaluation Count:10 | no Evaluation Count:0 |
| 0-10 |
655 | emit proxyAuthenticationRequired(d->proxy, &d->authenticator); executed: proxyAuthenticationRequired(d->proxy, &d->authenticator); Execution Count:10 | 10 |
656 | // priv->phase will get reset to QAuthenticatorPrivate::Start if the authenticator got modified in the signal above. | - |
657 | if (priv->phase == QAuthenticatorPrivate::Done) { evaluated: priv->phase == QAuthenticatorPrivate::Done yes Evaluation Count:2 | yes Evaluation Count:8 |
| 2-8 |
658 | setError(QAbstractSocket::ProxyAuthenticationRequiredError, tr("Authentication required")); executed (the execution status of this line is deduced): setError(QAbstractSocket::ProxyAuthenticationRequiredError, tr("Authentication required")); | - |
659 | d->socket->disconnectFromHost(); executed (the execution status of this line is deduced): d->socket->disconnectFromHost(); | - |
660 | } else { executed: } Execution Count:2 | 2 |
661 | // close the connection if it isn't already and reconnect using the chosen authentication method | - |
662 | d->state = SendAuthentication; executed (the execution status of this line is deduced): d->state = SendAuthentication; | - |
663 | if (willClose) { partially evaluated: willClose yes Evaluation Count:8 | no Evaluation Count:0 |
| 0-8 |
664 | d->socket->connectToHost(d->proxy.hostName(), d->proxy.port()); executed (the execution status of this line is deduced): d->socket->connectToHost(d->proxy.hostName(), d->proxy.port()); | - |
665 | } else { executed: } Execution Count:8 | 8 |
666 | bool ok; never executed (the execution status of this line is deduced): bool ok; | - |
667 | int contentLength = d->reply->headerField("Content-Length").toInt(&ok); never executed (the execution status of this line is deduced): int contentLength = d->reply->headerField("Content-Length").toInt(&ok); | - |
668 | if (ok && contentLength > 0) { never evaluated: ok never evaluated: contentLength > 0 | 0 |
669 | d->state = ReadResponseContent; never executed (the execution status of this line is deduced): d->state = ReadResponseContent; | - |
670 | d->pendingResponseData = contentLength; never executed (the execution status of this line is deduced): d->pendingResponseData = contentLength; | - |
671 | goto readResponseContent; never executed: goto readResponseContent; | 0 |
672 | } else { | - |
673 | d->state = SendAuthentication; never executed (the execution status of this line is deduced): d->state = SendAuthentication; | - |
674 | slotSocketConnected(); never executed (the execution status of this line is deduced): slotSocketConnected(); | - |
675 | } | 0 |
676 | } | - |
677 | return; executed: return; Execution Count:8 | 8 |
678 | } | - |
679 | } else { | - |
680 | d->socket->close(); never executed (the execution status of this line is deduced): d->socket->close(); | - |
681 | setState(QAbstractSocket::UnconnectedState); never executed (the execution status of this line is deduced): setState(QAbstractSocket::UnconnectedState); | - |
682 | if (statusCode == 403 || statusCode == 405) { never evaluated: statusCode == 403 never evaluated: statusCode == 405 | 0 |
683 | // 403 Forbidden | - |
684 | // 405 Method Not Allowed | - |
685 | setError(QAbstractSocket::SocketAccessError, tr("Proxy denied connection")); never executed (the execution status of this line is deduced): setError(QAbstractSocket::SocketAccessError, tr("Proxy denied connection")); | - |
686 | } else if (statusCode == 404) { never executed: } never evaluated: statusCode == 404 | 0 |
687 | // 404 Not Found: host lookup error | - |
688 | setError(QAbstractSocket::HostNotFoundError, QAbstractSocket::tr("Host not found")); never executed (the execution status of this line is deduced): setError(QAbstractSocket::HostNotFoundError, QAbstractSocket::tr("Host not found")); | - |
689 | } else if (statusCode == 503) { never executed: } never evaluated: statusCode == 503 | 0 |
690 | // 503 Service Unavailable: Connection Refused | - |
691 | setError(QAbstractSocket::ConnectionRefusedError, QAbstractSocket::tr("Connection refused")); never executed (the execution status of this line is deduced): setError(QAbstractSocket::ConnectionRefusedError, QAbstractSocket::tr("Connection refused")); | - |
692 | } else { | 0 |
693 | // Some other reply | - |
694 | //qWarning("UNEXPECTED RESPONSE: [%s]", responseHeader.toString().toLatin1().data()); | - |
695 | setError(QAbstractSocket::ProxyProtocolError, tr("Error communicating with HTTP proxy")); never executed (the execution status of this line is deduced): setError(QAbstractSocket::ProxyProtocolError, tr("Error communicating with HTTP proxy")); | - |
696 | } | 0 |
697 | } | - |
698 | | - |
699 | // The handshake is done; notify that we're connected (or failed to connect) | - |
700 | emitConnectionNotification(); executed (the execution status of this line is deduced): emitConnectionNotification(); | - |
701 | } executed: } Execution Count:17 | 17 |
702 | | - |
703 | void QHttpSocketEngine::slotSocketBytesWritten() | - |
704 | { | - |
705 | Q_D(QHttpSocketEngine); executed (the execution status of this line is deduced): QHttpSocketEnginePrivate * const d = d_func(); | - |
706 | if (d->state == Connected && d->writeNotificationEnabled) evaluated: d->state == Connected yes Evaluation Count:35 | yes Evaluation Count:25 |
partially evaluated: d->writeNotificationEnabled yes Evaluation Count:35 | no Evaluation Count:0 |
| 0-35 |
707 | emitWriteNotification(); executed: emitWriteNotification(); Execution Count:35 | 35 |
708 | } executed: } Execution Count:60 | 60 |
709 | | - |
710 | void QHttpSocketEngine::slotSocketError(QAbstractSocket::SocketError error) | - |
711 | { | - |
712 | Q_D(QHttpSocketEngine); executed (the execution status of this line is deduced): QHttpSocketEnginePrivate * const d = d_func(); | - |
713 | | - |
714 | if (d->state != Connected) { partially evaluated: d->state != Connected no Evaluation Count:0 | yes Evaluation Count:6 |
| 0-6 |
715 | // we are in proxy handshaking stages | - |
716 | if (error == QAbstractSocket::HostNotFoundError) never evaluated: error == QAbstractSocket::HostNotFoundError | 0 |
717 | setError(QAbstractSocket::ProxyNotFoundError, tr("Proxy server not found")); never executed: setError(QAbstractSocket::ProxyNotFoundError, tr("Proxy server not found")); | 0 |
718 | else if (error == QAbstractSocket::ConnectionRefusedError) never evaluated: error == QAbstractSocket::ConnectionRefusedError | 0 |
719 | setError(QAbstractSocket::ProxyConnectionRefusedError, tr("Proxy connection refused")); never executed: setError(QAbstractSocket::ProxyConnectionRefusedError, tr("Proxy connection refused")); | 0 |
720 | else if (error == QAbstractSocket::SocketTimeoutError) never evaluated: error == QAbstractSocket::SocketTimeoutError | 0 |
721 | setError(QAbstractSocket::ProxyConnectionTimeoutError, tr("Proxy server connection timed out")); never executed: setError(QAbstractSocket::ProxyConnectionTimeoutError, tr("Proxy server connection timed out")); | 0 |
722 | else if (error == QAbstractSocket::RemoteHostClosedError) never evaluated: error == QAbstractSocket::RemoteHostClosedError | 0 |
723 | setError(QAbstractSocket::ProxyConnectionClosedError, tr("Proxy connection closed prematurely")); never executed: setError(QAbstractSocket::ProxyConnectionClosedError, tr("Proxy connection closed prematurely")); | 0 |
724 | else | - |
725 | setError(error, d->socket->errorString()); never executed: setError(error, d->socket->errorString()); | 0 |
726 | emitConnectionNotification(); never executed (the execution status of this line is deduced): emitConnectionNotification(); | - |
727 | return; | 0 |
728 | } | - |
729 | | - |
730 | // We're connected | - |
731 | if (error == QAbstractSocket::SocketTimeoutError) partially evaluated: error == QAbstractSocket::SocketTimeoutError no Evaluation Count:0 | yes Evaluation Count:6 |
| 0-6 |
732 | return; // ignore this error | 0 |
733 | | - |
734 | d->state = None; executed (the execution status of this line is deduced): d->state = None; | - |
735 | setError(error, d->socket->errorString()); executed (the execution status of this line is deduced): setError(error, d->socket->errorString()); | - |
736 | if (error != QAbstractSocket::RemoteHostClosedError) partially evaluated: error != QAbstractSocket::RemoteHostClosedError no Evaluation Count:0 | yes Evaluation Count:6 |
| 0-6 |
737 | qDebug() << "QHttpSocketEngine::slotSocketError: got weird error =" << error; never executed: QMessageLogger("socket/qhttpsocketengine.cpp", 737, __PRETTY_FUNCTION__).debug() << "QHttpSocketEngine::slotSocketError: got weird error =" << error; | 0 |
738 | //read notification needs to always be emitted, otherwise the higher layer doesn't get the disconnected signal | - |
739 | emitReadNotification(); executed (the execution status of this line is deduced): emitReadNotification(); | - |
740 | } executed: } Execution Count:6 | 6 |
741 | | - |
742 | void QHttpSocketEngine::slotSocketStateChanged(QAbstractSocket::SocketState state) | - |
743 | { | - |
744 | Q_UNUSED(state); executed (the execution status of this line is deduced): (void)state;; | - |
745 | } executed: } Execution Count:125 | 125 |
746 | | - |
747 | void QHttpSocketEngine::emitPendingReadNotification() | - |
748 | { | - |
749 | Q_D(QHttpSocketEngine); executed (the execution status of this line is deduced): QHttpSocketEnginePrivate * const d = d_func(); | - |
750 | d->readNotificationPending = false; executed (the execution status of this line is deduced): d->readNotificationPending = false; | - |
751 | if (d->readNotificationEnabled) partially evaluated: d->readNotificationEnabled yes Evaluation Count:55 | no Evaluation Count:0 |
| 0-55 |
752 | emit readNotification(); executed: readNotification(); Execution Count:55 | 55 |
753 | } executed: } Execution Count:55 | 55 |
754 | | - |
755 | void QHttpSocketEngine::emitPendingWriteNotification() | - |
756 | { | - |
757 | Q_D(QHttpSocketEngine); executed (the execution status of this line is deduced): QHttpSocketEnginePrivate * const d = d_func(); | - |
758 | d->writeNotificationPending = false; executed (the execution status of this line is deduced): d->writeNotificationPending = false; | - |
759 | if (d->writeNotificationEnabled) partially evaluated: d->writeNotificationEnabled yes Evaluation Count:35 | no Evaluation Count:0 |
| 0-35 |
760 | emit writeNotification(); executed: writeNotification(); Execution Count:35 | 35 |
761 | } executed: } Execution Count:35 | 35 |
762 | | - |
763 | void QHttpSocketEngine::emitPendingConnectionNotification() | - |
764 | { | - |
765 | Q_D(QHttpSocketEngine); executed (the execution status of this line is deduced): QHttpSocketEnginePrivate * const d = d_func(); | - |
766 | d->connectionNotificationPending = false; executed (the execution status of this line is deduced): d->connectionNotificationPending = false; | - |
767 | emit connectionNotification(); executed (the execution status of this line is deduced): connectionNotification(); | - |
768 | } executed: } Execution Count:17 | 17 |
769 | | - |
770 | void QHttpSocketEngine::emitReadNotification() | - |
771 | { | - |
772 | Q_D(QHttpSocketEngine); executed (the execution status of this line is deduced): QHttpSocketEnginePrivate * const d = d_func(); | - |
773 | d->readNotificationActivated = true; executed (the execution status of this line is deduced): d->readNotificationActivated = true; | - |
774 | // if there is a connection notification pending we have to emit the readNotification | - |
775 | // incase there is connection error. This is only needed for Windows, but it does not | - |
776 | // hurt in other cases. | - |
777 | if ((d->readNotificationEnabled && !d->readNotificationPending) || d->connectionNotificationPending) { partially evaluated: d->readNotificationEnabled yes Evaluation Count:61 | no Evaluation Count:0 |
partially evaluated: !d->readNotificationPending yes Evaluation Count:61 | no Evaluation Count:0 |
never evaluated: d->connectionNotificationPending | 0-61 |
778 | d->readNotificationPending = true; executed (the execution status of this line is deduced): d->readNotificationPending = true; | - |
779 | QMetaObject::invokeMethod(this, "emitPendingReadNotification", Qt::QueuedConnection); executed (the execution status of this line is deduced): QMetaObject::invokeMethod(this, "emitPendingReadNotification", Qt::QueuedConnection); | - |
780 | } executed: } Execution Count:61 | 61 |
781 | } executed: } Execution Count:61 | 61 |
782 | | - |
783 | void QHttpSocketEngine::emitWriteNotification() | - |
784 | { | - |
785 | Q_D(QHttpSocketEngine); executed (the execution status of this line is deduced): QHttpSocketEnginePrivate * const d = d_func(); | - |
786 | d->writeNotificationActivated = true; executed (the execution status of this line is deduced): d->writeNotificationActivated = true; | - |
787 | if (d->writeNotificationEnabled && !d->writeNotificationPending) { partially evaluated: d->writeNotificationEnabled yes Evaluation Count:35 | no Evaluation Count:0 |
partially evaluated: !d->writeNotificationPending yes Evaluation Count:35 | no Evaluation Count:0 |
| 0-35 |
788 | d->writeNotificationPending = true; executed (the execution status of this line is deduced): d->writeNotificationPending = true; | - |
789 | QMetaObject::invokeMethod(this, "emitPendingWriteNotification", Qt::QueuedConnection); executed (the execution status of this line is deduced): QMetaObject::invokeMethod(this, "emitPendingWriteNotification", Qt::QueuedConnection); | - |
790 | } executed: } Execution Count:35 | 35 |
791 | } executed: } Execution Count:35 | 35 |
792 | | - |
793 | void QHttpSocketEngine::emitConnectionNotification() | - |
794 | { | - |
795 | Q_D(QHttpSocketEngine); executed (the execution status of this line is deduced): QHttpSocketEnginePrivate * const d = d_func(); | - |
796 | if (!d->connectionNotificationPending) { partially evaluated: !d->connectionNotificationPending yes Evaluation Count:17 | no Evaluation Count:0 |
| 0-17 |
797 | d->connectionNotificationPending = true; executed (the execution status of this line is deduced): d->connectionNotificationPending = true; | - |
798 | QMetaObject::invokeMethod(this, "emitPendingConnectionNotification", Qt::QueuedConnection); executed (the execution status of this line is deduced): QMetaObject::invokeMethod(this, "emitPendingConnectionNotification", Qt::QueuedConnection); | - |
799 | } executed: } Execution Count:17 | 17 |
800 | } executed: } Execution Count:17 | 17 |
801 | | - |
802 | QHttpSocketEnginePrivate::QHttpSocketEnginePrivate() | - |
803 | : readNotificationEnabled(false) | - |
804 | , writeNotificationEnabled(false) | - |
805 | , exceptNotificationEnabled(false) | - |
806 | , readNotificationActivated(false) | - |
807 | , writeNotificationActivated(false) | - |
808 | , readNotificationPending(false) | - |
809 | , writeNotificationPending(false) | - |
810 | , connectionNotificationPending(false) | - |
811 | , credentialsSent(false) | - |
812 | , pendingResponseData(0) | - |
813 | { | - |
814 | socket = 0; executed (the execution status of this line is deduced): socket = 0; | - |
815 | reply = 0; executed (the execution status of this line is deduced): reply = 0; | - |
816 | state = QHttpSocketEngine::None; executed (the execution status of this line is deduced): state = QHttpSocketEngine::None; | - |
817 | } executed: } Execution Count:17 | 17 |
818 | | - |
819 | QHttpSocketEnginePrivate::~QHttpSocketEnginePrivate() | - |
820 | { | - |
821 | } | - |
822 | | - |
823 | QAbstractSocketEngine *QHttpSocketEngineHandler::createSocketEngine(QAbstractSocket::SocketType socketType, | - |
824 | const QNetworkProxy &proxy, | - |
825 | QObject *parent) | - |
826 | { | - |
827 | if (socketType != QAbstractSocket::TcpSocket) evaluated: socketType != QAbstractSocket::TcpSocket yes Evaluation Count:306 | yes Evaluation Count:2600 |
| 306-2600 |
828 | return 0; executed: return 0; Execution Count:306 | 306 |
829 | | - |
830 | // proxy type must have been resolved by now | - |
831 | if (proxy.type() != QNetworkProxy::HttpProxy) evaluated: proxy.type() != QNetworkProxy::HttpProxy yes Evaluation Count:2583 | yes Evaluation Count:17 |
| 17-2583 |
832 | return 0; executed: return 0; Execution Count:2583 | 2583 |
833 | | - |
834 | // we only accept active sockets | - |
835 | if (!qobject_cast<QAbstractSocket *>(parent)) partially evaluated: !qobject_cast<QAbstractSocket *>(parent) no Evaluation Count:0 | yes Evaluation Count:17 |
| 0-17 |
836 | return 0; never executed: return 0; | 0 |
837 | | - |
838 | QHttpSocketEngine *engine = new QHttpSocketEngine(parent); executed (the execution status of this line is deduced): QHttpSocketEngine *engine = new QHttpSocketEngine(parent); | - |
839 | engine->setProxy(proxy); executed (the execution status of this line is deduced): engine->setProxy(proxy); | - |
840 | return engine; executed: return engine; Execution Count:17 | 17 |
841 | } | - |
842 | | - |
843 | QAbstractSocketEngine *QHttpSocketEngineHandler::createSocketEngine(qintptr, QObject *) | - |
844 | { | - |
845 | return 0; executed: return 0; Execution Count:616 | 616 |
846 | } | - |
847 | | - |
848 | QT_END_NAMESPACE | - |
849 | | - |
850 | #endif | - |
851 | | - |
| | |