18 #include "useragent.h" 20 #include <Cutelyst/Engine> 21 #include <Cutelyst/Context> 22 #include <Cutelyst/Request> 23 #include <Cutelyst/Response> 25 #include <QHostAddress> 26 #include <QLoggingCategory> 27 #include <QNetworkAccessManager> 30 #include <QHttpMultiPart> 32 #include <QJsonDocument> 36 Q_LOGGING_CATEGORY(C_USERAGENT,
"cutelyst.useragent", QtInfoMsg)
38 static thread_local QNetworkAccessManager m_instance;
40 QNetworkAccessManager *Cutelyst::UA::networkAccessManager()
45 QNetworkReply *UA::head(
const QNetworkRequest &request)
47 return m_instance.head(request);
50 QNetworkReply *UA::get(
const QNetworkRequest &request)
52 return m_instance.get(request);
55 QNetworkReply *UA::post(
const QNetworkRequest &request, QIODevice *data)
57 return m_instance.post(request, data);
60 QNetworkReply *UA::post(
const QNetworkRequest &request,
const QByteArray &data)
62 return m_instance.post(request, data);
65 QNetworkReply *UA::put(
const QNetworkRequest &request, QIODevice *data)
67 return m_instance.put(request, data);
70 QNetworkReply *UA::put(
const QNetworkRequest &request,
const QByteArray &data)
72 return m_instance.put(request, data);
75 QNetworkReply *UA::deleteResource(
const QNetworkRequest &request)
77 return m_instance.deleteResource(request);
80 QNetworkReply *UA::sendCustomRequest(
const QNetworkRequest &request,
const QByteArray &verb, QIODevice *data)
82 return m_instance.sendCustomRequest(request, verb, data);
85 QNetworkReply *UA::sendCustomRequest(
const QNetworkRequest &request,
const QByteArray &verb,
const QByteArray &data)
87 #if (QT_VERSION >= QT_VERSION_CHECK(5, 8, 0)) 88 return m_instance.sendCustomRequest(request, verb, data);
90 auto buffer =
new QBuffer;
91 buffer->setData(data);
92 QNetworkReply *reply = m_instance.sendCustomRequest(request, verb, buffer);
93 buffer->setParent(reply);
98 QNetworkReply *UA::post(
const QNetworkRequest &request, QHttpMultiPart *multiPart)
100 return m_instance.post(request, multiPart);
103 QNetworkReply *UA::put(
const QNetworkRequest &request, QHttpMultiPart *multiPart)
105 return m_instance.post(request, multiPart);
108 QNetworkReply *UA::sendCustomRequest(
const QNetworkRequest &request,
const QByteArray &verb, QHttpMultiPart *multiPart)
110 #if (QT_VERSION >= QT_VERSION_CHECK(5, 8, 0)) 111 return m_instance.sendCustomRequest(request, verb, multiPart);
117 QNetworkReply *UA::postJson(
const QNetworkRequest &request,
const QJsonDocument &doc)
119 QNetworkRequest jsonRequest(request);
120 jsonRequest.setHeader(QNetworkRequest::ContentTypeHeader, QByteArrayLiteral(
"application/json"));
121 return m_instance.post(jsonRequest, doc.toJson(QJsonDocument::Compact));
124 QNetworkReply *UA::putJson(
const QNetworkRequest &request,
const QJsonDocument &doc)
126 QNetworkRequest jsonRequest(request);
127 jsonRequest.setHeader(QNetworkRequest::ContentTypeHeader, QByteArrayLiteral(
"application/json"));
128 return m_instance.put(jsonRequest, doc.toJson(QJsonDocument::Compact));
131 QNetworkReply *UA::sendCustomRequestJson(
const QNetworkRequest &request,
const QByteArray &verb,
const QJsonDocument &doc)
133 QNetworkRequest jsonRequest(request);
134 jsonRequest.setHeader(QNetworkRequest::ContentTypeHeader, QByteArrayLiteral(
"application/json"));
135 return UA::sendCustomRequest(jsonRequest, verb, doc.toJson(QJsonDocument::Compact));
138 QNetworkReply *UA::postJsonObject(
const QNetworkRequest &request,
const QJsonObject &obj)
140 QNetworkRequest jsonRequest(request);
141 jsonRequest.setHeader(QNetworkRequest::ContentTypeHeader, QByteArrayLiteral(
"application/json"));
142 return m_instance.post(jsonRequest, QJsonDocument(obj).toJson(QJsonDocument::Compact));
145 QNetworkReply *UA::putJsonObject(
const QNetworkRequest &request,
const QJsonObject &obj)
147 QNetworkRequest jsonRequest(request);
148 jsonRequest.setHeader(QNetworkRequest::ContentTypeHeader, QByteArrayLiteral(
"application/json"));
149 return m_instance.put(jsonRequest, QJsonDocument(obj).toJson(QJsonDocument::Compact));
152 QNetworkReply *UA::sendCustomRequestJsonObject(
const QNetworkRequest &request,
const QByteArray &verb,
const QJsonObject &obj)
154 QNetworkRequest jsonRequest(request);
155 jsonRequest.setHeader(QNetworkRequest::ContentTypeHeader, QByteArrayLiteral(
"application/json"));
156 return UA::sendCustomRequest(jsonRequest, verb, QJsonDocument(obj).toJson(QJsonDocument::Compact));
159 QNetworkReply *UA::postJsonArray(
const QNetworkRequest &request,
const QJsonArray &array)
161 QNetworkRequest jsonRequest(request);
162 jsonRequest.setHeader(QNetworkRequest::ContentTypeHeader, QByteArrayLiteral(
"application/json"));
163 return m_instance.post(jsonRequest, QJsonDocument(array).toJson(QJsonDocument::Compact));
166 QNetworkReply *UA::putJsonArray(
const QNetworkRequest &request,
const QJsonArray &array)
168 QNetworkRequest jsonRequest(request);
169 jsonRequest.setHeader(QNetworkRequest::ContentTypeHeader, QByteArrayLiteral(
"application/json"));
170 return m_instance.put(jsonRequest, QJsonDocument(array).toJson(QJsonDocument::Compact));
173 QNetworkReply *UA::sendCustomRequestJsonArray(
const QNetworkRequest &request,
const QByteArray &verb,
const QJsonArray &array)
175 QNetworkRequest jsonRequest(request);
176 jsonRequest.setHeader(QNetworkRequest::ContentTypeHeader, QByteArrayLiteral(
"application/json"));
177 return UA::sendCustomRequest(jsonRequest, verb, QJsonDocument(array).toJson(QJsonDocument::Compact));
180 QNetworkReply *UA::forwardRequest(
Request *request,
const QUrl &destination)
182 QUrl dest(request->uri());
183 dest.setHost(destination.host());
184 dest.setPort(destination.port());
185 dest.setScheme(destination.scheme());
187 QNetworkRequest proxyReq(dest);
189 const Headers reqHeaders = request->headers();
190 const auto headersData = reqHeaders.
data();
192 while (it != headersData.constEnd()) {
197 return m_instance.sendCustomRequest(proxyReq, request->method().toLatin1(), request->
body());
200 QNetworkReply *UA::forwardRequestResponse(
Context *c,
const QUrl &destination)
202 QNetworkReply *reply = forwardRequest(c->request(), destination);
203 QObject::connect(reply, &QNetworkReply::finished, c, [=] {
206 for (
const QNetworkReply::RawHeaderPair &pair : headers) {
207 responseHeaders.
setHeader(QString::fromLatin1(pair.first), QString::fromLatin1(pair.second));
209 c->
response()->
setStatus(quint16(reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toUInt()));
215 void UA::forwardAsync(
Context *c,
const QUrl &destination)
217 QNetworkReply *reply = forwardRequest(c->request(), destination);
218 QObject::connect(reply, &QNetworkReply::finished, c, [=] {
221 for (
const QNetworkReply::RawHeaderPair &pair : headers) {
222 responseHeaders.
setHeader(QString::fromLatin1(pair.first), QString::fromLatin1(pair.second));
224 c->
response()->
setStatus(quint16(reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toUInt()));
static QString camelCaseHeader(const QString &headerKey)
void setStatus(quint16 status)
Response * response() const
The Cutelyst namespace holds all public Cutelyst API.
QHash::const_iterator constBegin() const const
void setBody(QIODevice *body)
void attachAsync()
attachAsync