summaryrefslogtreecommitdiffstats
path: root/src/core/api/qwebengineurlschemehandler.cpp
blob: e01ecef49420bc0080cd83989afe6e12ebf4e916 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
// Copyright (C) 2016 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only

#include "qwebengineurlschemehandler.h"

#include "qwebengineurlrequestjob.h"

QT_BEGIN_NAMESPACE

/*!
    \class QWebEngineUrlSchemeHandler
    \brief The QWebEngineUrlSchemeHandler class is a base class for handling custom URL schemes.
    \since 5.6

    A custom scheme handler is, broadly speaking, similar to a web application
    served over HTTP. However, because custom schemes are integrated directly
    into the web engine, they have the advantage in terms of efficiency and security:
    There is no need for generating and parsing HTTP messages or for transferring data
    over sockets, nor any way to intercept or monitor the traffic.

    To implement a custom URL scheme for QtWebEngine, you first have to create an instance of
    QWebEngineUrlScheme and register it using QWebEngineUrlScheme::registerScheme().

    As custom schemes are integrated directly into the web engine, they do not
    necessarily need to follow the standard security rules which apply to
    ordinary web content. Depending on the chosen configuration, content served
    over a custom scheme may be given access to local resources, be set to
    ignore Content-Security-Policy rules, or conversely, be denied access to any
    other content entirely. If it is to be accessed by normal content, ensure cross-origin
    access is enabled, and if accessed from HTTPS that it is marked as secure.

    \note Make sure that you create and register the scheme object \e before the QGuiApplication
    or QApplication object is instantiated.

    Then you must create a class derived from QWebEngineUrlSchemeHandler,
    and reimplement the requestStarted() method.

    Finally, install the scheme handler object via QWebEngineProfile::installUrlSchemeHandler()
    or QQuickWebEngineProfile::installUrlSchemeHandler().

    \code

    class MySchemeHandler : public QWebEngineUrlSchemeHandler
    {
    public:
        MySchemeHandler(QObject *parent = nullptr);
        void requestStarted(QWebEngineUrlRequestJob *job)
        {
            const QByteArray method = job->requestMethod();
            const QUrl url = job->requestUrl();

            if (isValidUrl(url)) {
                if (method == QByteArrayLiteral("GET")) {
                    job->reply(QByteArrayLiteral("text/html"), makeReply(url));
                else // Unsupported method
                    job->fail(QWebEngineUrlRequestJob::RequestDenied);
            } else {
                // Invalid URL
                job->fail(QWebEngineUrlRequestJob::UrlNotFound);
            }
        }
        bool isValidUrl(const QUrl &url) const // ....
        QIODevice *makeReply(const QUrl &url) // ....
    };

    int main(int argc, char **argv)
    {
        QWebEngineUrlScheme scheme("myscheme");
        scheme.setSyntax(QWebEngineUrlScheme::Syntax::HostAndPort);
        scheme.setDefaultPort(2345);
        scheme.setFlags(QWebEngineUrlScheme::SecureScheme);
        QWebEngineUrlScheme::registerScheme(scheme);

        // ...
        QApplication app(argc, argv);
        // ...

        // installUrlSchemeHandler does not take ownership of the handler.
        MySchemeHandler *handler = new MySchemeHandler(parent);
        QWebEngineProfile::defaultProfile()->installUrlSchemeHandler("myscheme", handler);
    }
    \endcode

    \inmodule QtWebEngineCore

    \sa {QWebEngineUrlScheme}
*/

/*!
    Constructs a new URL scheme handler.

    The handler is created with the parent \a parent.

  */
QWebEngineUrlSchemeHandler::QWebEngineUrlSchemeHandler(QObject *parent)
    : QObject(parent)
{
}

/*!
    Deletes a custom URL scheme handler.
*/
QWebEngineUrlSchemeHandler::~QWebEngineUrlSchemeHandler()
{
}

/*!
    \fn void QWebEngineUrlSchemeHandler::requestStarted(QWebEngineUrlRequestJob *request)

    This method is called whenever a request \a request for the registered scheme is started.

    This method must be reimplemented by all custom URL scheme handlers.
    The request is asynchronous and does not need to be handled right away.

    \sa QWebEngineUrlRequestJob
*/

QT_END_NAMESPACE

#include "moc_qwebengineurlschemehandler.cpp"