summaryrefslogtreecommitdiffstats
path: root/src/network
diff options
context:
space:
mode:
Diffstat (limited to 'src/network')
-rw-r--r--src/network/access/access.pri10
-rw-r--r--src/network/access/qhttpnetworkconnectionchannel.cpp2
-rw-r--r--src/network/access/qnetworkaccessmanager.cpp10
-rw-r--r--src/network/access/qnetworkreplynsurlconnectionimpl.mm458
-rw-r--r--src/network/access/qnetworkreplynsurlconnectionimpl_p.h87
-rw-r--r--src/network/kernel/qdnslookup_unix.cpp7
-rw-r--r--src/network/socket/qnativesocketengine_unix.cpp6
-rw-r--r--src/network/socket/qnativesocketengine_winrt.cpp30
-rw-r--r--src/network/socket/qnativesocketengine_winrt_p.h3
-rw-r--r--src/network/socket/qsocks5socketengine.cpp4
-rw-r--r--src/network/ssl/qsslsocket.cpp3
11 files changed, 32 insertions, 588 deletions
diff --git a/src/network/access/access.pri b/src/network/access/access.pri
index 42c7c80f3b..38e9c25269 100644
--- a/src/network/access/access.pri
+++ b/src/network/access/access.pri
@@ -72,14 +72,4 @@ SOURCES += \
mac: LIBS_PRIVATE += -framework Security
-ios {
- HEADERS += \
- access/qnetworkreplynsurlconnectionimpl_p.h
-
- OBJECTIVE_SOURCES += \
- access/qnetworkreplynsurlconnectionimpl.mm
-
- LIBS_PRIVATE += -framework Foundation
-}
-
include($$PWD/../../3rdparty/zlib_dependency.pri)
diff --git a/src/network/access/qhttpnetworkconnectionchannel.cpp b/src/network/access/qhttpnetworkconnectionchannel.cpp
index 56716cbe01..2f7be01078 100644
--- a/src/network/access/qhttpnetworkconnectionchannel.cpp
+++ b/src/network/access/qhttpnetworkconnectionchannel.cpp
@@ -331,7 +331,7 @@ bool QHttpNetworkConnectionChannel::ensureConnection()
priv->phase = QAuthenticatorPrivate::Start;
QString connectHost = connection->d_func()->hostName;
- qint16 connectPort = connection->d_func()->port;
+ quint16 connectPort = connection->d_func()->port;
#ifndef QT_NO_NETWORKPROXY
// HTTPS always use transparent proxy.
diff --git a/src/network/access/qnetworkaccessmanager.cpp b/src/network/access/qnetworkaccessmanager.cpp
index 927e103abc..587ab27a0f 100644
--- a/src/network/access/qnetworkaccessmanager.cpp
+++ b/src/network/access/qnetworkaccessmanager.cpp
@@ -56,10 +56,6 @@
#include "qnetworkreplydataimpl_p.h"
#include "qnetworkreplyfileimpl_p.h"
-#if defined(Q_OS_IOS) && defined(QT_NO_SSL)
-#include "qnetworkreplynsurlconnectionimpl_p.h"
-#endif
-
#include "QtCore/qbuffer.h"
#include "QtCore/qurl.h"
#include "QtCore/qvector.h"
@@ -1207,12 +1203,6 @@ QNetworkReply *QNetworkAccessManager::createRequest(QNetworkAccessManager::Opera
}
}
-// Use NSURLConnection for https on iOS when OpenSSL is disabled.
-#if defined(Q_OS_IOS) && defined(QT_NO_SSL)
- if (scheme == QLatin1String("https"))
- return new QNetworkReplyNSURLConnectionImpl(this, request, op, outgoingData);
-#endif
-
#ifndef QT_NO_HTTP
// Since Qt 5 we use the new QNetworkReplyHttpImpl
if (scheme == QLatin1String("http") || scheme == QLatin1String("preconnect-http")
diff --git a/src/network/access/qnetworkreplynsurlconnectionimpl.mm b/src/network/access/qnetworkreplynsurlconnectionimpl.mm
deleted file mode 100644
index 58a3ba1448..0000000000
--- a/src/network/access/qnetworkreplynsurlconnectionimpl.mm
+++ /dev/null
@@ -1,458 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtNetwork module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qnetworkreplynsurlconnectionimpl_p.h"
-
-#include "QtCore/qdatetime.h"
-#include <QtCore/qcoreapplication.h>
-#include <QtCore/qdebug.h>
-#include <Foundation/Foundation.h>
-
-QT_BEGIN_NAMESPACE
-
-// Network reply implementation using NSUrlConnection.
-//
-// Class/object structure:
-//
-// QNetworkReplyNSURLConnectionImpl
-// |- QNetworkReplyNSURLConnectionImplPrivate
-// |- (bytes read)
-// |- (QIODevice and CFStream for async POST data transfer)
-// |- NSURLConnection
-// |- QtNSURLConnectionDelegate <NSURLConnectionDataDelegate>
-// |- NSURLResponse/NSHTTPURLResponse
-// |- (response data)
-//
-// The main entry point is the QNetworkReplyNSURLConnectionImpl constructor, which
-// receives a network request from QNetworkAccessManager. The constructor
-// creates a NSURLRequest and initiates a NSURLConnection with a QtNSURLConnectionDelegate.
-// The delegate callbacks are then called asynchronously as the request completes.
-//
-
-@class QtNSURLConnectionDelegate;
-class QNetworkReplyNSURLConnectionImplPrivate: public QNetworkReplyPrivate
-{
-public:
- QNetworkReplyNSURLConnectionImplPrivate();
- virtual ~QNetworkReplyNSURLConnectionImplPrivate();
-
- Q_DECLARE_PUBLIC(QNetworkReplyNSURLConnectionImpl)
- NSURLConnection * urlConnection;
- QtNSURLConnectionDelegate *urlConnectionDelegate;
- qint64 bytesRead;
-
- // Sequental outgiong data streaming
- QIODevice *outgoingData;
- CFReadStreamRef readStream;
- CFWriteStreamRef writeStream;
- CFIndex transferBufferSize;
-
- // Forwarding functions to the public class.
- void setFinished();
- void setHeader(QNetworkRequest::KnownHeaders header, const QVariant &value);
- void setRawHeader(const QByteArray &headerName, const QByteArray &value);
- void setError(QNetworkReply::NetworkError errorCode, const QString &errorString);
- void setAttribute(QNetworkRequest::Attribute code, const QVariant &value);
-};
-
-@interface QtNSURLConnectionDelegate : NSObject
-{
- NSURLResponse *response;
- NSMutableData *responseData;
- QNetworkReplyNSURLConnectionImplPrivate * replyprivate;
-}
-
-- (id)initWithQNetworkReplyNSURLConnectionImplPrivate:(QNetworkReplyNSURLConnectionImplPrivate *)a_replyPrivate ;
-#if QT_MAC_PLATFORM_SDK_EQUAL_OR_ABOVE(__MAC_10_7, __IPHONE_3_0)
-- (void)connection:(NSURLConnection *)connection willSendRequestForAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge;
-#endif
-- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError*)error;
-- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse*)response;
-- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData*)data;
-- (void)connection:(NSURLConnection *)connection didSendBodyData:(NSInteger)bytesWritten
- totalBytesWritten:(NSInteger)totalBytesWritten totalBytesExpectedToWrite:(NSInteger)totalBytesExpectedToWrite;
-- (NSCachedURLResponse*)connection:(NSURLConnection*)connection willCacheResponse:(NSCachedURLResponse*)cachedResponse;
-- (NSURLRequest*)connection:(NSURLConnection*)connection willSendRequest:(NSURLRequest*)request redirectResponse:(NSURLResponse*)redirectResponse;
-- (void)connectionDidFinishLoading:(NSURLConnection*)connection;
-- (BOOL)connectionShouldUseCredentialStorage:(NSURLConnection*)connection;
-
-@end
-
-QNetworkReplyNSURLConnectionImplPrivate::QNetworkReplyNSURLConnectionImplPrivate()
- : QNetworkReplyPrivate()
- , urlConnection(0)
- , urlConnectionDelegate(0)
- , bytesRead(0)
- , readStream(0)
- , writeStream(0)
- , transferBufferSize(4096)
-{
-}
-
-QNetworkReplyNSURLConnectionImplPrivate::~QNetworkReplyNSURLConnectionImplPrivate()
-{
- [urlConnection cancel];
- [urlConnection release];
- [urlConnectionDelegate release];
- if (readStream)
- CFRelease(readStream);
- if (writeStream)
- CFRelease(writeStream);
-}
-
-void QNetworkReplyNSURLConnectionImplPrivate::setFinished()
-{
- q_func()->setFinished(true);
- QMetaObject::invokeMethod(q_func(), "finished", Qt::QueuedConnection);
-}
-
-void QNetworkReplyNSURLConnectionImplPrivate::setHeader(QNetworkRequest::KnownHeaders header, const QVariant &value)
-{
- q_func()->setHeader(header, value);
-}
-
-void QNetworkReplyNSURLConnectionImplPrivate::setRawHeader(const QByteArray &headerName, const QByteArray &value)
-{
- q_func()->setRawHeader(headerName, value);
-}
-
-void QNetworkReplyNSURLConnectionImplPrivate::setError(QNetworkReply::NetworkError errorCode, const QString &errorString)
-{
- q_func()->setError(errorCode, errorString);
-}
-
-void QNetworkReplyNSURLConnectionImplPrivate::setAttribute(QNetworkRequest::Attribute code, const QVariant &value)
-{
- q_func()->setAttribute(code, value);
-}
-
-void QNetworkReplyNSURLConnectionImpl::readyReadOutgoingData()
-{
- Q_D(QNetworkReplyNSURLConnectionImpl);
- int bytesRead = 0;
- do {
- char data[d->transferBufferSize];
- bytesRead = d->outgoingData->read(data, d->transferBufferSize);
- if (bytesRead <= 0)
- break;
- CFIndex bytesWritten = CFWriteStreamWrite(d->writeStream, reinterpret_cast<unsigned char *>(data), bytesRead);
- if (bytesWritten != bytesRead) {
- CFErrorRef err = CFWriteStreamCopyError(d->writeStream);
- qWarning() << "QNetworkReplyNSURLConnectionImpl: CFWriteStreamWrite error"
- << (err ? QString::number(CFErrorGetCode(err)) : QStringLiteral(""));
- }
- } while (bytesRead > 0);
-
- if (d->outgoingData->atEnd())
- CFWriteStreamClose(d->writeStream);
-}
-
-@interface QtNSURLConnectionDelegate ()
-
-@property (nonatomic, retain) NSURLResponse* response;
-@property (nonatomic, retain) NSMutableData* responseData;
-
-@end
-
-@implementation QtNSURLConnectionDelegate
-
-@synthesize response;
-@synthesize responseData;
-
-- (id)initWithQNetworkReplyNSURLConnectionImplPrivate:(QNetworkReplyNSURLConnectionImplPrivate *)a_replyPrivate
-{
- if (self = [super init])
- replyprivate = a_replyPrivate;
- return self;
-}
-
-- (void)dealloc
-{
- [response release];
- [responseData release];
- [super dealloc];
-}
-
-#if QT_MAC_PLATFORM_SDK_EQUAL_OR_ABOVE(__MAC_10_7, __IPHONE_3_0)
-- (void)connection:(NSURLConnection *)connection willSendRequestForAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge
-{
- Q_UNUSED(connection)
- Q_UNUSED(challenge)
-
- if ([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust]) {
- SecTrustRef serverTrust = challenge.protectionSpace.serverTrust;
- SecTrustResultType resultType;
- SecTrustEvaluate(serverTrust, &resultType);
- if (resultType == kSecTrustResultUnspecified) {
- // All good
- [challenge.sender performDefaultHandlingForAuthenticationChallenge:challenge];
- } else if (resultType == kSecTrustResultRecoverableTrustFailure) {
- // Certificate verification error, ask user
- // ### TODO actually ask user
- // (test site: https://testssl-expire.disig.sk/index.en.html)
- qWarning() << "QNetworkReplyNSURLConnection: Certificate verification error handlig is"
- << "not implemented. Connection will time out.";
- } else {
- // other error, which the default handler will handle
- [challenge.sender performDefaultHandlingForAuthenticationChallenge:challenge];
- }
- }
-
- [challenge.sender performDefaultHandlingForAuthenticationChallenge:challenge];
-}
-#endif
-
-- (void)connection:(NSURLConnection*)connection didFailWithError:(NSError*)error
-{
- Q_UNUSED(connection)
-
- QNetworkReply::NetworkError qtError = QNetworkReply::UnknownNetworkError;
- if ([[error domain] isEqualToString:NSURLErrorDomain]) {
- switch ([error code]) {
- case NSURLErrorTimedOut: qtError = QNetworkReply::TimeoutError; break;
- case NSURLErrorUnsupportedURL: qtError = QNetworkReply::ProtocolUnknownError; break;
- case NSURLErrorCannotFindHost: qtError = QNetworkReply::HostNotFoundError; break;
- case NSURLErrorCannotConnectToHost: qtError = QNetworkReply::ConnectionRefusedError; break;
- case NSURLErrorNetworkConnectionLost: qtError = QNetworkReply::NetworkSessionFailedError; break;
- case NSURLErrorDNSLookupFailed: qtError = QNetworkReply::HostNotFoundError; break;
- case NSURLErrorNotConnectedToInternet: qtError = QNetworkReply::NetworkSessionFailedError; break;
- case NSURLErrorUserAuthenticationRequired: qtError = QNetworkReply::AuthenticationRequiredError; break;
- default: break;
- }
- }
-
- replyprivate->setError(qtError, QString::fromNSString([error localizedDescription]));
- replyprivate->setFinished();
-}
-
-- (void)connection:(NSURLConnection*)connection didReceiveResponse:(NSURLResponse*)aResponse
-{
- Q_UNUSED(connection)
- self.response = aResponse;
- self.responseData = [NSMutableData data];
-
- // copy headers
- if ([aResponse isKindOfClass:[NSHTTPURLResponse class]]) {
- NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse*)aResponse;
- NSDictionary *headers = [httpResponse allHeaderFields];
- for (NSString *key in headers) {
- NSString *value = [headers objectForKey:key];
- replyprivate->setRawHeader(QString::fromNSString(key).toUtf8(), QString::fromNSString(value).toUtf8());
- }
-
- int code = [httpResponse statusCode];
- replyprivate->setAttribute(QNetworkRequest::HttpStatusCodeAttribute, code);
- } else {
- if ([aResponse expectedContentLength] != NSURLResponseUnknownLength)
- replyprivate->setHeader(QNetworkRequest::ContentLengthHeader, [aResponse expectedContentLength]);
- }
-
- QMetaObject::invokeMethod(replyprivate->q_func(), "metaDataChanged", Qt::QueuedConnection);
-}
-
-- (void)connection:(NSURLConnection*)connection didReceiveData:(NSData*)data
-{
- Q_UNUSED(connection)
- [responseData appendData:data];
-
- if ([response expectedContentLength] != NSURLResponseUnknownLength) {
- QMetaObject::invokeMethod(replyprivate->q_func(), "downloadProgress", Qt::QueuedConnection,
- Q_ARG(qint64, qint64([responseData length] + replyprivate->bytesRead)),
- Q_ARG(qint64, qint64([response expectedContentLength])));
- }
-
- QMetaObject::invokeMethod(replyprivate->q_func(), "readyRead", Qt::QueuedConnection);
-}
-
-- (void)connection:(NSURLConnection*)connection didSendBodyData:(NSInteger)bytesWritten totalBytesWritten:(NSInteger)totalBytesWritten
- totalBytesExpectedToWrite:(NSInteger)totalBytesExpectedToWrite
-{
- Q_UNUSED(connection)
- Q_UNUSED(bytesWritten)
- QMetaObject::invokeMethod(replyprivate->q_func(), "uploadProgress", Qt::QueuedConnection,
- Q_ARG(qint64, qint64(totalBytesWritten)),
- Q_ARG(qint64, qint64(totalBytesExpectedToWrite)));
-}
-
-- (NSCachedURLResponse*)connection:(NSURLConnection*)connection willCacheResponse:(NSCachedURLResponse*)cachedResponse
-{
- Q_UNUSED(connection)
- return cachedResponse;
-}
-
-- (NSURLRequest*)connection:(NSURLConnection*)connection willSendRequest:(NSURLRequest*)request redirectResponse:(NSURLResponse*)redirectResponse
-{
- Q_UNUSED(connection)
- Q_UNUSED(redirectResponse)
- return request;
-}
-
-- (void)connectionDidFinishLoading:(NSURLConnection*)connection
-{
- Q_UNUSED(connection)
- replyprivate->setFinished();
-}
-
-- (BOOL)connectionShouldUseCredentialStorage:(NSURLConnection*)connection
-{
- Q_UNUSED(connection)
- return YES;
-}
-
-@end
-
-QNetworkReplyNSURLConnectionImpl::~QNetworkReplyNSURLConnectionImpl()
-{
-}
-
-QNetworkReplyNSURLConnectionImpl::QNetworkReplyNSURLConnectionImpl(QObject *parent,
- const QNetworkRequest &request, const QNetworkAccessManager::Operation operation, QIODevice* outgoingData)
- : QNetworkReply(*new QNetworkReplyNSURLConnectionImplPrivate(), parent)
-{
- setRequest(request);
- setUrl(request.url());
- setOperation(operation);
- QNetworkReply::open(QIODevice::ReadOnly);
-
- QNetworkReplyNSURLConnectionImplPrivate *d = (QNetworkReplyNSURLConnectionImplPrivate*) d_func();
-
- QUrl url = request.url();
- if (url.host() == QLatin1String("localhost"))
- url.setHost(QString());
-
- if (url.path().isEmpty())
- url.setPath(QLatin1String("/"));
- setUrl(url);
-
- // Create a NSMutableURLRequest from QNetworkRequest
- NSMutableURLRequest *nsRequest = [NSMutableURLRequest requestWithURL:request.url().toNSURL()
- cachePolicy:NSURLRequestUseProtocolCachePolicy
- timeoutInterval:60.0];
- // copy headers
- const auto headers = request.rawHeaderList();
- for (const QByteArray &header : headers) {
- QByteArray headerValue = request.rawHeader(header);
- [nsRequest addValue:QString::fromUtf8(headerValue).toNSString()
- forHTTPHeaderField:QString::fromUtf8(header).toNSString()];
- }
-
- if (operation == QNetworkAccessManager::GetOperation)
- [nsRequest setHTTPMethod:@"GET"];
- else if (operation == QNetworkAccessManager::PostOperation)
- [nsRequest setHTTPMethod:@"POST"];
- else if (operation == QNetworkAccessManager::PutOperation)
- [nsRequest setHTTPMethod:@"PUT"];
- else if (operation == QNetworkAccessManager::DeleteOperation)
- [nsRequest setHTTPMethod:@"DELETE"];
- else
- qWarning() << "QNetworkReplyNSURLConnection: Unsupported netork operation" << operation;
-
- if (outgoingData) {
- d->outgoingData = outgoingData;
- if (outgoingData->isSequential()) {
- // set up streaming from outgoingData iodevice to request
- CFStreamCreateBoundPair(kCFAllocatorDefault, &d->readStream, &d->writeStream, d->transferBufferSize);
- CFWriteStreamOpen(d->writeStream);
- [nsRequest setHTTPBodyStream:reinterpret_cast<NSInputStream *>(d->readStream)];
- connect(outgoingData, SIGNAL(readyRead()), this, SLOT(readyReadOutgoingData()));
- readyReadOutgoingData();
- } else {
- // move all data at once
- QByteArray data = outgoingData->readAll();
- [nsRequest setHTTPBody:[NSData dataWithBytes:data.constData() length:data.length()]];
- }
- }
-
- // Create connection
- d->urlConnectionDelegate = [[QtNSURLConnectionDelegate alloc] initWithQNetworkReplyNSURLConnectionImplPrivate:d];
- d->urlConnection = [[NSURLConnection alloc] initWithRequest:nsRequest delegate:d->urlConnectionDelegate];
- if (!d->urlConnection) {
- // ### what type of error is an initWithRequest fail?
- setError(QNetworkReply::ProtocolUnknownError, QStringLiteral("QNetworkReplyNSURLConnection internal error"));
- }
-}
-
-void QNetworkReplyNSURLConnectionImpl::close()
-{
- // No-op? Network ops should continue (especially POSTs)
- QNetworkReply::close();
-}
-
-void QNetworkReplyNSURLConnectionImpl::abort()
-{
- Q_D(QNetworkReplyNSURLConnectionImpl);
- [d->urlConnection cancel];
- QNetworkReply::close();
-}
-
-qint64 QNetworkReplyNSURLConnectionImpl::bytesAvailable() const
-{
- Q_D(const QNetworkReplyNSURLConnectionImpl);
- qint64 available = QNetworkReply::bytesAvailable() +
- [[d->urlConnectionDelegate responseData] length];
- return available;
-}
-
-bool QNetworkReplyNSURLConnectionImpl::isSequential() const
-{
- return true;
-}
-
-qint64 QNetworkReplyNSURLConnectionImpl::size() const
-{
- Q_D(const QNetworkReplyNSURLConnectionImpl);
- return [[d->urlConnectionDelegate responseData] length] + d->bytesRead;
-}
-
-/*!
- \internal
-*/
-qint64 QNetworkReplyNSURLConnectionImpl::readData(char *data, qint64 maxlen)
-{
- Q_D(QNetworkReplyNSURLConnectionImpl);
- qint64 dataSize = [[d->urlConnectionDelegate responseData] length];
- qint64 canRead = qMin(maxlen, dataSize);
- const char *sourceBase = static_cast<const char *>([[d->urlConnectionDelegate responseData] bytes]);
- memcpy(data, sourceBase, canRead);
- [[d->urlConnectionDelegate responseData] replaceBytesInRange:NSMakeRange(0, canRead) withBytes:NULL length:0];
- d->bytesRead += canRead;
- return canRead;
-}
-
-QT_END_NAMESPACE
diff --git a/src/network/access/qnetworkreplynsurlconnectionimpl_p.h b/src/network/access/qnetworkreplynsurlconnectionimpl_p.h
deleted file mode 100644
index c948e66629..0000000000
--- a/src/network/access/qnetworkreplynsurlconnectionimpl_p.h
+++ /dev/null
@@ -1,87 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtNetwork module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or (at your option) the GNU General
-** Public license version 3 or any later version approved by the KDE Free
-** Qt Foundation. The licenses are as published by the Free Software
-** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-2.0.html and
-** https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QNETWORKREPLYNSURLCONNECTIONIMPL_H
-#define QNETWORKREPLYNSURLCONNECTIONIMPL_H
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists for the convenience
-// of the Network Access API. This header file may change from
-// version to version without notice, or even be removed.
-//
-// We mean it.
-//
-
-#include "qnetworkreply.h"
-#include "qnetworkreply_p.h"
-#include "qnetworkaccessmanager.h"
-#include <QFile>
-#include <private/qabstractfileengine_p.h>
-
-QT_BEGIN_NAMESPACE
-
-
-class QNetworkReplyNSURLConnectionImplPrivate;
-class QNetworkReplyNSURLConnectionImpl: public QNetworkReply
-{
- Q_OBJECT
-public:
- QNetworkReplyNSURLConnectionImpl(QObject *parent, const QNetworkRequest &req, const QNetworkAccessManager::Operation op, QIODevice* outgoingData);
- virtual ~QNetworkReplyNSURLConnectionImpl();
- virtual void abort();
-
- // reimplemented from QNetworkReply
- virtual void close();
- virtual qint64 bytesAvailable() const;
- virtual bool isSequential () const;
- qint64 size() const;
-
- virtual qint64 readData(char *data, qint64 maxlen);
-public Q_SLOTS:
- void readyReadOutgoingData();
-
- Q_DECLARE_PRIVATE(QNetworkReplyNSURLConnectionImpl)
-};
-
-QT_END_NAMESPACE
-
-#endif // QNetworkReplyNSURLConnectionImpl_H
diff --git a/src/network/kernel/qdnslookup_unix.cpp b/src/network/kernel/qdnslookup_unix.cpp
index 35981a2f2c..41038dc8da 100644
--- a/src/network/kernel/qdnslookup_unix.cpp
+++ b/src/network/kernel/qdnslookup_unix.cpp
@@ -47,7 +47,9 @@
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/nameser.h>
-#include <arpa/nameser_compat.h>
+#if !defined(Q_OS_OPENBSD)
+# include <arpa/nameser_compat.h>
+#endif
#include <resolv.h>
#if defined(__GNU_LIBRARY__) && !defined(__UCLIBC__)
@@ -58,6 +60,9 @@ QT_BEGIN_NAMESPACE
#ifndef QT_NO_LIBRARY
+#if defined(Q_OS_OPENBSD)
+typedef struct __res_state* res_state;
+#endif
typedef int (*dn_expand_proto)(const unsigned char *, const unsigned char *, const unsigned char *, char *, int);
static dn_expand_proto local_dn_expand = 0;
typedef void (*res_nclose_proto)(res_state);
diff --git a/src/network/socket/qnativesocketengine_unix.cpp b/src/network/socket/qnativesocketengine_unix.cpp
index b3e456be69..7ef9d7f26b 100644
--- a/src/network/socket/qnativesocketengine_unix.cpp
+++ b/src/network/socket/qnativesocketengine_unix.cpp
@@ -560,7 +560,9 @@ int QNativeSocketEnginePrivate::nativeAccept()
setError(QAbstractSocket::SocketResourceError, NotSocketErrorString);
break;
case EPROTONOSUPPORT:
+#if !defined(Q_OS_OPENBSD)
case EPROTO:
+#endif
case EAFNOSUPPORT:
case EINVAL:
setError(QAbstractSocket::UnsupportedSocketOperationError, ProtocolUnsupportedErrorString);
@@ -900,7 +902,9 @@ qint64 QNativeSocketEnginePrivate::nativeReceiveDatagram(char *data, qint64 maxS
if (cmsgptr->cmsg_level == IPPROTO_IP && cmsgptr->cmsg_type == IP_RECVIF
&& cmsgptr->cmsg_len >= CMSG_LEN(sizeof(sockaddr_dl))) {
sockaddr_dl *sdl = reinterpret_cast<sockaddr_dl *>(CMSG_DATA(cmsgptr));
-
+# if defined(Q_OS_OPENBSD)
+# define LLINDEX(s) ((s)->sdl_index)
+# endif
header->ifindex = LLINDEX(sdl);
}
# endif
diff --git a/src/network/socket/qnativesocketengine_winrt.cpp b/src/network/socket/qnativesocketengine_winrt.cpp
index 181c49f200..dd43615f98 100644
--- a/src/network/socket/qnativesocketengine_winrt.cpp
+++ b/src/network/socket/qnativesocketengine_winrt.cpp
@@ -337,7 +337,7 @@ bool QNativeSocketEngine::connectToHostByName(const QString &name, quint16 port)
d->socketState = QAbstractSocket::ConnectingState;
hr = QEventDispatcherWinRT::runOnXamlThread([d]() {
return d->connectOp->put_Completed(Callback<IAsyncActionCompletedHandler>(
- d, &QNativeSocketEnginePrivate::handleConnectToHost).Get());
+ d, &QNativeSocketEnginePrivate::handleConnectOpFinished).Get());
});
Q_ASSERT_SUCCEEDED(hr);
@@ -477,7 +477,10 @@ void QNativeSocketEngine::close()
hr = socket3->CancelIOAsync(&action);
Q_ASSERT_SUCCEEDED(hr);
hr = QWinRTFunctions::await(action);
- Q_ASSERT_SUCCEEDED(hr);
+ // If there is no pending IO (no read established before) the function will fail with
+ // "function was called at an unexpected time" which is fine.
+ if (hr != E_ILLEGAL_METHOD_CALL)
+ Q_ASSERT_SUCCEEDED(hr);
return S_OK;
});
Q_ASSERT_SUCCEEDED(hr);
@@ -759,7 +762,7 @@ bool QNativeSocketEngine::waitForWrite(int msecs, bool *timedOut)
if (d->socketState == QAbstractSocket::ConnectingState) {
HRESULT hr = QWinRTFunctions::await(d->connectOp, QWinRTFunctions::ProcessMainThreadEvents);
if (SUCCEEDED(hr)) {
- d->handleConnectionEstablished(d->connectOp.Get());
+ d->handleConnectOpFinished(d->connectOp.Get(), Completed);
return true;
}
}
@@ -1214,38 +1217,32 @@ HRESULT QNativeSocketEnginePrivate::handleClientConnection(IStreamSocketListener
return S_OK;
}
-HRESULT QNativeSocketEnginePrivate::handleConnectToHost(IAsyncAction *action, AsyncStatus)
-{
- handleConnectionEstablished(action);
- return S_OK;
-}
-
-void QNativeSocketEnginePrivate::handleConnectionEstablished(IAsyncAction *action)
+HRESULT QNativeSocketEnginePrivate::handleConnectOpFinished(IAsyncAction *action, AsyncStatus)
{
Q_Q(QNativeSocketEngine);
if (wasDeleted || !connectOp) // Protect against a late callback
- return;
+ return S_OK;
HRESULT hr = action->GetResults();
switch (hr) {
case 0x8007274c: // A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond.
setError(QAbstractSocket::NetworkError, ConnectionTimeOutErrorString);
socketState = QAbstractSocket::UnconnectedState;
- break;
+ return S_OK;
case 0x80072751: // A socket operation was attempted to an unreachable host.
setError(QAbstractSocket::HostNotFoundError, HostUnreachableErrorString);
socketState = QAbstractSocket::UnconnectedState;
- break;
+ return S_OK;
case 0x8007274d: // No connection could be made because the target machine actively refused it.
setError(QAbstractSocket::ConnectionRefusedError, ConnectionRefusedErrorString);
socketState = QAbstractSocket::UnconnectedState;
- break;
+ return S_OK;
default:
if (FAILED(hr)) {
setError(QAbstractSocket::UnknownSocketError, UnknownSocketErrorString);
socketState = QAbstractSocket::UnconnectedState;
+ return S_OK;
}
- break;
}
// The callback might be triggered several times if we do not cancel/reset it here
@@ -1267,13 +1264,14 @@ void QNativeSocketEnginePrivate::handleConnectionEstablished(IAsyncAction *actio
emit q->connectionReady();
if (socketType != QAbstractSocket::TcpSocket)
- return;
+ return S_OK;
// Delay the reader so that the SSL socket can upgrade
if (sslSocket)
QObject::connect(qobject_cast<QSslSocket *>(sslSocket), &QSslSocket::encrypted, q, &QNativeSocketEngine::establishRead);
else
q->establishRead();
+ return S_OK;
}
HRESULT QNativeSocketEnginePrivate::handleReadyRead(IAsyncBufferOperation *asyncInfo, AsyncStatus status)
diff --git a/src/network/socket/qnativesocketengine_winrt_p.h b/src/network/socket/qnativesocketengine_winrt_p.h
index 325e4965e6..5b76c2d223 100644
--- a/src/network/socket/qnativesocketengine_winrt_p.h
+++ b/src/network/socket/qnativesocketengine_winrt_p.h
@@ -220,8 +220,7 @@ private:
ABI::Windows::Networking::Sockets::IDatagramSocketMessageReceivedEventArgs *args);
HRESULT handleClientConnection(ABI::Windows::Networking::Sockets::IStreamSocketListener *tcpListener,
ABI::Windows::Networking::Sockets::IStreamSocketListenerConnectionReceivedEventArgs *args);
- HRESULT handleConnectToHost(ABI::Windows::Foundation::IAsyncAction *, ABI::Windows::Foundation::AsyncStatus);
- void handleConnectionEstablished(ABI::Windows::Foundation::IAsyncAction *action);
+ HRESULT handleConnectOpFinished(ABI::Windows::Foundation::IAsyncAction *, ABI::Windows::Foundation::AsyncStatus);
HRESULT handleReadyRead(ABI::Windows::Foundation::IAsyncOperationWithProgress<ABI::Windows::Storage::Streams::IBuffer *, UINT32> *asyncInfo, ABI::Windows::Foundation::AsyncStatus);
};
diff --git a/src/network/socket/qsocks5socketengine.cpp b/src/network/socket/qsocks5socketengine.cpp
index eb9264ba20..a57a1dca2c 100644
--- a/src/network/socket/qsocks5socketengine.cpp
+++ b/src/network/socket/qsocks5socketengine.cpp
@@ -1122,7 +1122,9 @@ bool QSocks5SocketEngine::connectInternal()
}
if (d->socketState != QAbstractSocket::ConnectingState) {
- if (d->socks5State == QSocks5SocketEnginePrivate::Uninitialized) {
+ if (d->socks5State == QSocks5SocketEnginePrivate::Uninitialized
+ // We may have new auth credentials since an earlier failure:
+ || d->socks5State == QSocks5SocketEnginePrivate::AuthenticatingError) {
setState(QAbstractSocket::ConnectingState);
//limit buffer in internal socket, data is buffered in the external socket under application control
d->data->controlSocket->setReadBufferSize(65536);
diff --git a/src/network/ssl/qsslsocket.cpp b/src/network/ssl/qsslsocket.cpp
index a5ee9bf0c1..472db3aa81 100644
--- a/src/network/ssl/qsslsocket.cpp
+++ b/src/network/ssl/qsslsocket.cpp
@@ -2632,7 +2632,8 @@ QList<QByteArray> QSslSocketPrivate::unixRootCertDirectories()
<< "/var/ssl/certs/" // AIX
<< "/usr/local/ssl/certs/" // Solaris
<< "/etc/openssl/certs/" // BlackBerry
- << "/opt/openssl/certs/"; // HP-UX
+ << "/opt/openssl/certs/" // HP-UX
+ << "/etc/ssl/"; // OpenBSD
}
/*!