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
15Cookie::Cookie(const QByteArray &name, const QByteArray &value)
16 : QNetworkCookie(name, value)
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
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)