Qt5 - QWebEngine CORS для собственного типа URI

Итак, основная суть в том, что у меня есть ресурсы javascript, такие как https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js которые я использую в QWebEngine. Предполагается, что программа также работает в автономном режиме, поэтому я создал QWebEngineUrlRequestInterceptor, который меняет эти адреса на мой собственный локальный обработчик, в этом случае целью будет conapp://webresource/jquery.min.js

Однако это приводит к этому сообщению журнала:

js: Redirect from 
'https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js' has been 
blocked by CORS policy: Redirect location 
'conapp://webresource/jquery.min.js' has a disallowed scheme for cross-
origin requests.

Есть ли способ разрешить перенаправления в conapp: // конкретно?

Несколько релевантных фрагментов кода, если это поможет (PyQt5)

class Interceptor(QWebEngineUrlRequestInterceptor):
    def __init__(self):
        super(Interceptor, self).__init__()
        QWebEngineProfile.defaultProfile().setRequestInterceptor(self)

    def interceptRequest(self, info):
        url = info.requestUrl().toString()
        item = url.split("/")[-1]
        if item in LazyLoader:
            target = QUrl(r"conapp://webresource/{}".format(item))
            info.redirect(target)

class SchemeHandler(QWebEngineUrlSchemeHandler):
    def __init__(self):
        super(SchemeHandler, self).__init__()
        QWebEngineProfile.defaultProfile().settings().setAttribute(6, True)
        QWebEngineProfile.defaultProfile().installUrlSchemeHandler(b'conapp', self)
        self._handlers = {}

    def requestStarted(self, job):
        url = job.requestUrl()
        print("Got request for {}".format(url.toDisplayString()))
        request = url.toString().split("//")[1]

        buf = QBuffer(parent=self)
        buf.open(QIODevice.WriteOnly)
        buf.write(self._handlers[request]().encode("utf-8"))
        buf.seek(0)
        buf.close()
        job.reply(b"text/html", buf)

    def register(self, contentgenerator, contentname):
        self._handlers[contentname] = contentgenerator
        return contentname

1 ответ

В сочетании с Qt WebView - перехватывать загрузку библиотек JS/CSS для загрузки локальных

Использование собственного обработчика для разрешения межсайтового доступа работает для меня

class Handler(http.server.SimpleHTTPRequestHandler):
    DATA_DIR = '/my_data_dir'
    def end_headers (self):
        self.send_header('Access-Control-Allow-Origin', '*')
        super().end_headers()
    def translate_path(self, path):
        return os.path.join(self.DATA_DIR, path.lstrip('/'))
Другие вопросы по тегам