cutelyst 3.9.1
A C++ Web Framework built on top of Qt, using the simple approach of Catalyst (Perl) framework.
cookie.cpp
1/*
2 * SPDX-FileCopyrightText: (C) 2023 Matthias Fehring <mf@huessenbergnetz.de>
3 * SPDX-License-Identifier: BSD-3-Clause
4 */
5
6#include "cookie_p.h"
7
8#include <QDateTime>
9#include <QHostAddress>
10#include <QLocale>
11#include <QUrl>
12
13using namespace Cutelyst;
14
17 , d(new CookiePrivate)
18{
19 qRegisterMetaType<Cookie>();
20 qRegisterMetaType<QList<Cookie>>();
21}
22
24 : QNetworkCookie(other)
25 , d(other.d)
26{
27}
28
29Cookie::~Cookie() = default;
30
32{
34 d = other.d;
35 return *this;
36}
37
38bool Cookie::operator==(const Cookie &other) const
39{
40 if (QNetworkCookie::operator==(other) && d == other.d) {
41 return true;
42 }
43
44 return QNetworkCookie::operator==(other) && d->sameSite == other.d->sameSite;
45}
46
48{
49 return d->sameSite;
50}
51
53{
54 d->sameSite = sameSite;
55}
56
57namespace {
58QByteArray sameSiteToRawString(Cookie::SameSite samesite)
59{
60 switch (samesite) {
62 return QByteArrayLiteral("None");
64 return QByteArrayLiteral("Lax");
66 return QByteArrayLiteral("Strict");
68 break;
69 }
70 return QByteArray();
71}
72} // namespace
73
75{
76 QByteArray result;
77 if (name().isEmpty())
78 return result; // not a valid cookie
79
80 result = name();
81 result += '=';
82 result += value();
83
84 if (form == Full) {
85 // same as above, but encoding everything back
86 if (isSecure())
87 result += "; secure";
88 if (isHttpOnly())
89 result += "; HttpOnly";
90 if (d->sameSite != SameSite::Default) {
91 result += "; SameSite=";
92 result += sameSiteToRawString(d->sameSite);
93 }
94 if (!isSessionCookie()) {
95 result += "; expires=";
96 result += QLocale::c()
97 .toString(expirationDate().toUTC(),
98 QStringLiteral("ddd, dd-MMM-yyyy hh:mm:ss 'GMT"))
99 .toLatin1();
100 }
101 if (!domain().isEmpty()) {
102 result += "; domain=";
103 if (domain().startsWith(u'.')) {
104 result += '.';
105 result += QUrl::toAce(domain().mid(1));
106 } else {
107 QHostAddress hostAddr(domain());
108 if (hostAddr.protocol() == QAbstractSocket::IPv6Protocol) {
109 result += '[';
110 result += domain().toUtf8();
111 result += ']';
112 } else {
113 result += QUrl::toAce(domain());
114 }
115 }
116 }
117 if (!path().isEmpty()) {
118 result += "; path=";
119 result += path().toUtf8();
120 }
121 }
122 return result;
123}
124
125#ifndef QT_NO_DEBUG_STREAM
126QDebug operator<<(QDebug s, const Cutelyst::Cookie &cookie)
127{
128 QDebugStateSaver saver(s);
129 Q_UNUSED(saver)
130 s.resetFormat().nospace();
131 s << "Cutelyst::Cookie(" << cookie.toRawForm(Cookie::Full) << ')';
132 return s;
133}
134#endif
135
136#include "moc_cookie.cpp"
The Cutelyst Cookie.
Definition cookie.h:29
SameSite sameSitePolicy() const
Returns the "SameSite" option if specified in the cookie string, SameSite::Default if not present.
Definition cookie.cpp:47
Cookie(const QByteArray &name=QByteArray(), const QByteArray &value=QByteArray())
Create a new Cookie object, initializing the cookie name to name and its value to value.
Definition cookie.cpp:15
void setSameSitePolicy(SameSite sameSite)
Sets the "SameSite" option of this cookie to sameSite.
Definition cookie.cpp:52
bool operator==(const Cookie &other) const
Returns true if this cookie is equal to other.
Definition cookie.cpp:38
~Cookie()
Destroys this Cookie object.
Cookie & operator=(Cookie &&other) noexcept
Move assigns the contents of the Cookie object other to this object.
Definition cookie.h:62
QByteArray toRawForm(RawForm form=Full) const
Returns the raw form of this Cookie.
Definition cookie.cpp:74
The Cutelyst namespace holds all public Cutelyst API.
Definition Mainpage.dox:8
QDebug & nospace()
QDebug & resetFormat()
QAbstractSocket::NetworkLayerProtocol protocol() const const
QLocale c()
QString toString(qlonglong i) const const
QNetworkCookie(const QByteArray &name, const QByteArray &value)
QString domain() const const
QDateTime expirationDate() const const
bool isHttpOnly() const const
bool isSecure() const const
bool isSessionCookie() const const
QByteArray name() const const
QNetworkCookie & operator=(const QNetworkCookie &other)
bool operator==(const QNetworkCookie &other) const const
QString path() const const
QByteArray value() const const
QByteArray toLatin1() const const
QByteArray toUtf8() const const
QByteArray toAce(const QString &domain)