Simplify QtWebKit scheme handlers
This commit is contained in:
parent
c112290664
commit
3170e35b31
@ -25,7 +25,7 @@
|
||||
|
||||
import os
|
||||
|
||||
from qutebrowser.browser.webkit.network import schemehandler, networkreply
|
||||
from qutebrowser.browser.webkit.network import networkreply
|
||||
from qutebrowser.utils import jinja
|
||||
|
||||
|
||||
@ -111,27 +111,21 @@ def dirbrowser_html(path):
|
||||
return html.encode('UTF-8', errors='xmlcharrefreplace')
|
||||
|
||||
|
||||
class FileSchemeHandler(schemehandler.SchemeHandler):
|
||||
def handler(request):
|
||||
"""Handler for a file:// URL.
|
||||
|
||||
"""Scheme handler for file: URLs."""
|
||||
Args:
|
||||
request: QNetworkRequest to answer to.
|
||||
|
||||
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 for directories, None for files.
|
||||
"""
|
||||
path = request.url().toLocalFile()
|
||||
try:
|
||||
if os.path.isdir(path):
|
||||
data = dirbrowser_html(path)
|
||||
return networkreply.FixedDataNetworkReply(
|
||||
request, data, 'text/html', self.parent())
|
||||
return None
|
||||
except UnicodeEncodeError:
|
||||
return None
|
||||
Return:
|
||||
A QNetworkReply for directories, None for files.
|
||||
"""
|
||||
path = request.url().toLocalFile()
|
||||
try:
|
||||
if os.path.isdir(path):
|
||||
data = dirbrowser_html(path)
|
||||
return networkreply.FixedDataNetworkReply(
|
||||
request, data, 'text/html')
|
||||
return None
|
||||
except UnicodeEncodeError:
|
||||
return None
|
||||
|
@ -151,8 +151,8 @@ class NetworkManager(QNetworkAccessManager):
|
||||
self._tab_id = tab_id
|
||||
self._private = private
|
||||
self._scheme_handlers = {
|
||||
'qute': webkitqutescheme.QuteSchemeHandler(),
|
||||
'file': filescheme.FileSchemeHandler(),
|
||||
'qute': webkitqutescheme.handler,
|
||||
'file': filescheme.handler,
|
||||
}
|
||||
self._set_cookiejar()
|
||||
self._set_cache()
|
||||
@ -373,9 +373,9 @@ class NetworkManager(QNetworkAccessManager):
|
||||
|
||||
scheme = req.url().scheme()
|
||||
if scheme in self._scheme_handlers:
|
||||
result = self._scheme_handlers[scheme].createRequest(
|
||||
op, req, outgoing_data)
|
||||
result = self._scheme_handlers[scheme](req)
|
||||
if result is not None:
|
||||
result.setParent(self)
|
||||
return result
|
||||
|
||||
for header, value in shared.custom_headers():
|
||||
|
@ -1,43 +0,0 @@
|
||||
# vim: ft=python fileencoding=utf-8 sts=4 sw=4 et:
|
||||
|
||||
# Copyright 2014-2018 Florian Bruhin (The Compiler) <mail@qutebrowser.org>
|
||||
#
|
||||
# Based on the Eric5 helpviewer,
|
||||
# Copyright (c) 2009 - 2014 Detlev Offenbach <detlev@die-offenbachs.de>
|
||||
#
|
||||
# This file is part of qutebrowser.
|
||||
#
|
||||
# qutebrowser is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation, either version 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# qutebrowser is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with qutebrowser. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
"""Base class for custom scheme handlers."""
|
||||
|
||||
from PyQt5.QtCore import QObject
|
||||
|
||||
|
||||
class SchemeHandler(QObject):
|
||||
|
||||
"""Abstract base class for custom scheme handlers."""
|
||||
|
||||
def createRequest(self, op, request, outgoing_data):
|
||||
"""Create a new request.
|
||||
|
||||
Args:
|
||||
op: Operation op
|
||||
req: const QNetworkRequest & req
|
||||
outgoing_data: QIODevice * outgoingData
|
||||
|
||||
Return:
|
||||
A QNetworkReply.
|
||||
"""
|
||||
raise NotImplementedError
|
@ -24,46 +24,36 @@ import mimetypes
|
||||
from PyQt5.QtNetwork import QNetworkReply
|
||||
|
||||
from qutebrowser.browser import pdfjs, qutescheme
|
||||
from qutebrowser.browser.webkit.network import schemehandler, networkreply
|
||||
from qutebrowser.browser.webkit.network import networkreply
|
||||
from qutebrowser.utils import log, usertypes, qtutils
|
||||
|
||||
|
||||
class QuteSchemeHandler(schemehandler.SchemeHandler):
|
||||
def handler(request):
|
||||
"""Scheme handler for qute:// URLs.
|
||||
|
||||
"""Scheme handler for qute:// URLs."""
|
||||
Args:
|
||||
request: QNetworkRequest to answer to.
|
||||
|
||||
def createRequest(self, _op, request, _outgoing_data):
|
||||
"""Create a new request.
|
||||
Return:
|
||||
A QNetworkReply.
|
||||
"""
|
||||
try:
|
||||
mimetype, data = qutescheme.data_for_url(request.url())
|
||||
except qutescheme.NoHandlerFound:
|
||||
errorstr = "No handler found for {}!".format(
|
||||
request.url().toDisplayString())
|
||||
return networkreply.ErrorNetworkReply(
|
||||
request, errorstr, QNetworkReply.ContentNotFoundError)
|
||||
except qutescheme.QuteSchemeOSError as e:
|
||||
return networkreply.ErrorNetworkReply(
|
||||
request, str(e), QNetworkReply.ContentNotFoundError)
|
||||
except qutescheme.QuteSchemeError as e:
|
||||
return networkreply.ErrorNetworkReply(request, e.errorstring, e.error)
|
||||
except qutescheme.Redirect as e:
|
||||
qtutils.ensure_valid(e.url)
|
||||
return networkreply.RedirectNetworkReply(e.url)
|
||||
|
||||
Args:
|
||||
request: const QNetworkRequest & req
|
||||
_op: Operation op
|
||||
_outgoing_data: QIODevice * outgoingData
|
||||
|
||||
Return:
|
||||
A QNetworkReply.
|
||||
"""
|
||||
try:
|
||||
mimetype, data = qutescheme.data_for_url(request.url())
|
||||
except qutescheme.NoHandlerFound:
|
||||
errorstr = "No handler found for {}!".format(
|
||||
request.url().toDisplayString())
|
||||
return networkreply.ErrorNetworkReply(
|
||||
request, errorstr, QNetworkReply.ContentNotFoundError,
|
||||
self.parent())
|
||||
except qutescheme.QuteSchemeOSError as e:
|
||||
return networkreply.ErrorNetworkReply(
|
||||
request, str(e), QNetworkReply.ContentNotFoundError,
|
||||
self.parent())
|
||||
except qutescheme.QuteSchemeError as e:
|
||||
return networkreply.ErrorNetworkReply(request, e.errorstring,
|
||||
e.error, self.parent())
|
||||
except qutescheme.Redirect as e:
|
||||
qtutils.ensure_valid(e.url)
|
||||
return networkreply.RedirectNetworkReply(e.url, self.parent())
|
||||
|
||||
return networkreply.FixedDataNetworkReply(request, data, mimetype,
|
||||
self.parent())
|
||||
return networkreply.FixedDataNetworkReply(request, data, mimetype)
|
||||
|
||||
|
||||
@qutescheme.add_handler('pdfjs', backend=usertypes.Backend.QtWebKit)
|
||||
|
@ -72,8 +72,6 @@ PERFECT_FILES = [
|
||||
# 'browser/webkit/webkitelem.py'),
|
||||
# ('tests/unit/browser/webkit/test_webkitelem.py',
|
||||
# 'browser/webelem.py'),
|
||||
('tests/unit/browser/webkit/network/test_schemehandler.py',
|
||||
'browser/webkit/network/schemehandler.py'),
|
||||
('tests/unit/browser/webkit/network/test_filescheme.py',
|
||||
'browser/webkit/network/filescheme.py'),
|
||||
('tests/unit/browser/webkit/network/test_networkreply.py',
|
||||
|
@ -248,8 +248,7 @@ class TestFileSchemeHandler:
|
||||
def test_dir(self, tmpdir):
|
||||
url = QUrl.fromLocalFile(str(tmpdir))
|
||||
req = QNetworkRequest(url)
|
||||
handler = filescheme.FileSchemeHandler()
|
||||
reply = handler.createRequest(None, req, None)
|
||||
reply = filescheme.handler(req)
|
||||
# The URL will always use /, even on Windows - so we force this here
|
||||
# too.
|
||||
tmpdir_path = str(tmpdir).replace(os.sep, '/')
|
||||
@ -260,17 +259,15 @@ class TestFileSchemeHandler:
|
||||
filename.ensure()
|
||||
url = QUrl.fromLocalFile(str(filename))
|
||||
req = QNetworkRequest(url)
|
||||
handler = filescheme.FileSchemeHandler()
|
||||
reply = handler.createRequest(None, req, None)
|
||||
reply = filescheme.handler(req)
|
||||
assert reply is None
|
||||
|
||||
def test_unicode_encode_error(self, mocker):
|
||||
url = QUrl('file:///tmp/foo')
|
||||
req = QNetworkRequest(url)
|
||||
handler = filescheme.FileSchemeHandler()
|
||||
|
||||
err = UnicodeEncodeError('ascii', '', 0, 2, 'foo')
|
||||
mocker.patch('os.path.isdir', side_effect=err)
|
||||
|
||||
reply = handler.createRequest(None, req, None)
|
||||
reply = filescheme.handler(req)
|
||||
assert reply is None
|
||||
|
@ -1,30 +0,0 @@
|
||||
# vim: ft=python fileencoding=utf-8 sts=4 sw=4 et:
|
||||
|
||||
# Copyright 2015-2018 Florian Bruhin (The Compiler) <mail@qutebrowser.org>
|
||||
#
|
||||
# This file is part of qutebrowser.
|
||||
#
|
||||
# qutebrowser is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation, either version 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# qutebrowser is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with qutebrowser. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
"""Tests for browser.network.schemehandler."""
|
||||
|
||||
import pytest
|
||||
|
||||
from qutebrowser.browser.webkit.network import schemehandler
|
||||
|
||||
|
||||
def test_create_request():
|
||||
handler = schemehandler.SchemeHandler(0)
|
||||
with pytest.raises(NotImplementedError):
|
||||
handler.createRequest(None, None, None)
|
Loading…
Reference in New Issue
Block a user