summaryrefslogtreecommitdiffstats
path: root/src/network/access/qhttpnetworkconnection.cpp
diff options
context:
space:
mode:
authorMartin Petersson <martin.petersson@nokia.com>2011-12-16 10:44:24 +0100
committerQt by Nokia <qt-info@nokia.com>2011-12-16 11:22:52 +0100
commit9bc4b56656a5acabba09093e3da145bf6a4bca62 (patch)
treeef78827db1e7c2c69acc9a598fb6879d7c85d924 /src/network/access/qhttpnetworkconnection.cpp
parentf4ccbc2868f0bef9e9a4cfb8dc8ce2023d221179 (diff)
QNetworkAccessManager: delay IPv4 connection with Happy Eyeballs
Incase we have both IPv4 and IPv6 available after the host lookup we should delay the connection attempt to IPv4. Task-number: QTBUG-23066 Change-Id: I8c0177cf125c9daae314ada73cacef790a39b856 Reviewed-by: Peter Hartmann <peter.hartmann@nokia.com>
Diffstat (limited to 'src/network/access/qhttpnetworkconnection.cpp')
-rw-r--r--src/network/access/qhttpnetworkconnection.cpp26
1 files changed, 25 insertions, 1 deletions
diff --git a/src/network/access/qhttpnetworkconnection.cpp b/src/network/access/qhttpnetworkconnection.cpp
index fca3d5999e..b43f2b9bcd 100644
--- a/src/network/access/qhttpnetworkconnection.cpp
+++ b/src/network/access/qhttpnetworkconnection.cpp
@@ -116,6 +116,7 @@ QHttpNetworkConnectionPrivate::~QHttpNetworkConnectionPrivate()
void QHttpNetworkConnectionPrivate::init()
{
+ Q_Q(QHttpNetworkConnection);
for (int i = 0; i < channelCount; i++) {
channels[i].setConnection(this->q_func());
channels[i].ssl = encrypt;
@@ -125,6 +126,8 @@ void QHttpNetworkConnectionPrivate::init()
#endif
channels[i].init();
}
+ ipv4ConnectTimer.setSingleShot(true);
+ QObject::connect(&ipv4ConnectTimer, SIGNAL(timeout()), q, SLOT(_q_connectIPv4Channel()));
}
void QHttpNetworkConnectionPrivate::pauseConnection()
@@ -185,6 +188,12 @@ bool QHttpNetworkConnectionPrivate::shouldEmitChannelError(QAbstractSocket *sock
int i = indexOf(socket);
int otherSocket = (i == 0 ? 1 : 0);
+ // If the IPv4 connection still isn't started we need to start it now.
+ if (ipv4ConnectTimer.isActive()) {
+ ipv4ConnectTimer.stop();
+ channels[0].ensureConnection();
+ }
+
if (channelCount == 1) {
if (networkLayerState == QHttpNetworkConnectionPrivate::InProgress)
networkLayerState = QHttpNetworkConnectionPrivate::Unknown;
@@ -1010,7 +1019,18 @@ void QHttpNetworkConnectionPrivate::startNetworkLayerStateLookup()
channels[0].networkLayerPreference = QAbstractSocket::IPv4Protocol;
channels[1].networkLayerPreference = QAbstractSocket::IPv6Protocol;
- channels[0].ensureConnection(); // Possibly delay this one..
+ int timeout = 300;
+#ifndef QT_NO_BEARERMANAGEMENT
+ if (networkSession->configuration().bearerType() == QNetworkConfiguration::Bearer2G)
+ timeout = 800;
+ else if (networkSession->configuration().bearerType() == QNetworkConfiguration::BearerCDMA2000)
+ timeout = 500;
+ else if (networkSession->configuration().bearerType() == QNetworkConfiguration::BearerWCDMA)
+ timeout = 500;
+ else if (networkSession->configuration().bearerType() == QNetworkConfiguration::BearerHSPA)
+ timeout = 400;
+#endif
+ ipv4ConnectTimer.start(timeout);
channels[1].ensureConnection();
} else {
networkLayerState = InProgress;
@@ -1019,6 +1039,10 @@ void QHttpNetworkConnectionPrivate::startNetworkLayerStateLookup()
}
}
+void QHttpNetworkConnectionPrivate::_q_connectIPv4Channel()
+{
+ channels[0].ensureConnection();
+}
#ifndef QT_NO_BEARERMANAGEMENT
QHttpNetworkConnection::QHttpNetworkConnection(const QString &hostName, quint16 port, bool encrypt, QObject *parent, QSharedPointer<QNetworkSession> networkSession)