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