8#include "httprequesthandler.h"
9#include "httprequest.h"
10#include "httpresponse.h"
11#include "httpconnection.h"
22 m_connection = parent;
28 return (authenticatedUser() !=
nullptr)
29 ? Db::Database::create(
this, authenticatedUser())
30 : Db::Database::create(this);
45 if (m_authorizer == NULL) {
48 return m_authorizer->isAuthorized(permission);
55 QStringList parts = path.split(
"/");
57 if (parts.size() <= 1) {
63 if (parts.first() ==
"api") { parts.removeAt(0); }
64 if (parts.first() ==
"v1") { parts.removeAt(0); }
66 switch (parts.size()) {
68 if (
request->method() !=
"GET") {
76 if (parts[1] ==
"events") {
77 if (
request->method() !=
"GET") {
81 response->setHeader(
"Content-Type",
"text/event-stream");
82 response->setHeader(
"Cache-Control",
"no-cache,public");
83 response->setHeader(
"Transfer-Encoding",
"chunked");
84 if (!
request->header(
"Referer").isEmpty()) {
85 QUrl referer = QUrl::fromUserInput(
request->header(
"Referer"));
87 allow.setScheme(referer.scheme());
88 allow.setHost(referer.host());
89 allow.setPort(referer.port());
90 response->setHeader(
"Access-Control-Allow-Origin", allow.toString());
92 response->flushSocket();
97 if (parts[1] !=
"events") {
98 QString
id = parts[1];
99 if (
request->method() ==
"GET") {
104 response->setHeader(
"Content-Type",
"application/json");
105 response->setHeader(
"Cache-Control",
"no-cache,public");
109 if (
request->method() ==
"PUT") {
118 if (m_checkId && !data.contains(
"id")) {
123 response->setHeader(
"Content-Type",
"application/json");
124 response->setHeader(
"Cache-Control",
"no-cache,public");
128 if (
request->method() ==
"POST") {
137 if (m_checkId && !data.contains(
"id")) {
142 response->setHeader(
"Content-Type",
"application/json");
143 response->setHeader(
"Cache-Control",
"no-cache,public");
147 if (
request->method() ==
"DELETE") {
152 response->setHeader(
"Content-Type",
"application/json");
153 response->setHeader(
"Cache-Control",
"no-cache,public");
161 if (parts[1] ==
"events" || parts[2] !=
"events") {
166 if (
request->method() !=
"GET") {
176 response->setHeader(
"Content-Type",
"text/event-stream");
177 response->setHeader(
"Cache-Control",
"no-cache,public");
178 response->setHeader(
"Transfer-Encoding",
"chunked");
179 if (!
request->header(
"Referer").isEmpty()) {
180 QUrl referer = QUrl::fromUserInput(
request->header(
"Referer"));
182 allow.setScheme(referer.scheme());
183 allow.setHost(referer.host());
184 allow.setPort(referer.port());
185 response->setHeader(
"Access-Control-Allow-Origin", allow.toString());
187 response->flushSocket();
199 HobrasoftHttpd::HttpRequest *request,
200 HobrasoftHttpd::HttpResponse *response,
202 const QString& error,
203 const QString& reason) {
208 data[
"error"] = error;
209 data[
"reason"] = reason;
211 HobrasoftHttpd::HttpResponse *r = (response ==
nullptr) ?
new HobrasoftHttpd::HttpResponse(
connection()) : response;
213 r->setHeader(
"Content-Type",
"application/json");
214 r->setHeader(
"Cache-Control",
"no-cache,public");
215 r->setStatus(code, error);
223 HobrasoftHttpd::HttpRequest *request,
224 HobrasoftHttpd::HttpResponse *response,
226 const QString& error,
227 const QVariantMap& data) {
231 HobrasoftHttpd::HttpResponse *r = (response ==
nullptr) ?
new HobrasoftHttpd::HttpResponse(
connection()) : response;
233 r->setHeader(
"Content-Type",
"application/json");
234 r->setHeader(
"Cache-Control",
"no-cache,public");
235 r->setStatus(code, error);
243 HobrasoftHttpd::HttpRequest *request,
244 HobrasoftHttpd::HttpResponse *response,
245 const QVariant& data) {
252 if (!response->containsHeader(
"Content-Type")) { response->setHeader(
"Content-Type",
"application/json"); }
253 if (!response->containsHeader(
"Cache-Control")) { response->setHeader(
"Cache-Control",
"no-cache,public"); }
254 response->setStatus(200,
"OK");
255 response->write(
JSON::json( (!data.isValid() || data.isNull()) ? okdata : data) );
261 HobrasoftHttpd::HttpRequest *request,
262 HobrasoftHttpd::HttpResponse *response,
263 const QVariant& data) {
269 HobrasoftHttpd::HttpResponse *lresponse = HttpRequestHandler::response();
270 lresponse->setHeader(
"Transfer-Encoding",
"chunked");
271 lresponse->setHeader(
"Content-Type",
"text/event-stream");
272 lresponse->setHeader(
"Cache-Control",
"no-cache,public");
273 lresponse->setSendHeaders(
false);
276 datagram +=
"event: status\n";
277 datagram +=
"data: ";
281 lresponse->write(datagram);
282 lresponse->flushSocket();
283 lresponse->flushAndDelete();
virtual void serviceIdPut(HobrasoftHttpd::HttpRequest *request, HobrasoftHttpd::HttpResponse *response, const QVariantMap &data)
Pošle odpověď na požadavek konkrétního ID metodou PUT - obvykle vloží nový objekt nebo přepíše existu...
AbstractController(HobrasoftHttpd::HttpConnection *parent)
Konstruktor.
virtual void serviceIdGet(HobrasoftHttpd::HttpRequest *request, HobrasoftHttpd::HttpResponse *response, const QString &id)
Pošle odpověď na požadavek konkrétního ID metodou GET.
HobrasoftHttpd::HttpConnection * connection() const
Vrací ukazatel na aktuální connection.
virtual void serviceEvent(HobrasoftHttpd::HttpRequest *request, HobrasoftHttpd::HttpResponse *response, const QVariant &data)
Pošle do otevřeného proudu událostí jednu událost.
virtual void serviceIdDelete(HobrasoftHttpd::HttpRequest *request, HobrasoftHttpd::HttpResponse *response, const QString &id)
Pošle odpověď na požadavek konkrétního ID metodou DELETE - obvykle objekt smaže.
virtual void serviceIdEvents(HobrasoftHttpd::HttpRequest *request, HobrasoftHttpd::HttpResponse *response, const QString &id)
Pošle v odpovědi proud událostí spojených se všemi objekty ve třídě
virtual void serviceEvents(HobrasoftHttpd::HttpRequest *request, HobrasoftHttpd::HttpResponse *response)
Pošle v odpovědi kompletní seznam všech objektů ve třídě a následně
virtual void serviceError(HobrasoftHttpd::HttpRequest *request, HobrasoftHttpd::HttpResponse *response, int code, const QString &error, const QVariantMap &data)
Pošle chybovou odpověď
virtual void serviceIdPost(HobrasoftHttpd::HttpRequest *request, HobrasoftHttpd::HttpResponse *response, const QVariantMap &data)
Pošle odpověď na požadavek konkrétního ID metodou PUT - obvykle vloží nový objekt nebo přepíše existu...
virtual void service(HobrasoftHttpd::HttpRequest *request, HobrasoftHttpd::HttpResponse *response)
Obsluha požadavku.
virtual void serviceOK(HobrasoftHttpd::HttpRequest *request, HobrasoftHttpd::HttpResponse *response, const QVariant &data=QVariant())
Pošle odpověď 200 OK.
virtual bool exists(const QString &id)
Kontrola existence zadaného ID.
HobrasoftHttpd::HttpRequest * request() const
Vrací ukazatel na aktuální request.
virtual void serviceList(HobrasoftHttpd::HttpRequest *request, HobrasoftHttpd::HttpResponse *response)
Měl by poslat v odpovědi kompletní seznam všech objektů ve třídě a ukončit se.
static QVariant data(const QByteArray &json)
Converts json to data.
static QByteArray json(const QVariant &data)
Converts data to json.
Jmenný prostor pro obsluhu konkrétních HTTP požadavků aplikace.
Permission
Seznam jednotlivých oprávnění