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", QtWarningMsg)
25 static thread_local QNetworkAccessManager m_instance;
26 m_instance.setAutoDeleteReplies(
true);
30QNetworkReply *
UA::head(
const QNetworkRequest &request)
35QNetworkReply *
UA::get(
const QNetworkRequest &request)
40QNetworkReply *
UA::post(
const QNetworkRequest &request, QIODevice *data)
45QNetworkReply *
UA::post(
const QNetworkRequest &request,
const QByteArray &data)
50QNetworkReply *
UA::put(
const QNetworkRequest &request, QIODevice *data)
55QNetworkReply *
UA::put(
const QNetworkRequest &request,
const QByteArray &data)
72 const QByteArray &verb,
73 const QByteArray &data)
78QNetworkReply *
UA::post(
const QNetworkRequest &request, QHttpMultiPart *multiPart)
83QNetworkReply *
UA::put(
const QNetworkRequest &request, QHttpMultiPart *multiPart)
89 const QByteArray &verb,
90 QHttpMultiPart *multiPart)
95QNetworkReply *
UA::postJson(
const QNetworkRequest &request,
const QJsonDocument &doc)
97 QNetworkRequest jsonRequest(request);
98 jsonRequest.setHeader(QNetworkRequest::ContentTypeHeader,
99 QByteArrayLiteral(
"application/json"));
103QNetworkReply *
UA::putJson(
const QNetworkRequest &request,
const QJsonDocument &doc)
105 QNetworkRequest jsonRequest(request);
106 jsonRequest.setHeader(QNetworkRequest::ContentTypeHeader,
107 QByteArrayLiteral(
"application/json"));
112 const QByteArray &verb,
113 const QJsonDocument &doc)
115 QNetworkRequest jsonRequest(request);
116 jsonRequest.setHeader(QNetworkRequest::ContentTypeHeader,
117 QByteArrayLiteral(
"application/json"));
123 QNetworkRequest jsonRequest(request);
124 jsonRequest.setHeader(QNetworkRequest::ContentTypeHeader,
125 QByteArrayLiteral(
"application/json"));
127 QJsonDocument(
object).toJson(QJsonDocument::Compact));
132 QNetworkRequest jsonRequest(request);
133 jsonRequest.setHeader(QNetworkRequest::ContentTypeHeader,
134 QByteArrayLiteral(
"application/json"));
136 QJsonDocument(
object).toJson(QJsonDocument::Compact));
140 const QByteArray &verb,
141 const QJsonObject &
object)
143 QNetworkRequest jsonRequest(request);
144 jsonRequest.setHeader(QNetworkRequest::ContentTypeHeader,
145 QByteArrayLiteral(
"application/json"));
147 jsonRequest, verb, QJsonDocument(
object).toJson(QJsonDocument::Compact));
152 QNetworkRequest jsonRequest(request);
153 jsonRequest.setHeader(QNetworkRequest::ContentTypeHeader,
154 QByteArrayLiteral(
"application/json"));
156 QJsonDocument(array).toJson(QJsonDocument::Compact));
161 QNetworkRequest jsonRequest(request);
162 jsonRequest.setHeader(QNetworkRequest::ContentTypeHeader,
163 QByteArrayLiteral(
"application/json"));
165 QJsonDocument(array).toJson(QJsonDocument::Compact));
169 const QByteArray &verb,
170 const QJsonArray &array)
172 QNetworkRequest jsonRequest(request);
173 jsonRequest.setHeader(QNetworkRequest::ContentTypeHeader,
174 QByteArrayLiteral(
"application/json"));
176 jsonRequest, verb, QJsonDocument(array).toJson(QJsonDocument::Compact));
181 QUrl dest(request->uri());
182 dest.setHost(destination.host());
183 dest.setPort(destination.port());
184 dest.setScheme(destination.scheme());
186 QNetworkRequest proxyReq(dest);
189 const auto headersData = reqHeaders.
data();
190 auto it = headersData.begin();
191 while (it != headersData.end()) {
192 proxyReq.setRawHeader(it->key, it->value);
202 QObject::connect(reply, &QNetworkReply::finished, c, [=] {
204 const QList<QNetworkReply::RawHeaderPair> &headers = reply->rawHeaderPairs();
205 for (
const QNetworkReply::RawHeaderPair &pair : headers) {
206 responseHeaders.
pushHeader(pair.first, pair.second);
209 quint16(reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toUInt()));
219 QObject::connect(reply, &QNetworkReply::finished, c, [reply, a, c] {
221 const QList<QNetworkReply::RawHeaderPair> &headers = reply->rawHeaderPairs();
222 for (
const QNetworkReply::RawHeaderPair &pair : headers) {
223 responseHeaders.
pushHeader(pair.first, pair.second);
226 quint16(reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toUInt()));
Helper class for asynchronous processing.
Response * response() const noexcept
Headers headers() const noexcept
QIODevice * body() const noexcept
Headers & headers() noexcept
void setStatus(quint16 status) noexcept
void setBody(QIODevice *body)
Send network requests to other endpoints.
CUTELYST_PLUGIN_USERAGENT_EXPORT QNetworkReply * sendCustomRequestJsonObject(const QNetworkRequest &request, const QByteArray &verb, const QJsonObject &object)
CUTELYST_PLUGIN_USERAGENT_EXPORT QNetworkReply * putJson(const QNetworkRequest &request, const QJsonDocument &doc)
CUTELYST_PLUGIN_USERAGENT_EXPORT QNetworkReply * sendCustomRequest(const QNetworkRequest &request, const QByteArray &verb, QIODevice *data=nullptr)
CUTELYST_PLUGIN_USERAGENT_EXPORT QNetworkReply * forwardRequestResponse(Context *c, const QUrl &destination)
CUTELYST_PLUGIN_USERAGENT_EXPORT QNetworkReply * postJsonArray(const QNetworkRequest &request, const QJsonArray &array)
CUTELYST_PLUGIN_USERAGENT_EXPORT QNetworkReply * head(const QNetworkRequest &request)
CUTELYST_PLUGIN_USERAGENT_EXPORT QNetworkReply * get(const QNetworkRequest &request)
CUTELYST_PLUGIN_USERAGENT_EXPORT QNetworkReply * forwardRequest(Request *request, const QUrl &destination)
CUTELYST_PLUGIN_USERAGENT_EXPORT QNetworkReply * postJsonObject(const QNetworkRequest &request, const QJsonObject &object)
CUTELYST_PLUGIN_USERAGENT_EXPORT QNetworkReply * putJsonArray(const QNetworkRequest &request, const QJsonArray &array)
CUTELYST_PLUGIN_USERAGENT_EXPORT QNetworkAccessManager * networkAccessManager()
CUTELYST_PLUGIN_USERAGENT_EXPORT QNetworkReply * sendCustomRequestJson(const QNetworkRequest &request, const QByteArray &verb, const QJsonDocument &doc)
CUTELYST_PLUGIN_USERAGENT_EXPORT QNetworkReply * put(const QNetworkRequest &request, QIODevice *data)
CUTELYST_PLUGIN_USERAGENT_EXPORT QNetworkReply * postJson(const QNetworkRequest &request, const QJsonDocument &doc)
CUTELYST_PLUGIN_USERAGENT_EXPORT QNetworkReply * deleteResource(const QNetworkRequest &request)
CUTELYST_PLUGIN_USERAGENT_EXPORT QNetworkReply * post(const QNetworkRequest &request, QIODevice *data)
CUTELYST_PLUGIN_USERAGENT_EXPORT QNetworkReply * sendCustomRequestJsonArray(const QNetworkRequest &request, const QByteArray &verb, const QJsonArray &array)
CUTELYST_PLUGIN_USERAGENT_EXPORT QNetworkReply * putJsonObject(const QNetworkRequest &request, const QJsonObject &object)
CUTELYST_PLUGIN_USERAGENT_EXPORT void forwardAsync(Context *c, const QUrl &destination)
The Cutelyst namespace holds all public Cutelyst API.