def createRequest(self, _op, request, _outgoing_data): """Create a new request. Args: request: const QNetworkRequest & req _op: Operation op _outgoing_data: QIODevice * outgoingData Return: A QNetworkReply. """ path = request.url().path() host = request.url().host() # An url like "qute:foo" is split as "scheme:path", not "scheme:host". log.misc.debug("url: {}, path: {}, host {}".format( request.url().toDisplayString(), path, host)) try: handler = HANDLERS[path] except KeyError: try: handler = HANDLERS[host] except KeyError: errorstr = "No handler found for {}!".format( request.url().toDisplayString()) return networkreply.ErrorNetworkReply( request, errorstr, QNetworkReply.ContentNotFoundError, self.parent()) try: data = handler(self._win_id, request) except OSError as e: return networkreply.ErrorNetworkReply( request, str(e), QNetworkReply.ContentNotFoundError, self.parent()) return networkreply.FixedDataNetworkReply(request, data, 'text/html', self.parent())
def createRequest(self, op, req, outgoing_data): """Return a new QNetworkReply object. Extend QNetworkAccessManager::createRequest to save requests in self._requests and handle custom schemes. Args: op: Operation op req: const QNetworkRequest & req outgoing_data: QIODevice * outgoingData Return: A QNetworkReply. """ scheme = req.url().scheme() if scheme == 'https' and not SSL_AVAILABLE: return networkreply.ErrorNetworkReply( req, "SSL is not supported by the installed Qt library!", QNetworkReply.ProtocolUnknownError, self) elif scheme in self._scheme_handlers: return self._scheme_handlers[scheme].createRequest( op, req, outgoing_data) host_blocker = objreg.get('host-blocker') if (op == QNetworkAccessManager.GetOperation and req.url().host() in host_blocker.blocked_hosts and config.get('content', 'host-blocking-enabled')): log.webview.info("Request to {} blocked by host blocker.".format( req.url().host())) return networkreply.ErrorNetworkReply( req, HOSTBLOCK_ERROR_STRING, QNetworkReply.ContentAccessDenied, self) if config.get('network', 'do-not-track'): dnt = '1'.encode('ascii') else: dnt = '0'.encode('ascii') req.setRawHeader('DNT'.encode('ascii'), dnt) req.setRawHeader('X-Do-Not-Track'.encode('ascii'), dnt) accept_language = config.get('network', 'accept-language') if accept_language is not None: req.setRawHeader('Accept-Language'.encode('ascii'), accept_language.encode('ascii')) if PYQT_VERSION < 0x050301: # WORKAROUND (remove this when we bump the requirements to 5.3.1) # # If we don't disable our message handler, we get a freeze if a # warning is printed due to a PyQt bug, e.g. when clicking a # currency on http://ch.mouser.com/localsites/ # # See http://www.riverbankcomputing.com/pipermail/pyqt/2014-June/034420.html with log.disable_qt_msghandler(): reply = super().createRequest(op, req, outgoing_data) else: reply = super().createRequest(op, req, outgoing_data) self._requests.append(reply) reply.destroyed.connect(self._requests.remove) return reply
def test_error_network_reply(qtbot, req): reply = networkreply.ErrorNetworkReply( req, "This is an error", QNetworkReply.UnknownNetworkError) with qtbot.waitSignals([reply.error, reply.finished]): pass reply.abort() # shouldn't do anything assert reply.request() == req assert reply.url() == req.url() assert reply.openMode() == QIODevice.ReadOnly assert reply.isFinished() assert not reply.isRunning() assert reply.bytesAvailable() == 0 assert reply.readData(1) == b'' assert reply.error() == QNetworkReply.UnknownNetworkError assert reply.errorString() == "This is an error"
def createRequest(self, op, req, outgoing_data): """Return a new QNetworkReply object. Extend QNetworkAccessManager::createRequest to save requests in self._requests and handle custom schemes. Args: op: Operation op req: const QNetworkRequest & req outgoing_data: QIODevice * outgoingData Return: A QNetworkReply. """ scheme = req.url().scheme() if scheme in self._scheme_handlers: result = self._scheme_handlers[scheme].createRequest( op, req, outgoing_data) if result is not None: return result host_blocker = objreg.get('host-blocker') if (op == QNetworkAccessManager.GetOperation and host_blocker.is_blocked(req.url())): log.webview.info("Request to {} blocked by host blocker.".format( req.url().host())) return networkreply.ErrorNetworkReply( req, HOSTBLOCK_ERROR_STRING, QNetworkReply.ContentAccessDenied, self) if config.get('network', 'do-not-track'): dnt = '1'.encode('ascii') else: dnt = '0'.encode('ascii') req.setRawHeader('DNT'.encode('ascii'), dnt) req.setRawHeader('X-Do-Not-Track'.encode('ascii'), dnt) # There are some scenarios where we can't figure out current_url: # - There's a generic NetworkManager, e.g. for downloads # - The download was in a tab which is now closed. current_url = QUrl() if self._tab_id is not None: try: webview = objreg.get('webview', scope='tab', window=self._win_id, tab=self._tab_id) current_url = webview.url() except (KeyError, RuntimeError, TypeError): # https://github.com/The-Compiler/qutebrowser/issues/889 # Catching RuntimeError and TypeError because we could be in # the middle of the webpage shutdown here. current_url = QUrl() self.set_referer(req, current_url) accept_language = config.get('network', 'accept-language') if accept_language is not None: req.setRawHeader('Accept-Language'.encode('ascii'), accept_language.encode('ascii')) if PYQT_VERSION < 0x050301: # WORKAROUND (remove this when we bump the requirements to 5.3.1) # # If we don't disable our message handler, we get a freeze if a # warning is printed due to a PyQt bug, e.g. when clicking a # currency on http://ch.mouser.com/localsites/ # # See http://www.riverbankcomputing.com/pipermail/pyqt/2014-June/034420.html with log.disable_qt_msghandler(): reply = super().createRequest(op, req, outgoing_data) else: reply = super().createRequest(op, req, outgoing_data) self._requests.append(reply) reply.destroyed.connect(self._requests.remove) return reply