Multipart, not tested
This commit is contained in:
parent
04db6898b2
commit
db5e82cca8
@ -4,6 +4,8 @@
|
|||||||
#include <QBuffer>
|
#include <QBuffer>
|
||||||
#include <QClipboard>
|
#include <QClipboard>
|
||||||
#include <QFile>
|
#include <QFile>
|
||||||
|
#include <QHttpMultiPart>
|
||||||
|
#include <QJsonArray>
|
||||||
#include <QJsonDocument>
|
#include <QJsonDocument>
|
||||||
#include <QNetworkReply>
|
#include <QNetworkReply>
|
||||||
#include <formats.hpp>
|
#include <formats.hpp>
|
||||||
@ -67,6 +69,8 @@ CustomUploader::CustomUploader(QString absFilePath) {
|
|||||||
rFormat = RequestFormat::JSON;
|
rFormat = RequestFormat::JSON;
|
||||||
else if (formatString == "plain")
|
else if (formatString == "plain")
|
||||||
rFormat = RequestFormat::PLAIN;
|
rFormat = RequestFormat::PLAIN;
|
||||||
|
else if (formatString == "multipart-form-data")
|
||||||
|
rFormat = RequestFormat::MULTIPART_FORM_DATA;
|
||||||
else
|
else
|
||||||
error(absFilePath, "format invalid");
|
error(absFilePath, "format invalid");
|
||||||
}
|
}
|
||||||
@ -75,10 +79,29 @@ CustomUploader::CustomUploader(QString absFilePath) {
|
|||||||
QJsonValue bodyValue = obj["body"];
|
QJsonValue bodyValue = obj["body"];
|
||||||
if (rFormat != RequestFormat::PLAIN) {
|
if (rFormat != RequestFormat::PLAIN) {
|
||||||
if (bodyValue.isUndefined()) error(absFilePath, "body not set");
|
if (bodyValue.isUndefined()) error(absFilePath, "body not set");
|
||||||
|
if (rFormat == RequestFormat::MULTIPART_FORM_DATA) {
|
||||||
|
if (bodyValue.isArray()) {
|
||||||
|
for (QJsonValue val : bodyValue.toArray()) {
|
||||||
|
if (!val.isObject()) error(absFilePath, "all elements of body must be objects");
|
||||||
|
if (!val.toObject()["body"].isObject() && !val.toObject().value("body").isString())
|
||||||
|
error(absFilePath, "all parts must have a body which is object or string!");
|
||||||
|
QJsonObject vo = val.toObject();
|
||||||
|
for (auto v : vo["body"].toObject())
|
||||||
|
if (!v.isObject() && !v.isString())
|
||||||
|
error(absFilePath, "all parts of body must be string or object");
|
||||||
|
for (auto v : vo.keys())
|
||||||
|
if (v.startsWith("__") && !vo[v].isString())
|
||||||
|
error(absFilePath, "all __headers must be strings");
|
||||||
|
}
|
||||||
|
body = bodyValue;
|
||||||
|
} else
|
||||||
|
error(absFilePath, "body not array (needed for multipart)");
|
||||||
|
} else {
|
||||||
if (bodyValue.isObject())
|
if (bodyValue.isObject())
|
||||||
body = bodyValue;
|
body = bodyValue;
|
||||||
else
|
else
|
||||||
error(absFilePath, "body not object");
|
error(absFilePath, "body not object");
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
if (bodyValue.isString()) {
|
if (bodyValue.isString()) {
|
||||||
body = bodyValue;
|
body = bodyValue;
|
||||||
@ -123,6 +146,8 @@ QString getCType(RequestFormat format, QString plainType) {
|
|||||||
return "application/x-www-form-urlencoded";
|
return "application/x-www-form-urlencoded";
|
||||||
case RequestFormat::JSON:
|
case RequestFormat::JSON:
|
||||||
return "application/json";
|
return "application/json";
|
||||||
|
case RequestFormat::MULTIPART_FORM_DATA:
|
||||||
|
return "multipart/form-data";
|
||||||
case RequestFormat::PLAIN:
|
case RequestFormat::PLAIN:
|
||||||
return plainType;
|
return plainType;
|
||||||
}
|
}
|
||||||
@ -265,6 +290,42 @@ void CustomUploader::doUpload(QByteArray imgData, QString format) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
} break;
|
} break;
|
||||||
|
case RequestFormat::MULTIPART_FORM_DATA: {
|
||||||
|
QHttpMultiPart multipart(QHttpMultiPart::FormDataType);
|
||||||
|
auto arr = body.toArray();
|
||||||
|
for (QJsonValue val : arr) {
|
||||||
|
auto valo = val.toObject();
|
||||||
|
QHttpPart part;
|
||||||
|
QJsonValue bd = valo["body"];
|
||||||
|
if (bd.isString()) {
|
||||||
|
QString s = bd.toString();
|
||||||
|
QByteArray body;
|
||||||
|
if (s.startsWith("/") && s.endsWith("/")) {
|
||||||
|
s = s.mid(1, s.length() - 1);
|
||||||
|
QStringList split = s.replace("%contenttype", mime).split("%imagedata");
|
||||||
|
for (int i = 0; i < split.size(); i++) {
|
||||||
|
body.append(split[i]);
|
||||||
|
if (i < split.size() - 1) body.append(imgData);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
QBuffer *buffer = new QBuffer(&imgData);
|
||||||
|
buffer->open(QIODevice::ReadOnly);
|
||||||
|
part.setBodyDevice(buffer);
|
||||||
|
multipart.append(part);
|
||||||
|
} else {
|
||||||
|
auto bdo = bd.toObject();
|
||||||
|
QJsonObject result = recurseAndReplace(bdo, imgData, mime);
|
||||||
|
part.setBody(QJsonDocument::fromVariant(result.toVariantMap()).toJson());
|
||||||
|
multipart.append(part);
|
||||||
|
}
|
||||||
|
for (QString headerVal : valo.keys()) {
|
||||||
|
QString str = valo[headerVal].toString();
|
||||||
|
if (str.startsWith("/") && str.endsWith("/"))
|
||||||
|
str = str.mid(1, str.length() - 1).replace("%contenttype", mime);
|
||||||
|
part.setRawHeader(headerVal.toLatin1(), str.toLatin1());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} break;
|
||||||
}
|
}
|
||||||
if (limit > 0 && data.size() > limit) {
|
if (limit > 0 && data.size() > limit) {
|
||||||
notifications::notify("KShare Custom Uploader " + name(), "File limit exceeded!");
|
notifications::notify("KShare Custom Uploader " + name(), "File limit exceeded!");
|
||||||
|
@ -8,7 +8,7 @@
|
|||||||
|
|
||||||
enum class HttpMethod { POST };
|
enum class HttpMethod { POST };
|
||||||
|
|
||||||
enum class RequestFormat { X_WWW_FORM_URLENCODED, JSON, PLAIN };
|
enum class RequestFormat { X_WWW_FORM_URLENCODED, JSON, MULTIPART_FORM_DATA, PLAIN };
|
||||||
|
|
||||||
class CustomUploader : public Uploader {
|
class CustomUploader : public Uploader {
|
||||||
public:
|
public:
|
||||||
|
Loading…
Reference in New Issue
Block a user