cutelyst  3.9.1
A C++ Web Framework built on top of Qt, using the simple approach of Catalyst (Perl) framework.
view.cpp
1 /*
2  * SPDX-FileCopyrightText: (C) 2013-2022 Daniel Nicoletti <dantti12@gmail.com>
3  * SPDX-License-Identifier: BSD-3-Clause
4  */
5 #include "view.h"
6 
7 #include "common.h"
8 #include "view_p.h"
9 
10 #include <Cutelyst/Context>
11 #include <Cutelyst/Response>
12 
13 #include <QtCore/QLoggingCategory>
14 #include <QtCore/QVariant>
15 
16 using namespace Cutelyst;
17 
18 View::View(QObject *parent, const QString &name)
19  : Component(new ViewPrivate, parent)
20 {
21  setName(name);
22 }
23 
24 View::View(ViewPrivate *d, QObject *parent, const QString &name)
25  : Component(d, parent)
26 {
27  setName(name);
28 }
29 
30 Component::Modifiers View::modifiers() const
31 {
32  return Component::OnlyExecute;
33 }
34 
35 bool View::doExecute(Context *c)
36 {
37  Q_D(const View);
38  Response *response = c->response();
39  if (response->hasBody()) {
40  // Ignore if we already have a body
41  return true;
42  }
43 
44  const QByteArray output = render(c);
45  if (Q_UNLIKELY(c->error())) {
46  const auto errors = c->errors();
47  for (const QString &error : errors) {
48  qCCritical(CUTELYST_VIEW) << error;
49  }
50  }
51  const QString acceptEncoding = c->req()->header(QStringLiteral("ACCEPT_ENCODING"));
52  if (d->minimalSizeToDeflate >= 0 && output.count() > d->minimalSizeToDeflate &&
53  acceptEncoding.contains(QLatin1String("deflate"), Qt::CaseInsensitive)) {
54  QByteArray compressedData = qCompress(output); // Use zlib's default compression
55  compressedData.remove(0, 6); // Remove qCompress and zlib headers
56  compressedData.chop(4); // Remove zlib tailer
57  response->headers().setContentEncoding(QStringLiteral("deflate"));
58  response->setBody(compressedData);
59  } else {
60  response->setBody(output);
61  }
62  return !c->error();
63 }
64 
65 void View::setMinimalSizeToDeflate(qint32 minSize)
66 {
67  Q_D(View);
68  d->minimalSizeToDeflate = minSize;
69 }
70 #include "moc_view.cpp"
void setName(const QString &name)
Definition: component.cpp:39
bool error() const noexcept
Returns true if an error was set.
Definition: context.cpp:49
Headers & headers() noexcept
void chop(qsizetype n)
The Cutelyst Component base class.
Definition: component.h:25
The Cutelyst Context.
Definition: context.h:38
bool hasBody() const noexcept
Definition: response.cpp:76
void setMinimalSizeToDeflate(qint32 minSize=-1)
Definition: view.cpp:65
QString name() const
Definition: component.cpp:33
CaseInsensitive
QString header(const QString &key) const
Definition: request.h:581
The Cutelyst namespace holds all public Cutelyst API.
Definition: Mainpage.dox:7
qsizetype count() const const
virtual QByteArray render(Context *c) const =0
bool contains(QChar ch, Qt::CaseSensitivity cs) const const
virtual Modifiers modifiers() const override
Definition: view.cpp:30
Cutelyst View abstract view component
Definition: view.h:21
void setContentEncoding(const QString &encoding)
Definition: headers.cpp:53
View(QObject *parent, const QString &name)
Definition: view.cpp:18
void setBody(QIODevice *body)
Definition: response.cpp:100
Response * response() const noexcept
Definition: context.cpp:96
QByteArray & remove(qsizetype pos, qsizetype len)
QStringList errors() const noexcept
Returns a list of errors that were defined.
Definition: context.cpp:66