aboutsummaryrefslogtreecommitdiff
path: root/src/schemes/NullRpcSchemeHandler.hpp
blob: b2b22cb5afa2745e94373526d13bddcfe986db66 (plain) (blame)
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
#pragma once

#include <QWebEngineUrlRequestJob>
#include <QWebEngineUrlSchemeHandler>
#include <QtCore>
#include <qurlquery.h>

struct NullRPCMessage {
  QString name;
  QUrlQuery params;
};

class NullRPCSchemeHandler : public QWebEngineUrlSchemeHandler {
  Q_OBJECT

public:
  static NullRPCSchemeHandler &instance() {
    static NullRPCSchemeHandler handler;
    return handler;
  }

  void requestStarted(QWebEngineUrlRequestJob *job) override {
    auto url = job->requestUrl();
    auto origin = job->initiator();
    qDebug() << "REQ" << url << " | From: " << job->initiator();

    if (origin.scheme() != "nullrpc" || url.host().isEmpty() || url.host() == "noop") {
      job->reply("text/html", new QBuffer(job));
      return;
    }

    if (url.host() == "log") {
      qDebug() << url.query();
      job->reply("text/plain", new QBuffer(job));
      return;
    }

    NullRPCMessage message{
        .name = url.host(),
        .params = QUrlQuery(url.query()),
    };
    emit message_received(message);

    // TODO: responses managed with request ids
    QByteArray data = "{}";
    QBuffer *buffer = new QBuffer(job);
    buffer->setData(data);
    buffer->open(QIODevice::ReadOnly);
    job->reply("text/plain", buffer);
  }

signals:
  void message_received(NullRPCMessage message);

private:
  NullRPCSchemeHandler() = default;
};