From 7628c92689ac8b048be6dbfdf2be1c0ef7efb6af Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Wed, 11 Jun 2014 15:33:07 +0200 Subject: [PATCH] Support platforms where Qt is compiled without SSL support --- qutebrowser/network/networkmanager.py | 19 ++++++++++++++++--- qutebrowser/network/schemehandler.py | 24 ++++++++++++++++++++++++ 2 files changed, 40 insertions(+), 3 deletions(-) diff --git a/qutebrowser/network/networkmanager.py b/qutebrowser/network/networkmanager.py index b3209aea9..737e3a31e 100644 --- a/qutebrowser/network/networkmanager.py +++ b/qutebrowser/network/networkmanager.py @@ -18,12 +18,20 @@ """Our own QNetworkAccessManager.""" from PyQt5.QtCore import pyqtSlot -from PyQt5.QtNetwork import QNetworkAccessManager +from PyQt5.QtNetwork import QNetworkAccessManager, QNetworkReply + +try: + from PyQt5.QtNetwork import QSslSocket +except ImportError: + SSL_AVAILABLE = False +else: + SSL_AVAILABLE = QSslSocket.supportsSsl() import qutebrowser.config.config as config import qutebrowser.utils.message as message import qutebrowser.utils.log as log from qutebrowser.network.qutescheme import QuteSchemeHandler +from qutebrowser.network.schemehandler import ErrorNetworkReply from qutebrowser.utils.usertypes import PromptMode @@ -46,7 +54,8 @@ class NetworkManager(QNetworkAccessManager): } if cookiejar is not None: self.setCookieJar(cookiejar) - self.sslErrors.connect(self.on_ssl_errors) + if SSL_AVAILABLE: + self.sslErrors.connect(self.on_ssl_errors) self.authenticationRequired.connect(self.on_authentication_required) self.proxyAuthenticationRequired.connect( self.on_proxy_authentication_required) @@ -116,7 +125,11 @@ class NetworkManager(QNetworkAccessManager): A QNetworkReply. """ scheme = req.url().scheme() - if scheme in self._scheme_handlers: + if scheme == 'https' and not SSL_AVAILABLE: + return ErrorNetworkReply( + "SSL is not supported by the installed Qt library!", + QNetworkReply.ProtocolUnknownError) + elif scheme in self._scheme_handlers: reply = self._scheme_handlers[scheme].createRequest( op, req, outgoing_data) else: diff --git a/qutebrowser/network/schemehandler.py b/qutebrowser/network/schemehandler.py index 1f96e74dd..df4abc1c8 100644 --- a/qutebrowser/network/schemehandler.py +++ b/qutebrowser/network/schemehandler.py @@ -110,3 +110,27 @@ class SpecialNetworkReply(QNetworkReply): def isFinished(self): """Check if the reply is finished.""" return True + + +class ErrorNetworkReply(QNetworkReply): + + """QNetworkReply which always returns an error.""" + + def __init__(self, errorstring, error, parent=None): + """Constructor. + + Args: + errorstring: The error string to print. + error: The numerical error value. + parent: The parent to pass to QNetworkReply. + """ + super().__init__(parent) + self.setError(error, errorstring) + QTimer.singleShot(0, lambda: self.error.emit(error)) + QTimer.singleShot(0, lambda: self.finished.emit()) + + def abort(self): + pass + + def bytesAvailable(self): + return 0