import gi, os
gi.require_version("WebKit2", "4.1")
from gi.repository import Gio, WebKit2
from ._mimetypes import get_mimetype
from ._version import version
__dir__ = os.path.dirname(os.path.realpath(__file__))
class Protocal:
root = ''
def __init__(self, webroot = ''):
self.root = os.path.realpath(webroot)
def register(self, webview, name = 'app'):
self.protocal = name
ctx = webview.get_context()
ctx.register_uri_scheme(name, self.handle_response)
# 允许网页通知权限
ctx.initialize_notification_permissions([WebKit2.SecurityOrigin.new_for_uri('app:///index.html')], [])
def abspath(self, filepath):
return os.path.join(self.root, filepath)
def _get_error_page(self, tips = '404 not found!'):
data = f"""
Page not found
Oops!
{tips}
WebEngine v{version}
"""
return data
def handle_response(self, req):
schema = req.get_scheme()
pathname = req.get_path()[1:]
ext = pathname.split('.')[-1]
mimetype = get_mimetype(ext)
if pathname == ext:
pathname = 'index.html'
# print('----------------------------------------')
# print(req.get_uri(),schema, pathname, ext, mimetype)
# print('----------------------------------------')
if schema == self.protocal:
filepath = self.abspath(pathname)
if os.path.isfile(filepath):
try:
with open(filepath) as f:
data = f.read()
except Exception:
data = self._get_error_page('403 Forbidden!')
else:
data = self._get_error_page()
data = Gio.MemoryInputStream.new_from_data(data.encode())
# ------- 更多功能的reponse ----------------
# res = WebKit2.URISchemeResponse.new(data, -1)
# res.set_content_type(mimetype)
# res.set_http_headers('text/html')
# res.set_status(200)
# req.finish_with_response(res)
# ----------------------------------------
# 简单的response
req.finish(data, -1, mimetype)
def create_protocal(root):
proto = Protocal(root)
def wrapper(app, extra = None):
proto.register(app)
return wrapper