summaryrefslogtreecommitdiffstats
path: root/src/network/socket
diff options
context:
space:
mode:
authorLiang Qi <liang.qi@qt.io>2017-03-02 09:04:38 +0100
committerLiang Qi <liang.qi@qt.io>2017-03-02 09:04:38 +0100
commit71264bae08d81bdeceb96133fdb01c370504dfcc (patch)
treed5dadaac8209d5ef1857a4d65197b9ee12b39848 /src/network/socket
parent5e785c0b83c9908c665f253c131629ac325a21f5 (diff)
parent6d10f739cd750968d0dd0e9d8fa4b64353a86c6c (diff)
Merge remote-tracking branch 'origin/5.9' into dev
Diffstat (limited to 'src/network/socket')
-rw-r--r--src/network/socket/qnativesocketengine.cpp28
-rw-r--r--src/network/socket/qnativesocketengine_unix.cpp14
-rw-r--r--src/network/socket/qnativesocketengine_win.cpp14
3 files changed, 46 insertions, 10 deletions
diff --git a/src/network/socket/qnativesocketengine.cpp b/src/network/socket/qnativesocketengine.cpp
index b56d460b8c..cf3afe1845 100644
--- a/src/network/socket/qnativesocketengine.cpp
+++ b/src/network/socket/qnativesocketengine.cpp
@@ -358,17 +358,41 @@ bool QNativeSocketEnginePrivate::checkProxy(const QHostAddress &address)
#if !defined(QT_NO_NETWORKPROXY)
QObject *parent = q_func()->parent();
QNetworkProxy proxy;
+ QNetworkProxyQuery::QueryType queryType = QNetworkProxyQuery::TcpSocket;
if (QAbstractSocket *socket = qobject_cast<QAbstractSocket *>(parent)) {
proxy = socket->proxy();
+ switch (socket->socketType()) {
+ case QAbstractSocket::UdpSocket:
+ queryType = QNetworkProxyQuery::UdpSocket;
+ break;
+ case QAbstractSocket::SctpSocket:
+ queryType = QNetworkProxyQuery::SctpSocket;
+ break;
+ case QAbstractSocket::TcpSocket:
+ case QAbstractSocket::UnknownSocketType:
+ queryType = QNetworkProxyQuery::TcpSocket;
+ }
} else if (QTcpServer *server = qobject_cast<QTcpServer *>(parent)) {
proxy = server->proxy();
+ queryType = QNetworkProxyQuery::TcpServer;
+#ifndef QT_NO_SCTP
+ if (qobject_cast<QSctpServer *>(server))
+ queryType = QNetworkProxyQuery::SctpServer;
+#endif
} else {
// no parent -> no proxy
return true;
}
- if (proxy.type() == QNetworkProxy::DefaultProxy)
- proxy = QNetworkProxy::applicationProxy();
+ if (proxy.type() == QNetworkProxy::DefaultProxy) {
+ // This is similar to what we have in QNetworkProxy::applicationProxy,
+ // the only difference is that we provide the correct query type instead of
+ // always using TcpSocket unconditionally (this is the default type for
+ // QNetworkProxyQuery).
+ QNetworkProxyQuery query;
+ query.setQueryType(queryType);
+ proxy = QNetworkProxyFactory::systemProxyForQuery(query).constFirst();
+ }
if (proxy.type() != QNetworkProxy::DefaultProxy &&
proxy.type() != QNetworkProxy::NoProxy) {
diff --git a/src/network/socket/qnativesocketengine_unix.cpp b/src/network/socket/qnativesocketengine_unix.cpp
index c12ae9730f..1e69aebb54 100644
--- a/src/network/socket/qnativesocketengine_unix.cpp
+++ b/src/network/socket/qnativesocketengine_unix.cpp
@@ -678,10 +678,16 @@ static bool multicastMembershipHelper(QNativeSocketEnginePrivate *d,
if (interface.isValid()) {
const QList<QNetworkAddressEntry> addressEntries = interface.addressEntries();
- if (!addressEntries.isEmpty()) {
- QHostAddress firstIP = addressEntries.first().ip();
- mreq4.imr_interface.s_addr = htonl(firstIP.toIPv4Address());
- } else {
+ bool found = false;
+ for (const QNetworkAddressEntry &entry : addressEntries) {
+ const QHostAddress ip = entry.ip();
+ if (ip.protocol() == QAbstractSocket::IPv4Protocol) {
+ mreq4.imr_interface.s_addr = htonl(ip.toIPv4Address());
+ found = true;
+ break;
+ }
+ }
+ if (!found) {
d->setError(QAbstractSocket::NetworkError,
QNativeSocketEnginePrivate::NetworkUnreachableErrorString);
return false;
diff --git a/src/network/socket/qnativesocketengine_win.cpp b/src/network/socket/qnativesocketengine_win.cpp
index 9e43265e59..2088d3927e 100644
--- a/src/network/socket/qnativesocketengine_win.cpp
+++ b/src/network/socket/qnativesocketengine_win.cpp
@@ -953,10 +953,16 @@ static bool multicastMembershipHelper(QNativeSocketEnginePrivate *d,
if (iface.isValid()) {
const QList<QNetworkAddressEntry> addressEntries = iface.addressEntries();
- if (!addressEntries.isEmpty()) {
- QHostAddress firstIP = addressEntries.first().ip();
- mreq4.imr_interface.s_addr = htonl(firstIP.toIPv4Address());
- } else {
+ bool found = false;
+ for (const QNetworkAddressEntry &entry : addressEntries) {
+ const QHostAddress ip = entry.ip();
+ if (ip.protocol() == QAbstractSocket::IPv4Protocol) {
+ mreq4.imr_interface.s_addr = htonl(ip.toIPv4Address());
+ found = true;
+ break;
+ }
+ }
+ if (!found) {
d->setError(QAbstractSocket::NetworkError,
QNativeSocketEnginePrivate::NetworkUnreachableErrorString);
return false;