cutelyst 4.3.0
A C++ Web Framework built on top of Qt, using the simple approach of Catalyst (Perl) framework.
response.h
1/*
2 * SPDX-FileCopyrightText: (C) 2013-2023 Daniel Nicoletti <dantti12@gmail.com>
3 * SPDX-License-Identifier: BSD-3-Clause
4 */
5#pragma once
6
7#include <Cutelyst/cutelyst_global.h>
8#include <Cutelyst/headers.h>
9
10#include <QtCore/QIODevice>
11
12class QNetworkCookie;
13
14namespace Cutelyst {
15
16class Context;
17class Engine;
18class EngineRequest;
19class ResponsePrivate;
28class CUTELYST_LIBRARY Response final : public QIODevice
29{
30 Q_OBJECT
31 Q_DECLARE_PRIVATE(Response)
32public:
35 Continue = 100,
36 SwitchingProtocols = 101,
37 OK = 200,
38 Created = 201,
39 Accepted = 202,
40 NonAuthoritativeInformation = 203,
41 NoContent = 204,
42 ResetContent = 205,
43 PartialContent = 206,
44 MultiStatus = 207,
45 MultipleChoices = 300,
46 MovedPermanently = 301,
47 Found = 302,
48 SeeOther = 303, // Since HTTP/1.1
49 NotModified = 304,
50 UseProxy = 305, // Since HTTP/1.1
51 TemporaryRedirect = 307, // Since HTTP/1.1
52 PermanentRedirect = 308, // Since HTTP/1.1
53 BadRequest = 400,
54 Unauthorized = 401,
55 PaymentRequired = 402,
56 Forbidden = 403,
57 NotFound = 404,
58 MethodNotAllowed = 405,
59 NotAcceptable = 406,
60 ProxyAuthenticationRequired = 407,
61 RequestTimeout = 408,
62 Conflict = 409,
63 Gone = 410,
64 LengthRequired = 411,
65 PreconditionFailed = 412,
66 RequestEntityTooLarge = 413,
67 RequestURITooLong = 414,
68 UnsupportedMediaType = 415,
69 RequestedRangeNotSatisfiable = 416,
70 ExpectationFailed = 417,
71 InternalServerError = 500,
72 NotImplemented = 501,
73 BadGateway = 502,
74 ServiceUnavailable = 503,
75 GatewayTimeout = 504,
76 HTTPVersionNotSupported = 505,
77 BandwidthLimitExceeded = 509
78 };
79 Q_ENUM(HttpStatus)
80
81
82 enum CloseCode {
83 CloseCodeNormal = 1000,
84 CloseCodeGoingAway = 1001,
85 CloseCodeProtocolError = 1002,
86 CloseCodeDatatypeNotSupported = 1003,
87 CloseCodeReserved1004 = 1004,
88 CloseCodeMissingStatusCode = 1005,
89 CloseCodeAbnormalDisconnection = 1006,
90 CloseCodeWrongDatatype = 1007,
91 CloseCodePolicyViolated = 1008,
92 CloseCodeTooMuchData = 1009,
93 CloseCodeMissingExtension = 1010,
94 CloseCodeBadOperation = 1011,
95 CloseCodeTlsHandshakeFailed = 1015
96 };
97 Q_ENUM(CloseCode)
98
99
102 virtual ~Response() override;
103
107 quint16 status() const noexcept;
108
112 void setStatus(quint16 status) noexcept;
113
119 bool hasBody() const noexcept;
120
127 [[nodiscard]] QByteArray &body();
128
132 QIODevice *bodyDevice() const noexcept;
133
140 void setBody(QIODevice *body);
141
146 void setBody(const QByteArray &body);
147
152 inline void setBody(const QString &body);
153
158 inline void setBody(QStringView body);
159
164 void setCborBody(const QByteArray &cbor);
165
170 void setCborValueBody(const QCborValue &value);
171
176 inline void setJsonBody(QStringView json);
177
182 void setJsonBody(const QByteArray &json);
183
189 void setJsonObjectBody(const QJsonObject &obj);
190
196 void setJsonArrayBody(const QJsonArray &array);
197
203 QByteArray contentEncoding() const noexcept;
204
210 void setContentEncoding(const QByteArray &encoding);
211
217 qint64 contentLength() const;
218
224 void setContentLength(qint64 length);
225
231 QByteArray contentType() const;
232
238 void setContentType(const QByteArray &type) { headers().setContentType(type); }
239
244 QByteArray contentTypeCharset() const;
245
250 QVariant cookie(const QByteArray &name) const;
251
255 QList<QNetworkCookie> cookies() const;
256
261 void setCookie(const QNetworkCookie &cookie);
262
267 void setCookies(const QList<QNetworkCookie> &cookies);
268
273 int removeCookies(const QByteArray &name);
274
287 void redirect(const QUrl &url, quint16 status = Found);
288
301 void redirect(const QString &url, quint16 status = Found);
302
320 void redirectSafe(const QUrl &url, const QUrl &fallback);
321
325 QUrl location() const noexcept;
326
331 QByteArray header(const QByteArray &field) const noexcept;
332
337 void setHeader(const QByteArray &key, const QByteArray &value);
338
342 Headers &headers() noexcept;
343
347 bool isFinalizedHeaders() const noexcept;
348
352 bool isSequential() const noexcept override;
353
357 qint64 size() const noexcept override;
358
369 bool webSocketHandshake(const QByteArray &key = {},
370 const QByteArray &origin = {},
371 const QByteArray &protocol = {});
372
376 bool webSocketTextMessage(const QString &message);
377
381 bool webSocketBinaryMessage(const QByteArray &message);
382
391 bool webSocketPing(const QByteArray &payload = {});
392
400 bool webSocketClose(quint16 code = Response::CloseCodeNormal, const QString &reason = {});
401
402protected:
406 explicit Response(const Headers &defaultHeaders, EngineRequest *conn = nullptr);
407
415 virtual qint64 writeData(const char *data, qint64 len) override;
416
420 virtual qint64 readData(char *data, qint64 maxlen) override;
421
422 ResponsePrivate *d_ptr;
423 friend class Application;
424 friend class Engine;
425 friend class EngineConnection;
426 friend class Context;
427 friend class ContextPrivate;
428};
429
430inline void Response::setBody(const QString &_body)
431{
432 setBody(_body.toUtf8());
433}
434
436{
437 setBody(_body.toUtf8());
438}
439
441{
442 setJsonBody(_body.toUtf8());
443}
444
445} // namespace Cutelyst
The Cutelyst application.
Definition application.h:66
The Cutelyst Context.
Definition context.h:42
The Cutelyst Engine.
Definition engine.h:20
Container for HTTP headers.
Definition headers.h:24
A Cutelyst response.
Definition response.h:29
bool webSocketTextMessage(const QString &message)
bool webSocketPing(const QByteArray &payload={})
void setBody(QIODevice *body)
Definition response.cpp:103
void redirectSafe(const QUrl &url, const QUrl &fallback)
bool webSocketBinaryMessage(const QByteArray &message)
void redirect(const QString &url, quint16 status=Found)
void setJsonBody(QStringView json)
Definition response.h:440
bool webSocketClose(quint16 code=Response::CloseCodeNormal, const QString &reason={})
QUrl location() const noexcept
The Cutelyst namespace holds all public Cutelyst API.
QByteArray toUtf8() const const
QByteArray toUtf8() const const