MCPcopy Create free account
hub / github.com/PyQt5/PyQt / UrlSchemeHandler

Class UrlSchemeHandler

QWebEngineView/GetRequestInfo.py:29–69  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

27
28
29class UrlSchemeHandler(QWebEngineUrlSchemeHandler):
30 AttrType = QNetworkRequest.User + 1
31
32 def __init__(self, *args, **kwargs):
33 super(UrlSchemeHandler, self).__init__(*args, **kwargs)
34 self._manager = QNetworkAccessManager(self)
35 self._manager.finished.connect(self.onFinished)
36
37 def requestStarted(self, request):
38 # 拦截
39 # request.fail(QWebEngineUrlRequestJob.RequestDenied)
40 # print('initiator:', request.initiator())
41 print('requestMethod:', request.requestMethod())
42 print('requestHeaders:', request.requestHeaders())
43 url = request.requestUrl()
44 if url.scheme().startswith('myurl'):
45 url.setScheme(url.scheme().replace('myurl', 'http'))
46 print('requestUrl:', url)
47
48 # 构造真实请求
49 req = QNetworkRequest(url)
50 req.setAttribute(self.AttrType, request) # 记录
51 for headerName, headerValue in request.requestHeaders().items():
52 req.setRawHeader(headerName, headerValue)
53 method = request.requestMethod()
54
55 # TODO: 这里需要把浏览器内部的cookie获取出来重新设置
56 if method == b'GET':
57 self._manager.get(req)
58 # TODO: 这里貌似没法得到POST的数据,ajax的请求貌似也有问题
59 elif method == b'POST':
60 self._manager.post(req)
61
62 def onFinished(self, reply):
63 req = reply.request() # 获取请求
64 o_req = req.attribute(self.AttrType, None)
65 if o_req:
66 # Notice: 这里可以对数据做修改再返回
67 # TODO: 可能还存在 QNetworkAccessManager 与浏览器之间的 cookie 同步问题
68 o_req.reply(req.header(QNetworkRequest.ContentTypeHeader) or b'text/html', reply)
69 o_req.destroyed.connect(reply.deleteLater)
70
71
72# 把所有请求重定向到myurl

Callers 1

__init__Method · 0.70

Calls

no outgoing calls

Tested by

no test coverage detected