7 #include <Cutelyst/Engine>
8 #include <Cutelyst/Context>
9 #include <Cutelyst/Request>
10 #include <Cutelyst/Response>
12 #include <QHostAddress>
13 #include <QLoggingCategory>
14 #include <QNetworkAccessManager>
17 #include <QHttpMultiPart>
19 #include <QJsonDocument>
23 Q_LOGGING_CATEGORY(C_USERAGENT,
"cutelyst.useragent", QtInfoMsg)
25 static thread_local QNetworkAccessManager m_instance;
27 QNetworkAccessManager *Cutelyst::UA::networkAccessManager()
32 QNetworkReply *UA::head(
const QNetworkRequest &request)
34 return m_instance.head(request);
37 QNetworkReply *UA::get(
const QNetworkRequest &request)
39 return m_instance.get(request);
42 QNetworkReply *UA::post(
const QNetworkRequest &request, QIODevice *data)
44 return m_instance.post(request, data);
47 QNetworkReply *UA::post(
const QNetworkRequest &request,
const QByteArray &data)
49 return m_instance.post(request, data);
52 QNetworkReply *UA::put(
const QNetworkRequest &request, QIODevice *data)
54 return m_instance.put(request, data);
57 QNetworkReply *UA::put(
const QNetworkRequest &request,
const QByteArray &data)
59 return m_instance.put(request, data);
62 QNetworkReply *UA::deleteResource(
const QNetworkRequest &request)
64 return m_instance.deleteResource(request);
67 QNetworkReply *UA::sendCustomRequest(
const QNetworkRequest &request,
const QByteArray &verb, QIODevice *data)
69 return m_instance.sendCustomRequest(request, verb, data);
72 QNetworkReply *UA::sendCustomRequest(
const QNetworkRequest &request,
const QByteArray &verb,
const QByteArray &data)
74 return m_instance.sendCustomRequest(request, verb, data);
77 QNetworkReply *UA::post(
const QNetworkRequest &request, QHttpMultiPart *multiPart)
79 return m_instance.post(request, multiPart);
82 QNetworkReply *UA::put(
const QNetworkRequest &request, QHttpMultiPart *multiPart)
84 return m_instance.post(request, multiPart);
87 QNetworkReply *UA::sendCustomRequest(
const QNetworkRequest &request,
const QByteArray &verb, QHttpMultiPart *multiPart)
89 return m_instance.sendCustomRequest(request, verb, multiPart);
92 QNetworkReply *UA::postJson(
const QNetworkRequest &request,
const QJsonDocument &doc)
94 QNetworkRequest jsonRequest(request);
95 jsonRequest.setHeader(QNetworkRequest::ContentTypeHeader, QByteArrayLiteral(
"application/json"));
96 return m_instance.post(jsonRequest, doc.toJson(QJsonDocument::Compact));
99 QNetworkReply *UA::putJson(
const QNetworkRequest &request,
const QJsonDocument &doc)
101 QNetworkRequest jsonRequest(request);
102 jsonRequest.setHeader(QNetworkRequest::ContentTypeHeader, QByteArrayLiteral(
"application/json"));
103 return m_instance.put(jsonRequest, doc.toJson(QJsonDocument::Compact));
106 QNetworkReply *UA::sendCustomRequestJson(
const QNetworkRequest &request,
const QByteArray &verb,
const QJsonDocument &doc)
108 QNetworkRequest jsonRequest(request);
109 jsonRequest.setHeader(QNetworkRequest::ContentTypeHeader, QByteArrayLiteral(
"application/json"));
110 return UA::sendCustomRequest(jsonRequest, verb, doc.toJson(QJsonDocument::Compact));
113 QNetworkReply *UA::postJsonObject(
const QNetworkRequest &request,
const QJsonObject &obj)
115 QNetworkRequest jsonRequest(request);
116 jsonRequest.setHeader(QNetworkRequest::ContentTypeHeader, QByteArrayLiteral(
"application/json"));
117 return m_instance.post(jsonRequest, QJsonDocument(obj).toJson(QJsonDocument::Compact));
120 QNetworkReply *UA::putJsonObject(
const QNetworkRequest &request,
const QJsonObject &obj)
122 QNetworkRequest jsonRequest(request);
123 jsonRequest.setHeader(QNetworkRequest::ContentTypeHeader, QByteArrayLiteral(
"application/json"));
124 return m_instance.put(jsonRequest, QJsonDocument(obj).toJson(QJsonDocument::Compact));
127 QNetworkReply *UA::sendCustomRequestJsonObject(
const QNetworkRequest &request,
const QByteArray &verb,
const QJsonObject &obj)
129 QNetworkRequest jsonRequest(request);
130 jsonRequest.setHeader(QNetworkRequest::ContentTypeHeader, QByteArrayLiteral(
"application/json"));
131 return UA::sendCustomRequest(jsonRequest, verb, QJsonDocument(obj).toJson(QJsonDocument::Compact));
134 QNetworkReply *UA::postJsonArray(
const QNetworkRequest &request,
const QJsonArray &array)
136 QNetworkRequest jsonRequest(request);
137 jsonRequest.setHeader(QNetworkRequest::ContentTypeHeader, QByteArrayLiteral(
"application/json"));
138 return m_instance.post(jsonRequest, QJsonDocument(array).toJson(QJsonDocument::Compact));
141 QNetworkReply *UA::putJsonArray(
const QNetworkRequest &request,
const QJsonArray &array)
143 QNetworkRequest jsonRequest(request);
144 jsonRequest.setHeader(QNetworkRequest::ContentTypeHeader, QByteArrayLiteral(
"application/json"));
145 return m_instance.put(jsonRequest, QJsonDocument(array).toJson(QJsonDocument::Compact));
148 QNetworkReply *UA::sendCustomRequestJsonArray(
const QNetworkRequest &request,
const QByteArray &verb,
const QJsonArray &array)
150 QNetworkRequest jsonRequest(request);
151 jsonRequest.setHeader(QNetworkRequest::ContentTypeHeader, QByteArrayLiteral(
"application/json"));
152 return UA::sendCustomRequest(jsonRequest, verb, QJsonDocument(array).toJson(QJsonDocument::Compact));
155 QNetworkReply *UA::forwardRequest(
Request *request,
const QUrl &destination)
157 QUrl dest(request->uri());
158 dest.setHost(destination.host());
159 dest.setPort(destination.port());
160 dest.setScheme(destination.scheme());
162 QNetworkRequest proxyReq(dest);
165 const auto headersData = reqHeaders.
data();
166 auto it = headersData.constBegin();
167 while (it != headersData.constEnd()) {
172 return m_instance.sendCustomRequest(proxyReq, request->method().toLatin1(), request->
body());
175 QNetworkReply *UA::forwardRequestResponse(
Context *c,
const QUrl &destination)
177 QNetworkReply *reply = forwardRequest(c->request(), destination);
178 QObject::connect(reply, &QNetworkReply::finished, c, [=] {
180 const QList<QNetworkReply::RawHeaderPair> &headers = reply->rawHeaderPairs();
181 for (
const QNetworkReply::RawHeaderPair &pair : headers) {
182 responseHeaders.
setHeader(QString::fromLatin1(pair.first), QString::fromLatin1(pair.second));
184 c->
response()->setStatus(quint16(reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toUInt()));
190 void UA::forwardAsync(
Context *c,
const QUrl &destination)
192 QNetworkReply *reply = forwardRequest(c->request(), destination);
193 QObject::connect(reply, &QNetworkReply::finished, c, [=] {
195 const QList<QNetworkReply::RawHeaderPair> &headers = reply->rawHeaderPairs();
196 for (
const QNetworkReply::RawHeaderPair &pair : headers) {
197 responseHeaders.
setHeader(QString::fromLatin1(pair.first), QString::fromLatin1(pair.second));
199 c->
response()->setStatus(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 setBody(QIODevice *body)
The Cutelyst namespace holds all public Cutelyst API.