7#include <Cutelyst/Context>
8#include <Cutelyst/Engine>
9#include <Cutelyst/Request>
10#include <Cutelyst/Response>
13#include <QHostAddress>
14#include <QHttpMultiPart>
15#include <QJsonDocument>
16#include <QLoggingCategory>
17#include <QNetworkAccessManager>
21Q_LOGGING_CATEGORY(C_USERAGENT,
"cutelyst.useragent", QtInfoMsg)
23static thread_local QNetworkAccessManager m_instance;
25QNetworkAccessManager *Cutelyst::UA::networkAccessManager()
30QNetworkReply *UA::head(
const QNetworkRequest &request)
32 return m_instance.head(request);
35QNetworkReply *UA::get(
const QNetworkRequest &request)
37 return m_instance.get(request);
40QNetworkReply *UA::post(
const QNetworkRequest &request, QIODevice *data)
42 return m_instance.post(request, data);
45QNetworkReply *UA::post(
const QNetworkRequest &request,
const QByteArray &data)
47 return m_instance.post(request, data);
50QNetworkReply *UA::put(
const QNetworkRequest &request, QIODevice *data)
52 return m_instance.put(request, data);
55QNetworkReply *UA::put(
const QNetworkRequest &request,
const QByteArray &data)
57 return m_instance.put(request, data);
60QNetworkReply *UA::deleteResource(
const QNetworkRequest &request)
62 return m_instance.deleteResource(request);
66 UA::sendCustomRequest(
const QNetworkRequest &request,
const QByteArray &verb, QIODevice *data)
68 return m_instance.sendCustomRequest(request, verb, data);
71QNetworkReply *UA::sendCustomRequest(
const QNetworkRequest &request,
72 const QByteArray &verb,
73 const QByteArray &data)
75 return m_instance.sendCustomRequest(request, verb, data);
78QNetworkReply *UA::post(
const QNetworkRequest &request, QHttpMultiPart *multiPart)
80 return m_instance.post(request, multiPart);
83QNetworkReply *UA::put(
const QNetworkRequest &request, QHttpMultiPart *multiPart)
85 return m_instance.post(request, multiPart);
88QNetworkReply *UA::sendCustomRequest(
const QNetworkRequest &request,
89 const QByteArray &verb,
90 QHttpMultiPart *multiPart)
92 return m_instance.sendCustomRequest(request, verb, multiPart);
95QNetworkReply *UA::postJson(
const QNetworkRequest &request,
const QJsonDocument &doc)
97 QNetworkRequest jsonRequest(request);
98 jsonRequest.setHeader(QNetworkRequest::ContentTypeHeader,
99 QByteArrayLiteral(
"application/json"));
100 return m_instance.post(jsonRequest, doc.toJson(QJsonDocument::Compact));
103QNetworkReply *UA::putJson(
const QNetworkRequest &request,
const QJsonDocument &doc)
105 QNetworkRequest jsonRequest(request);
106 jsonRequest.setHeader(QNetworkRequest::ContentTypeHeader,
107 QByteArrayLiteral(
"application/json"));
108 return m_instance.put(jsonRequest, doc.toJson(QJsonDocument::Compact));
111QNetworkReply *UA::sendCustomRequestJson(
const QNetworkRequest &request,
112 const QByteArray &verb,
113 const QJsonDocument &doc)
115 QNetworkRequest jsonRequest(request);
116 jsonRequest.setHeader(QNetworkRequest::ContentTypeHeader,
117 QByteArrayLiteral(
"application/json"));
118 return UA::sendCustomRequest(jsonRequest, verb, doc.toJson(QJsonDocument::Compact));
121QNetworkReply *UA::postJsonObject(
const QNetworkRequest &request,
const QJsonObject &obj)
123 QNetworkRequest jsonRequest(request);
124 jsonRequest.setHeader(QNetworkRequest::ContentTypeHeader,
125 QByteArrayLiteral(
"application/json"));
126 return m_instance.post(jsonRequest, QJsonDocument(obj).toJson(QJsonDocument::Compact));
129QNetworkReply *UA::putJsonObject(
const QNetworkRequest &request,
const QJsonObject &obj)
131 QNetworkRequest jsonRequest(request);
132 jsonRequest.setHeader(QNetworkRequest::ContentTypeHeader,
133 QByteArrayLiteral(
"application/json"));
134 return m_instance.put(jsonRequest, QJsonDocument(obj).toJson(QJsonDocument::Compact));
137QNetworkReply *UA::sendCustomRequestJsonObject(
const QNetworkRequest &request,
138 const QByteArray &verb,
139 const QJsonObject &obj)
141 QNetworkRequest jsonRequest(request);
142 jsonRequest.setHeader(QNetworkRequest::ContentTypeHeader,
143 QByteArrayLiteral(
"application/json"));
144 return UA::sendCustomRequest(
145 jsonRequest, verb, QJsonDocument(obj).toJson(QJsonDocument::Compact));
148QNetworkReply *UA::postJsonArray(
const QNetworkRequest &request,
const QJsonArray &array)
150 QNetworkRequest jsonRequest(request);
151 jsonRequest.setHeader(QNetworkRequest::ContentTypeHeader,
152 QByteArrayLiteral(
"application/json"));
153 return m_instance.post(jsonRequest, QJsonDocument(array).toJson(QJsonDocument::Compact));
156QNetworkReply *UA::putJsonArray(
const QNetworkRequest &request,
const QJsonArray &array)
158 QNetworkRequest jsonRequest(request);
159 jsonRequest.setHeader(QNetworkRequest::ContentTypeHeader,
160 QByteArrayLiteral(
"application/json"));
161 return m_instance.put(jsonRequest, QJsonDocument(array).toJson(QJsonDocument::Compact));
164QNetworkReply *UA::sendCustomRequestJsonArray(
const QNetworkRequest &request,
165 const QByteArray &verb,
166 const QJsonArray &array)
168 QNetworkRequest jsonRequest(request);
169 jsonRequest.setHeader(QNetworkRequest::ContentTypeHeader,
170 QByteArrayLiteral(
"application/json"));
171 return UA::sendCustomRequest(
172 jsonRequest, verb, QJsonDocument(array).toJson(QJsonDocument::Compact));
175QNetworkReply *UA::forwardRequest(
Request *request,
const QUrl &destination)
177 QUrl dest(request->uri());
178 dest.setHost(destination.host());
179 dest.setPort(destination.port());
180 dest.setScheme(destination.scheme());
182 QNetworkRequest proxyReq(dest);
185 const auto headersData = reqHeaders.
data();
186 auto it = headersData.constBegin();
187 while (it != headersData.constEnd()) {
189 it.value().toLatin1());
193 return m_instance.sendCustomRequest(proxyReq, request->method().toLatin1(), request->
body());
196QNetworkReply *UA::forwardRequestResponse(
Context *c,
const QUrl &destination)
198 QNetworkReply *reply = forwardRequest(c->request(), destination);
199 QObject::connect(reply, &QNetworkReply::finished, c, [=] {
201 const QList<QNetworkReply::RawHeaderPair> &headers = reply->rawHeaderPairs();
202 for (
const QNetworkReply::RawHeaderPair &pair : headers) {
203 responseHeaders.
setHeader(QString::fromLatin1(pair.first),
204 QString::fromLatin1(pair.second));
207 quint16(reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toUInt()));
213void UA::forwardAsync(
Context *c,
const QUrl &destination)
215 QNetworkReply *reply = forwardRequest(c->request(), destination);
216 QObject::connect(reply, &QNetworkReply::finished, c, [=] {
218 const QList<QNetworkReply::RawHeaderPair> &headers = reply->rawHeaderPairs();
219 for (
const QNetworkReply::RawHeaderPair &pair : headers) {
220 responseHeaders.
setHeader(QString::fromLatin1(pair.first),
221 QString::fromLatin1(pair.second));
224 quint16(reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toUInt()));
void attachAsync()
attachAsync
void detachAsync() noexcept
Response * response() const noexcept
static QString camelCaseHeader(const QString &headerKey)
Headers headers() const noexcept
void setStatus(quint16 status) noexcept
void setBody(QIODevice *body)
Headers & headers() noexcept
The Cutelyst namespace holds all public Cutelyst API.