| 27 | |
| 28 | |
| 29 | class 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 |