summaryrefslogtreecommitdiffstats
path: root/src/network
diff options
context:
space:
mode:
authorFrederik Gladhorn <frederik.gladhorn@theqtcompany.com>2014-11-24 13:37:06 +0100
committerFrederik Gladhorn <frederik.gladhorn@theqtcompany.com>2014-11-24 13:39:13 +0100
commit34aba4724f196e34ed02cf50073f41968f119bb6 (patch)
tree0ebdfcabda989ab76ee6de53c6461553c7a767a5 /src/network
parentb86b2a742afae118bf974c82ba966ddb0cae4afb (diff)
parentb1cf07f495e10c93e53651ac03e46ebdaea0a97e (diff)
Merge remote-tracking branch 'origin/5.4' into dev
Conflicts: src/corelib/io/qiodevice.cpp src/plugins/bearer/linux_common/qofonoservice_linux.cpp src/plugins/bearer/linux_common/qofonoservice_linux_p.h src/plugins/platforms/android/qandroidplatformtheme.cpp src/tools/bootstrap/bootstrap.pro src/widgets/styles/qmacstyle_mac.mm Change-Id: Ia02aab6c4598ce74e9c30bb4666d5e2ef000f99b
Diffstat (limited to 'src/network')
-rw-r--r--src/network/access/qhttpnetworkrequest.cpp2
-rw-r--r--src/network/access/qhttpthreaddelegate.cpp1
-rw-r--r--src/network/access/qnetworkaccessmanager.cpp12
-rw-r--r--src/network/socket/qlocalserver_unix.cpp54
-rw-r--r--src/network/socket/qnativesocketengine_winrt.cpp92
-rw-r--r--src/network/socket/qnativesocketengine_winrt_p.h9
-rw-r--r--src/network/ssl/qsslkey_openssl.cpp2
-rw-r--r--src/network/ssl/qsslsocket_openssl_symbols.cpp23
8 files changed, 116 insertions, 79 deletions
diff --git a/src/network/access/qhttpnetworkrequest.cpp b/src/network/access/qhttpnetworkrequest.cpp
index f50a79b061..66f093e490 100644
--- a/src/network/access/qhttpnetworkrequest.cpp
+++ b/src/network/access/qhttpnetworkrequest.cpp
@@ -151,7 +151,7 @@ QByteArray QHttpNetworkRequestPrivate::header(const QHttpNetworkRequest &request
}
if (request.d->operation == QHttpNetworkRequest::Post) {
// add content type, if not set in the request
- if (request.headerField("content-type").isEmpty()) {
+ if (request.headerField("content-type").isEmpty() && ((request.d->uploadByteDevice && request.d->uploadByteDevice->size() > 0) || request.d->url.hasQuery())) {
//Content-Type is mandatory. We can't say anything about the encoding, but x-www-form-urlencoded is the most likely to work.
//This warning indicates a bug in application code not setting a required header.
//Note that if using QHttpMultipart, the content-type is set in QNetworkAccessManagerPrivate::prepareMultipart already
diff --git a/src/network/access/qhttpthreaddelegate.cpp b/src/network/access/qhttpthreaddelegate.cpp
index b13c21d624..522f8d9891 100644
--- a/src/network/access/qhttpthreaddelegate.cpp
+++ b/src/network/access/qhttpthreaddelegate.cpp
@@ -654,6 +654,7 @@ void QHttpThreadDelegate::encryptedSlot()
if (!httpReply)
return;
+ emit sslConfigurationChanged(httpReply->sslConfiguration());
emit encrypted();
}
diff --git a/src/network/access/qnetworkaccessmanager.cpp b/src/network/access/qnetworkaccessmanager.cpp
index f00b58a8ce..52d56fb071 100644
--- a/src/network/access/qnetworkaccessmanager.cpp
+++ b/src/network/access/qnetworkaccessmanager.cpp
@@ -1135,7 +1135,12 @@ QNetworkReply *QNetworkAccessManager::createRequest(QNetworkAccessManager::Opera
if (!d->networkSessionStrongRef && (d->initializeSession || !d->networkConfiguration.identifier().isEmpty())) {
QNetworkConfigurationManager manager;
if (!d->networkConfiguration.identifier().isEmpty()) {
- d->createSession(d->networkConfiguration);
+ if ((d->networkConfiguration.state() & QNetworkConfiguration::Defined)
+ && d->networkConfiguration != manager.defaultConfiguration())
+ d->createSession(manager.defaultConfiguration());
+ else
+ d->createSession(d->networkConfiguration);
+
} else {
if (manager.capabilities() & QNetworkConfigurationManager::NetworkSessionRequired)
d->createSession(manager.defaultConfiguration());
@@ -1590,6 +1595,11 @@ void QNetworkAccessManagerPrivate::_q_onlineStateChanged(bool isOnline)
if (customNetworkConfiguration) {
online = (networkConfiguration.state() & QNetworkConfiguration::Active);
} else {
+ if (isOnline && online != isOnline) {
+ networkSessionStrongRef.clear();
+ networkSessionWeakRef.clear();
+ }
+
online = isOnline;
}
}
diff --git a/src/network/socket/qlocalserver_unix.cpp b/src/network/socket/qlocalserver_unix.cpp
index 149d89c000..a615dcc7b6 100644
--- a/src/network/socket/qlocalserver_unix.cpp
+++ b/src/network/socket/qlocalserver_unix.cpp
@@ -90,13 +90,14 @@ bool QLocalServerPrivate::listen(const QString &requestedServerName)
// Check any of the flags
if (socketOptions & QLocalServer::WorldAccessOption) {
- tempDir.reset(new QTemporaryDir(fullServerName));
+ QFileInfo serverNameFileInfo(fullServerName);
+ tempDir.reset(new QTemporaryDir(serverNameFileInfo.absolutePath() + QLatin1Char('/')));
if (!tempDir->isValid()) {
setError(QLatin1String("QLocalServer::listen"));
return false;
}
tempPath = tempDir->path();
- tempPath += QLatin1Char('/') + requestedServerName;
+ tempPath += QLatin1String("/s");
}
// create the unix socket
@@ -124,13 +125,6 @@ bool QLocalServerPrivate::listen(const QString &requestedServerName)
}
::memcpy(addr.sun_path, tempPath.toLatin1().data(),
tempPath.toLatin1().size() + 1);
-
- if (-1 == ::fchmod(listenSocket, 0)) {
- setError(QLatin1String("QLocalServer::listen"));
- closeServer();
- return false;
- }
-
} else {
::memcpy(addr.sun_path, fullServerName.toLatin1().data(),
fullServerName.toLatin1().size() + 1);
@@ -160,30 +154,28 @@ bool QLocalServerPrivate::listen(const QString &requestedServerName)
}
if (socketOptions & QLocalServer::WorldAccessOption) {
- mode_t mode = 000;
+ mode_t mode = 000;
- if (socketOptions & QLocalServer::UserAccessOption) {
- mode |= S_IRWXU;
- }
- if (socketOptions & QLocalServer::GroupAccessOption) {
- mode |= S_IRWXG;
- }
- if (socketOptions & QLocalServer::OtherAccessOption) {
- mode |= S_IRWXO;
- }
+ if (socketOptions & QLocalServer::UserAccessOption)
+ mode |= S_IRWXU;
- if (mode) {
- if (-1 == ::chmod(tempPath.toLatin1(), mode)) {
- setError(QLatin1String("QLocalServer::listen"));
- closeServer();
- return false;
- }
- }
- if (-1 == ::rename(tempPath.toLatin1(), fullServerName.toLatin1())){
- setError(QLatin1String("QLocalServer::listen"));
- closeServer();
- return false;
- }
+ if (socketOptions & QLocalServer::GroupAccessOption)
+ mode |= S_IRWXG;
+
+ if (socketOptions & QLocalServer::OtherAccessOption)
+ mode |= S_IRWXO;
+
+ if (::chmod(tempPath.toLatin1(), mode) == -1) {
+ setError(QLatin1String("QLocalServer::listen"));
+ closeServer();
+ return false;
+ }
+
+ if (::rename(tempPath.toLatin1(), fullServerName.toLatin1()) == -1) {
+ setError(QLatin1String("QLocalServer::listen"));
+ closeServer();
+ return false;
+ }
}
Q_ASSERT(!socketNotifier);
diff --git a/src/network/socket/qnativesocketengine_winrt.cpp b/src/network/socket/qnativesocketengine_winrt.cpp
index c3be3eb408..cacfe11fea 100644
--- a/src/network/socket/qnativesocketengine_winrt.cpp
+++ b/src/network/socket/qnativesocketengine_winrt.cpp
@@ -529,41 +529,27 @@ qint64 QNativeSocketEngine::write(const char *data, qint64 len)
qint64 QNativeSocketEngine::readDatagram(char *data, qint64 maxlen, QHostAddress *addr, quint16 *port)
{
Q_D(QNativeSocketEngine);
- if (d->socketType != QAbstractSocket::UdpSocket)
+ if (d->socketType != QAbstractSocket::UdpSocket || d->pendingDatagrams.isEmpty())
return -1;
- QHostAddress returnAddress;
- quint16 returnPort;
-
- for (int i = 0; i < d->pendingDatagrams.size(); ++i) {
- IDatagramSocketMessageReceivedEventArgs *arg = d->pendingDatagrams.at(i);
- ComPtr<IHostName> remoteHost;
- HString remoteHostString;
- HString remotePort;
- arg->get_RemoteAddress(&remoteHost);
- arg->get_RemotePort(remotePort.GetAddressOf());
- remoteHost->get_CanonicalName(remoteHostString.GetAddressOf());
- returnAddress.setAddress(qt_QStringFromHString(remoteHostString));
- returnPort = qt_QStringFromHString(remotePort).toInt();
- ComPtr<IDataReader> reader;
- arg->GetDataReader(&reader);
- if (!reader)
- continue;
-
- BYTE buffer[1024];
- reader->ReadBytes(maxlen, buffer);
- *addr = returnAddress;
- *port = returnPort;
- arg = d->pendingDatagrams.takeFirst();
- arg->Release();
-
- // TODO: fill data
- Q_UNUSED(data);
- --i;
- return maxlen;
+ WinRtDatagram datagram = d->pendingDatagrams.takeFirst();
+ if (addr)
+ *addr = datagram.address;
+
+ if (port)
+ *port = datagram.port;
+
+ QByteArray readOrigin;
+ // Do not read the whole datagram. Put the rest of it back into the "queue"
+ if (maxlen < datagram.data.length()) {
+ QByteArray readOrigin = datagram.data.left(maxlen);
+ datagram.data = datagram.data.remove(0, maxlen);
+ d->pendingDatagrams.prepend(datagram);
+ } else {
+ readOrigin = datagram.data;
}
-
- return -1;
+ strcpy(data, readOrigin);
+ return readOrigin.length();
}
qint64 QNativeSocketEngine::writeDatagram(const char *data, qint64 len, const QHostAddress &addr, quint16 port)
@@ -609,17 +595,10 @@ bool QNativeSocketEngine::hasPendingDatagrams() const
qint64 QNativeSocketEngine::pendingDatagramSize() const
{
Q_D(const QNativeSocketEngine);
- qint64 ret = 0;
- foreach (IDatagramSocketMessageReceivedEventArgs *arg, d->pendingDatagrams) {
- ComPtr<IDataReader> reader;
- UINT32 unconsumedBufferLength;
- arg->GetDataReader(&reader);
- if (!reader)
- return -1;
- reader->get_UnconsumedBufferLength(&unconsumedBufferLength);
- ret += unconsumedBufferLength;
- }
- return ret;
+ if (d->pendingDatagrams.isEmpty())
+ return -1;
+
+ return d->pendingDatagrams.at(0).data.length();
}
qint64 QNativeSocketEngine::bytesToWrite() const
@@ -1236,7 +1215,32 @@ HRESULT QNativeSocketEnginePrivate::handleNewDatagram(IDatagramSocket *socket, I
{
Q_Q(QNativeSocketEngine);
Q_UNUSED(socket);
- pendingDatagrams.append(args);
+
+ WinRtDatagram datagram;
+ QHostAddress returnAddress;
+ ComPtr<IHostName> remoteHost;
+ HRESULT hr = args->get_RemoteAddress(&remoteHost);
+ RETURN_OK_IF_FAILED("Could not obtain remote host");
+ HString remoteHostString;
+ remoteHost->get_CanonicalName(remoteHostString.GetAddressOf());
+ RETURN_OK_IF_FAILED("Could not obtain remote host's canonical name");
+ returnAddress.setAddress(qt_QStringFromHString(remoteHostString));
+ datagram.address = returnAddress;
+ HString remotePort;
+ hr = args->get_RemotePort(remotePort.GetAddressOf());
+ RETURN_OK_IF_FAILED("Could not obtain remote port");
+ datagram.port = qt_QStringFromHString(remotePort).toInt();
+
+ ComPtr<IDataReader> reader;
+ hr = args->GetDataReader(&reader);
+ RETURN_OK_IF_FAILED("Could not obtain data reader");
+ quint32 length;
+ hr = reader->get_UnconsumedBufferLength(&length);
+ RETURN_OK_IF_FAILED("Could not obtain unconsumed buffer length");
+ datagram.data.resize(length);
+ hr = reader->ReadBytes(length, reinterpret_cast<BYTE *>(datagram.data.data()));
+ RETURN_OK_IF_FAILED("Could not read datagram");
+ pendingDatagrams.append(datagram);
emit q->readReady();
return S_OK;
diff --git a/src/network/socket/qnativesocketengine_winrt_p.h b/src/network/socket/qnativesocketengine_winrt_p.h
index 7652a09b17..716403097d 100644
--- a/src/network/socket/qnativesocketengine_winrt_p.h
+++ b/src/network/socket/qnativesocketengine_winrt_p.h
@@ -55,6 +55,12 @@ QT_BEGIN_NAMESPACE
class QNativeSocketEnginePrivate;
+struct WinRtDatagram {
+ QByteArray data;
+ int port;
+ QHostAddress address;
+};
+
class Q_AUTOTEST_EXPORT QNativeSocketEngine : public QAbstractSocketEngine
{
Q_OBJECT
@@ -197,7 +203,8 @@ private:
Microsoft::WRL::ComPtr<ABI::Windows::Foundation::IAsyncAction> connectOp;
QBuffer readBytes;
QMutex readMutex;
- QList<ABI::Windows::Networking::Sockets::IDatagramSocketMessageReceivedEventArgs *> pendingDatagrams;
+
+ QList<WinRtDatagram> pendingDatagrams;
QList<ABI::Windows::Networking::Sockets::IStreamSocket *> pendingConnections;
QList<ABI::Windows::Networking::Sockets::IStreamSocket *> currentConnections;
QEventLoop eventLoop;
diff --git a/src/network/ssl/qsslkey_openssl.cpp b/src/network/ssl/qsslkey_openssl.cpp
index 6b0fa954eb..e4d30ff229 100644
--- a/src/network/ssl/qsslkey_openssl.cpp
+++ b/src/network/ssl/qsslkey_openssl.cpp
@@ -95,7 +95,7 @@ bool QSslKeyPrivate::fromEVP_PKEY(EVP_PKEY *pkey)
type = QSsl::PrivateKey;
dsa = q_DSA_new();
- memcpy(rsa, q_EVP_PKEY_get1_DSA(pkey), sizeof(DSA));
+ memcpy(dsa, q_EVP_PKEY_get1_DSA(pkey), sizeof(DSA));
return true;
}
diff --git a/src/network/ssl/qsslsocket_openssl_symbols.cpp b/src/network/ssl/qsslsocket_openssl_symbols.cpp
index d919d8e934..71b8237e03 100644
--- a/src/network/ssl/qsslsocket_openssl_symbols.cpp
+++ b/src/network/ssl/qsslsocket_openssl_symbols.cpp
@@ -63,6 +63,9 @@
#if defined(Q_OS_LINUX) && !defined(Q_OS_ANDROID)
#include <link.h>
#endif
+#ifdef Q_OS_DARWIN
+#include "private/qcore_mac_p.h"
+#endif
#include <algorithm>
@@ -107,6 +110,8 @@ QT_BEGIN_NAMESPACE
possibly with a different version of OpenSSL.
*/
+#ifndef QT_LINKED_OPENSSL
+
namespace {
void qsslSocketUnresolvedSymbolWarning(const char *functionName)
{
@@ -119,6 +124,8 @@ void qsslSocketCannotResolveSymbolWarning(const char *functionName)
}
}
+#endif // QT_LINKED_OPENSSL
+
#ifdef SSLEAY_MACROS
DEFINEFUNC3(void *, ASN1_dup, i2d_of_void *a, a, d2i_of_void *b, b, char *c, c, return 0, return)
#endif
@@ -448,6 +455,15 @@ static QStringList libraryPathList()
# ifdef Q_OS_DARWIN
paths = QString::fromLatin1(qgetenv("DYLD_LIBRARY_PATH"))
.split(QLatin1Char(':'), QString::SkipEmptyParts);
+
+ // search in .app/Contents/Frameworks
+ UInt32 packageType;
+ CFBundleGetPackageInfo(CFBundleGetMainBundle(), &packageType, NULL);
+ if (packageType == FOUR_CHAR_CODE('APPL')) {
+ QUrl bundleUrl = QUrl::fromCFURL(QCFType<CFURLRef>(CFBundleCopyBundleURL(CFBundleGetMainBundle())));
+ QUrl frameworksUrl = QUrl::fromCFURL(QCFType<CFURLRef>(CFBundleCopyPrivateFrameworksURL(CFBundleGetMainBundle())));
+ paths << bundleUrl.resolved(frameworksUrl).path();
+ }
# else
paths = QString::fromLatin1(qgetenv("LD_LIBRARY_PATH"))
.split(QLatin1Char(':'), QString::SkipEmptyParts);
@@ -597,7 +613,13 @@ static QPair<QLibrary*, QLibrary*> loadOpenSsl()
}
#endif
+#ifndef Q_OS_DARWIN
// second attempt: find the development files libssl.so and libcrypto.so
+ //
+ // disabled on OS X/iOS:
+ // OS X's /usr/lib/libssl.dylib, /usr/lib/libcrypto.dylib will be picked up in the third
+ // attempt, _after_ <bundle>/Contents/Frameworks has been searched.
+ // iOS does not ship a system libssl.dylib, libcrypto.dylib in the first place.
libssl->setFileNameAndVersion(QLatin1String("ssl"), -1);
libcrypto->setFileNameAndVersion(QLatin1String("crypto"), -1);
if (libcrypto->load() && libssl->load()) {
@@ -607,6 +629,7 @@ static QPair<QLibrary*, QLibrary*> loadOpenSsl()
libssl->unload();
libcrypto->unload();
}
+#endif
// third attempt: loop on the most common library paths and find libssl
QStringList sslList = findAllLibSsl();