From 0d58d67a3c40d93aa82d071e177faa2c17dff514 Mon Sep 17 00:00:00 2001 From: ArsenArsen Date: Fri, 14 Jul 2017 18:49:00 +0200 Subject: [PATCH] Multipart works now --- README.md | 4 ++++ packages/arch/KShare/PKGBUILD.sample | 2 +- uploaders/customuploader.cpp | 27 ++++++++++++++++++--------- 3 files changed, 23 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index c62905a..9a25e68 100644 --- a/README.md +++ b/README.md @@ -21,6 +21,10 @@ See the [wiki](https://github.com/ArsenArsen/KShare/wiki). * libavcodec * libavutil * libswscale +Additionally, on Linux, you require: +* XCB +* XCB xfixes +* XCB cursor Despite the name implying so, this project does not depend on the KDE API at all. diff --git a/packages/arch/KShare/PKGBUILD.sample b/packages/arch/KShare/PKGBUILD.sample index 8915b05..dd013cb 100644 --- a/packages/arch/KShare/PKGBUILD.sample +++ b/packages/arch/KShare/PKGBUILD.sample @@ -17,7 +17,7 @@ build() { git checkout dev git submodule update --init --recursive qmake - make + make -j$(($(nproc) + 1)) } package() { diff --git a/uploaders/customuploader.cpp b/uploaders/customuploader.cpp index f9b8453..0610672 100644 --- a/uploaders/customuploader.cpp +++ b/uploaders/customuploader.cpp @@ -293,6 +293,8 @@ void CustomUploader::doUpload(QByteArray imgData, QString format) { case RequestFormat::MULTIPART_FORM_DATA: { QHttpMultiPart *multipart = new QHttpMultiPart(QHttpMultiPart::FormDataType); auto arr = body.toArray(); + QList buffersToDelete; + QList arraysToDelete; for (QJsonValue val : arr) { auto valo = val.toObject(); QHttpPart part; @@ -307,18 +309,19 @@ void CustomUploader::doUpload(QByteArray imgData, QString format) { body.append(split[i]); if (i < split.size() - 1) body.append(imgData); } - } + } else + body = s.toUtf8(); QByteArray *bodyHeap = new QByteArray; body.swap(*bodyHeap); QBuffer *buffer = new QBuffer(bodyHeap); buffer->open(QIODevice::ReadOnly); part.setBodyDevice(buffer); - multipart->append(part); + buffersToDelete.append(buffer); + arraysToDelete.append(bodyHeap); } else { auto bdo = bd.toObject(); QJsonObject result = recurseAndReplace(bdo, imgData, mime); part.setBody(QJsonDocument::fromVariant(result.toVariantMap()).toJson()); - multipart->append(part); } QByteArray cdh("form-data"); for (QString headerVal : valo.keys()) { @@ -328,22 +331,28 @@ void CustomUploader::doUpload(QByteArray imgData, QString format) { if (str.startsWith("/") && str.endsWith("/")) str = str.mid(1, str.length() - 1).replace("%contenttype", mime); part.setRawHeader(headerVal.toLatin1(), str.toLatin1()); - } else - cdh += "; " + headerVal + "= \"" + valo[headerVal].toString().replace("\"", "\\\"") + "\""; + } else if (headerVal != "body") + cdh += "; " + headerVal + "=\"" + valo[headerVal].toString().replace("\"", "\\\"") + "\""; } part.setHeader(QNetworkRequest::ContentDispositionHeader, cdh); + multipart->append(part); } switch (method) { case HttpMethod::POST: if (returnPathspec == "|") { - ioutils::postMultipartData(target, h, multipart, [&](QByteArray result, QNetworkReply *) { + ioutils::postMultipartData(target, h, multipart, [&, buffersToDelete, arraysToDelete](QByteArray result, QNetworkReply *) { QApplication::clipboard()->setText(QString::fromUtf8(result)); + for (auto buffer : buffersToDelete) buffer->deleteLater(); + for (auto arr : arraysToDelete) delete arr; notifications::notify("KShare Custom Uploader " + name(), "Copied upload result to clipboard!"); }); } else { - ioutils::postMultipart(target, h, multipart, [&](QJsonDocument result, QByteArray data, QNetworkReply *) { - parseResult(result, data, returnPathspec, name()); - }); + ioutils::postMultipart(target, h, multipart, + [&, buffersToDelete, arraysToDelete](QJsonDocument result, QByteArray data, QNetworkReply *) { + for (auto buffer : buffersToDelete) buffer->deleteLater(); + for (auto arr : arraysToDelete) delete arr; + parseResult(result, data, returnPathspec, name()); + }); } break; }