From a1d21f6d3aed561145a2cbe41ed07e03eec208a4 Mon Sep 17 00:00:00 2001 From: sunn <33183834+etherealjoy@users.noreply.github.com> Date: Tue, 21 Jan 2020 12:11:43 +0100 Subject: [PATCH] =?UTF-8?q?[C++]=20[Qt5]Add=20support=20for=20response=20c?= =?UTF-8?q?ompression=20and=20add=20response=20body=20to=20error=20s?= =?UTF-8?q?=E2=80=A6=20(#5060)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Add support for response compression and add response body to error string * Improve robustness while parsing quality and compression levels --- docs/generators/cpp-qt5-client.md | 1 + docs/generators/cpp-qt5-qhttpengine-server.md | 1 + .../languages/CppQt5AbstractCodegen.java | 13 ++++ .../cpp-qt5-client/CMakeLists.txt.mustache | 5 +- .../cpp-qt5-client/HttpRequest.cpp.mustache | 61 +++++++++++++++++-- .../cpp-qt5-client/HttpRequest.h.mustache | 5 +- .../resources/cpp-qt5-client/Project.mustache | 2 +- .../cpp-qt5-client/api-body.mustache | 9 ++- .../cpp-qt5-client/api-header.mustache | 2 + .../cpp-qt5/.openapi-generator/VERSION | 2 +- .../cpp-qt5/client/PFXHttpRequest.cpp | 34 +++++++++-- .../petstore/cpp-qt5/client/PFXHttpRequest.h | 5 +- .../petstore/cpp-qt5/client/PFXPetApi.cpp | 23 ++++++- .../petstore/cpp-qt5/client/PFXPetApi.h | 2 + .../petstore/cpp-qt5/client/PFXStoreApi.cpp | 15 ++++- .../petstore/cpp-qt5/client/PFXStoreApi.h | 2 + .../petstore/cpp-qt5/client/PFXUserApi.cpp | 23 ++++++- .../petstore/cpp-qt5/client/PFXUserApi.h | 2 + .../petstore/cpp-qt5/client/PFXclient.pri | 2 +- 19 files changed, 189 insertions(+), 20 deletions(-) diff --git a/docs/generators/cpp-qt5-client.md b/docs/generators/cpp-qt5-client.md index 5a5ec0f7896..5677ef13d08 100644 --- a/docs/generators/cpp-qt5-client.md +++ b/docs/generators/cpp-qt5-client.md @@ -6,6 +6,7 @@ sidebar_label: cpp-qt5-client | Option | Description | Values | Default | | ------ | ----------- | ------ | ------- | |allowUnicodeIdentifiers|boolean, toggles whether unicode identifiers are allowed in names or not, default is false| |false| +|contentCompression|Enable Compressed Content Encoding for requests and responses| |false| |cppNamespace|C++ namespace (convention: name::space::for::api).| |OpenAPI| |ensureUniqueParams|Whether to ensure parameter names are unique in an operation (rename parameters that are not).| |true| |modelNamePrefix|Prefix that will be prepended to all model names.| |OAI| diff --git a/docs/generators/cpp-qt5-qhttpengine-server.md b/docs/generators/cpp-qt5-qhttpengine-server.md index fd32082fad7..4d9518c2bea 100644 --- a/docs/generators/cpp-qt5-qhttpengine-server.md +++ b/docs/generators/cpp-qt5-qhttpengine-server.md @@ -6,6 +6,7 @@ sidebar_label: cpp-qt5-qhttpengine-server | Option | Description | Values | Default | | ------ | ----------- | ------ | ------- | |allowUnicodeIdentifiers|boolean, toggles whether unicode identifiers are allowed in names or not, default is false| |false| +|contentCompression|Enable Compressed Content Encoding for requests and responses| |false| |cppNamespace|C++ namespace (convention: name::space::for::api).| |OpenAPI| |ensureUniqueParams|Whether to ensure parameter names are unique in an operation (rename parameters that are not).| |true| |modelNamePrefix|Prefix that will be prepended to all model names.| |OAI| diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CppQt5AbstractCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CppQt5AbstractCodegen.java index 22150b58bfd..292a41fdc3e 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CppQt5AbstractCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CppQt5AbstractCodegen.java @@ -21,10 +21,13 @@ public class CppQt5AbstractCodegen extends AbstractCppCodegen implements Codegen protected String apiVersion = "1.0.0"; protected static final String CPP_NAMESPACE = "cppNamespace"; protected static final String CPP_NAMESPACE_DESC = "C++ namespace (convention: name::space::for::api)."; + protected static final String CONTENT_COMPRESSION_ENABLED = "contentCompression"; + protected static final String CONTENT_COMPRESSION_ENABLED_DESC = "Enable Compressed Content Encoding for requests and responses"; protected Set foundationClasses = new HashSet(); protected String cppNamespace = "OpenAPI"; protected Map namespaces = new HashMap(); protected Set systemIncludes = new HashSet(); + protected boolean isContentCompressionEnabled = false; protected Set nonFrameworkPrimitives = new HashSet(); @@ -56,6 +59,7 @@ public class CppQt5AbstractCodegen extends AbstractCppCodegen implements Codegen // CLI options addOption(CPP_NAMESPACE, CPP_NAMESPACE_DESC, this.cppNamespace); addOption(CodegenConstants.MODEL_NAME_PREFIX, CodegenConstants.MODEL_NAME_PREFIX_DESC, this.modelNamePrefix); + addSwitch(CONTENT_COMPRESSION_ENABLED, CONTENT_COMPRESSION_ENABLED_DESC, this.isContentCompressionEnabled); /* * Additional Properties. These values can be passed to the templates and @@ -137,6 +141,11 @@ public class CppQt5AbstractCodegen extends AbstractCppCodegen implements Codegen typeMapping.put("object", modelNamePrefix + "Object"); additionalProperties().put("prefix", modelNamePrefix); } + if (additionalProperties.containsKey(CONTENT_COMPRESSION_ENABLED)) { + setContentCompressionEnabled(convertPropertyToBooleanAndWriteBack(CONTENT_COMPRESSION_ENABLED)); + } else { + additionalProperties.put(CONTENT_COMPRESSION_ENABLED, isContentCompressionEnabled); + } } @Override @@ -379,4 +388,8 @@ public class CppQt5AbstractCodegen extends AbstractCppCodegen implements Codegen } return included; } + + public void setContentCompressionEnabled(boolean flag) { + this.isContentCompressionEnabled = flag; + } } diff --git a/modules/openapi-generator/src/main/resources/cpp-qt5-client/CMakeLists.txt.mustache b/modules/openapi-generator/src/main/resources/cpp-qt5-client/CMakeLists.txt.mustache index c53100cca69..74125fc936e 100644 --- a/modules/openapi-generator/src/main/resources/cpp-qt5-client/CMakeLists.txt.mustache +++ b/modules/openapi-generator/src/main/resources/cpp-qt5-client/CMakeLists.txt.mustache @@ -8,14 +8,15 @@ set(CMAKE_AUTOMOC ON) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC -Wall -Wno-unused-variable") find_package(Qt5Core REQUIRED) -find_package(Qt5Network REQUIRED) +find_package(Qt5Network REQUIRED){{#contentCompression}} +find_package(ZLIB REQUIRED){{/contentCompression}} file(GLOB SRCS ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp ) add_library(${PROJECT_NAME} ${SRCS}) -target_link_libraries(${PROJECT_NAME} PRIVATE Qt5::Core Qt5::Network ssl crypto) +target_link_libraries(${PROJECT_NAME} PRIVATE Qt5::Core Qt5::Network ssl crypto{{#contentCompression}} ${ZLIB_LIBRARIES}{{/contentCompression}}) set_property(TARGET ${PROJECT_NAME} PROPERTY CXX_STANDARD 14) set_property(TARGET ${PROJECT_NAME} PROPERTY CXX_STANDARD_REQUIRED ON) diff --git a/modules/openapi-generator/src/main/resources/cpp-qt5-client/HttpRequest.cpp.mustache b/modules/openapi-generator/src/main/resources/cpp-qt5-client/HttpRequest.cpp.mustache index a28bbad0018..933bb0c1698 100644 --- a/modules/openapi-generator/src/main/resources/cpp-qt5-client/HttpRequest.cpp.mustache +++ b/modules/openapi-generator/src/main/resources/cpp-qt5-client/HttpRequest.cpp.mustache @@ -6,7 +6,8 @@ #include #include #include -#include +#include {{#contentCompression}} +#include {{/contentCompression}} #include "{{prefix}}HttpRequest.h" @@ -95,6 +96,10 @@ void {{prefix}}HttpRequestWorker::setWorkingDirectory(const QString &path) { } } +void {{prefix}}HttpRequestWorker::setCompressionEnabled(bool enable) { + isCompressionEnabled = enable; +} + QString {{prefix}}HttpRequestWorker::http_attribute_encode(QString attribute_name, QString input) { // result structure follows RFC 5987 bool need_utf_encoding = false; @@ -303,6 +308,10 @@ void {{prefix}}HttpRequestWorker::execute({{prefix}}HttpRequestInput *input) { request.setHeader(QNetworkRequest::ContentTypeHeader, "multipart/form-data; boundary=" + boundary); } + if(isCompressionEnabled){ + request.setRawHeader("Accept-Encoding", "deflate, gzip"); + } + if (input->http_method == "GET") { reply = manager->get(request); } else if (input->http_method == "POST") { @@ -332,15 +341,14 @@ void {{prefix}}HttpRequestWorker::execute({{prefix}}HttpRequestInput *input) { void {{prefix}}HttpRequestWorker::on_manager_finished(QNetworkReply *reply) { error_type = reply->error(); - response = reply->readAll(); error_str = reply->errorString(); if (reply->rawHeaderPairs().count() > 0) { for (const auto &item : reply->rawHeaderPairs()) { headers.insert(item.first, item.second); } } + process_response(reply); reply->deleteLater(); - process_form_response(); emit on_execution_finished(this); } @@ -354,7 +362,7 @@ void {{prefix}}HttpRequestWorker::on_manager_timeout(QNetworkReply *reply) { emit on_execution_finished(this); } -void {{prefix}}HttpRequestWorker::process_form_response() { +void {{prefix}}HttpRequestWorker::process_response(QNetworkReply *reply) { if (getResponseHeaders().contains(QString("Content-Disposition"))) { auto contentDisposition = getResponseHeaders().value(QString("Content-Disposition").toUtf8()).split(QString(";"), QString::SkipEmptyParts); auto contentType = @@ -368,18 +376,61 @@ void {{prefix}}HttpRequestWorker::process_form_response() { } } {{prefix}}HttpFileElement felement; - felement.saveToFile(QString(), workingDirectory + QDir::separator() + filename, filename, contentType, response.data()); + felement.saveToFile(QString(), workingDirectory + QDir::separator() + filename, filename, contentType, reply->readAll()); files.insert(filename, felement); } } else if (getResponseHeaders().contains(QString("Content-Type"))) { auto contentType = getResponseHeaders().value(QString("Content-Type").toUtf8()).split(QString(";"), QString::SkipEmptyParts); if ((contentType.count() > 0) && (contentType.first() == QString("multipart/form-data"))) { + // TODO : Handle Multipart responses } else { + if(headers.contains("Content-Encoding")){ + auto encoding = headers.value("Content-Encoding").split(QString(";"), QString::SkipEmptyParts); + if(encoding.count() > 0){ + auto compressionTypes = encoding.first().split(',', QString::SkipEmptyParts); + if(compressionTypes.contains("gzip", Qt::CaseInsensitive) || compressionTypes.contains("deflate", Qt::CaseInsensitive)){ + response = decompress(reply->readAll()); + } + } + } + else { + response = reply->readAll(); + } } } } +QByteArray {{prefix}}HttpRequestWorker::decompress(const QByteArray& data){ + QByteArray result; + bool sts = false;{{#contentCompression}} + do{ + z_stream strm{}; + static const int CHUNK_SIZE = 2048; + char out[CHUNK_SIZE]; + if (data.size() <= 4) { + break; + } + strm.avail_in = data.size(); + strm.next_in = (Bytef*)(data.data()); + if(Z_OK != inflateInit2(&strm, 15 + 32)){ + break; + } + do { + sts = false; + strm.avail_out = CHUNK_SIZE; + strm.next_out = (Bytef*)(out); + if(inflate(&strm, Z_NO_FLUSH) < Z_OK){ + break; + } + result.append(out, CHUNK_SIZE - strm.avail_out); + sts = true; + } while (strm.avail_out == 0); + inflateEnd(&strm); + } while(false);{{/contentCompression}} + return sts ? result : QByteArray(); +} + QSslConfiguration *{{prefix}}HttpRequestWorker::sslDefaultConfiguration; {{#cppNamespaceDeclarations}} diff --git a/modules/openapi-generator/src/main/resources/cpp-qt5-client/HttpRequest.h.mustache b/modules/openapi-generator/src/main/resources/cpp-qt5-client/HttpRequest.h.mustache index 32ee8a2145d..9df29d4f24b 100644 --- a/modules/openapi-generator/src/main/resources/cpp-qt5-client/HttpRequest.h.mustache +++ b/modules/openapi-generator/src/main/resources/cpp-qt5-client/HttpRequest.h.mustache @@ -63,6 +63,7 @@ public: void setWorkingDirectory(const QString &path); {{prefix}}HttpFileElement getHttpFileElement(const QString &fieldname = QString()); QByteArray *getMultiPartField(const QString &fieldname = QString()); + void setCompressionEnabled(bool enable); signals: void on_execution_finished({{prefix}}HttpRequestWorker *worker); @@ -73,8 +74,10 @@ private: QMap multiPartFields; QString workingDirectory; int _timeOut; + bool isCompressionEnabled; void on_manager_timeout(QNetworkReply *reply); - void process_form_response(); + void process_response(QNetworkReply *reply); + QByteArray decompress(const QByteArray& data); private slots: void on_manager_finished(QNetworkReply *reply); }; diff --git a/modules/openapi-generator/src/main/resources/cpp-qt5-client/Project.mustache b/modules/openapi-generator/src/main/resources/cpp-qt5-client/Project.mustache index 854841518e2..6b989b8c00e 100644 --- a/modules/openapi-generator/src/main/resources/cpp-qt5-client/Project.mustache +++ b/modules/openapi-generator/src/main/resources/cpp-qt5-client/Project.mustache @@ -40,5 +40,5 @@ SOURCES += \ # Others $${PWD}/{{prefix}}Helpers.cpp \ $${PWD}/{{prefix}}HttpRequest.cpp \ - $${PWD}/{{prefix}}HttpFileElement.cpp + $${PWD}/{{prefix}}HttpFileElement.cpp diff --git a/modules/openapi-generator/src/main/resources/cpp-qt5-client/api-body.mustache b/modules/openapi-generator/src/main/resources/cpp-qt5-client/api-body.mustache index 7f24ba64a82..451e05b6a18 100644 --- a/modules/openapi-generator/src/main/resources/cpp-qt5-client/api-body.mustache +++ b/modules/openapi-generator/src/main/resources/cpp-qt5-client/api-body.mustache @@ -14,7 +14,8 @@ namespace {{this}} { _host(host), _port(port), _basePath(basePath), - _timeOut(timeOut) {} + _timeOut(timeOut), + _compress(false) {} {{classname}}::~{{classname}}() { } @@ -47,6 +48,10 @@ void {{classname}}::addHeaders(const QString &key, const QString &value) { defaultHeaders.insert(key, value); } +void {{classname}}::enableContentCompression() { + _compress = true; +} + {{#operations}} {{#operation}} void {{classname}}::{{nickname}}({{#allParams}}const {{{dataType}}} &{{paramName}}{{#hasMore}}, {{/hasMore}}{{/allParams}}) { @@ -109,6 +114,7 @@ void {{classname}}::{{nickname}}({{#allParams}}const {{{dataType}}} &{{paramName {{prefix}}HttpRequestWorker *worker = new {{prefix}}HttpRequestWorker(this); worker->setTimeOut(_timeOut); worker->setWorkingDirectory(_workingDirectory); + worker->setCompressionEnabled(_compress); {{prefix}}HttpRequestInput input(fullPath, "{{httpMethod}}"); {{#formParams}}{{^isFile}} input.add_var("{{baseName}}", ::{{cppNamespace}}::toStringValue({{paramName}}));{{/isFile}}{{#isFile}} @@ -144,6 +150,7 @@ void {{classname}}::{{nickname}}Callback({{prefix}}HttpRequestWorker *worker) { msg = QString("Success! %1 bytes").arg(worker->response.length()); } else { msg = "Error: " + worker->error_str; + error_str = QString("%1, %2").arg(worker->error_str).arg(QString(worker->response)); } {{#returnType}} {{#isListContainer}} diff --git a/modules/openapi-generator/src/main/resources/cpp-qt5-client/api-header.mustache b/modules/openapi-generator/src/main/resources/cpp-qt5-client/api-header.mustache index 8c877912e17..07a33698b58 100644 --- a/modules/openapi-generator/src/main/resources/cpp-qt5-client/api-header.mustache +++ b/modules/openapi-generator/src/main/resources/cpp-qt5-client/api-header.mustache @@ -27,6 +27,7 @@ public: void setTimeOut(const int timeOut); void setWorkingDirectory(const QString &path); void addHeaders(const QString &key, const QString &value); + void enableContentCompression(); {{#operations}}{{#operation}} void {{nickname}}({{#allParams}}const {{{dataType}}} &{{paramName}}{{#hasMore}}, {{/hasMore}}{{/allParams}});{{/operation}}{{/operations}} @@ -37,6 +38,7 @@ private: int _timeOut; QString _workingDirectory; QMap defaultHeaders; + bool _compress; {{#operations}}{{#operation}} void {{nickname}}Callback({{prefix}}HttpRequestWorker *worker);{{/operation}}{{/operations}} diff --git a/samples/client/petstore/cpp-qt5/.openapi-generator/VERSION b/samples/client/petstore/cpp-qt5/.openapi-generator/VERSION index e4955748d3e..58592f031f6 100644 --- a/samples/client/petstore/cpp-qt5/.openapi-generator/VERSION +++ b/samples/client/petstore/cpp-qt5/.openapi-generator/VERSION @@ -1 +1 @@ -4.2.2-SNAPSHOT \ No newline at end of file +4.2.3-SNAPSHOT \ No newline at end of file diff --git a/samples/client/petstore/cpp-qt5/client/PFXHttpRequest.cpp b/samples/client/petstore/cpp-qt5/client/PFXHttpRequest.cpp index 30f1c04800c..27152077769 100644 --- a/samples/client/petstore/cpp-qt5/client/PFXHttpRequest.cpp +++ b/samples/client/petstore/cpp-qt5/client/PFXHttpRequest.cpp @@ -103,6 +103,10 @@ void PFXHttpRequestWorker::setWorkingDirectory(const QString &path) { } } +void PFXHttpRequestWorker::setCompressionEnabled(bool enable) { + isCompressionEnabled = enable; +} + QString PFXHttpRequestWorker::http_attribute_encode(QString attribute_name, QString input) { // result structure follows RFC 5987 bool need_utf_encoding = false; @@ -311,6 +315,10 @@ void PFXHttpRequestWorker::execute(PFXHttpRequestInput *input) { request.setHeader(QNetworkRequest::ContentTypeHeader, "multipart/form-data; boundary=" + boundary); } + if(isCompressionEnabled){ + request.setRawHeader("Accept-Encoding", "deflate, gzip"); + } + if (input->http_method == "GET") { reply = manager->get(request); } else if (input->http_method == "POST") { @@ -340,15 +348,14 @@ void PFXHttpRequestWorker::execute(PFXHttpRequestInput *input) { void PFXHttpRequestWorker::on_manager_finished(QNetworkReply *reply) { error_type = reply->error(); - response = reply->readAll(); error_str = reply->errorString(); if (reply->rawHeaderPairs().count() > 0) { for (const auto &item : reply->rawHeaderPairs()) { headers.insert(item.first, item.second); } } + process_response(reply); reply->deleteLater(); - process_form_response(); emit on_execution_finished(this); } @@ -362,7 +369,7 @@ void PFXHttpRequestWorker::on_manager_timeout(QNetworkReply *reply) { emit on_execution_finished(this); } -void PFXHttpRequestWorker::process_form_response() { +void PFXHttpRequestWorker::process_response(QNetworkReply *reply) { if (getResponseHeaders().contains(QString("Content-Disposition"))) { auto contentDisposition = getResponseHeaders().value(QString("Content-Disposition").toUtf8()).split(QString(";"), QString::SkipEmptyParts); auto contentType = @@ -376,18 +383,37 @@ void PFXHttpRequestWorker::process_form_response() { } } PFXHttpFileElement felement; - felement.saveToFile(QString(), workingDirectory + QDir::separator() + filename, filename, contentType, response.data()); + felement.saveToFile(QString(), workingDirectory + QDir::separator() + filename, filename, contentType, reply->readAll()); files.insert(filename, felement); } } else if (getResponseHeaders().contains(QString("Content-Type"))) { auto contentType = getResponseHeaders().value(QString("Content-Type").toUtf8()).split(QString(";"), QString::SkipEmptyParts); if ((contentType.count() > 0) && (contentType.first() == QString("multipart/form-data"))) { + // TODO : Handle Multipart responses } else { + if(headers.contains("Content-Encoding")){ + auto encoding = headers.value("Content-Encoding").split(QString(";"), QString::SkipEmptyParts); + if(encoding.count() > 0){ + auto compressionTypes = encoding.first().split(',', QString::SkipEmptyParts); + if(compressionTypes.contains("gzip", Qt::CaseInsensitive) || compressionTypes.contains("deflate", Qt::CaseInsensitive)){ + response = decompress(reply->readAll()); + } + } + } + else { + response = reply->readAll(); + } } } } +QByteArray PFXHttpRequestWorker::decompress(const QByteArray& data){ + QByteArray result; + bool sts = false; + return sts ? result : QByteArray(); +} + QSslConfiguration *PFXHttpRequestWorker::sslDefaultConfiguration; } // namespace test_namespace diff --git a/samples/client/petstore/cpp-qt5/client/PFXHttpRequest.h b/samples/client/petstore/cpp-qt5/client/PFXHttpRequest.h index 6b354142d28..c7f4c2a7f0b 100644 --- a/samples/client/petstore/cpp-qt5/client/PFXHttpRequest.h +++ b/samples/client/petstore/cpp-qt5/client/PFXHttpRequest.h @@ -71,6 +71,7 @@ public: void setWorkingDirectory(const QString &path); PFXHttpFileElement getHttpFileElement(const QString &fieldname = QString()); QByteArray *getMultiPartField(const QString &fieldname = QString()); + void setCompressionEnabled(bool enable); signals: void on_execution_finished(PFXHttpRequestWorker *worker); @@ -81,8 +82,10 @@ private: QMap multiPartFields; QString workingDirectory; int _timeOut; + bool isCompressionEnabled; void on_manager_timeout(QNetworkReply *reply); - void process_form_response(); + void process_response(QNetworkReply *reply); + QByteArray decompress(const QByteArray& data); private slots: void on_manager_finished(QNetworkReply *reply); }; diff --git a/samples/client/petstore/cpp-qt5/client/PFXPetApi.cpp b/samples/client/petstore/cpp-qt5/client/PFXPetApi.cpp index 9ac2f626458..9230379520c 100644 --- a/samples/client/petstore/cpp-qt5/client/PFXPetApi.cpp +++ b/samples/client/petstore/cpp-qt5/client/PFXPetApi.cpp @@ -22,7 +22,8 @@ PFXPetApi::PFXPetApi(const QString &scheme, const QString &host, int port, const _host(host), _port(port), _basePath(basePath), - _timeOut(timeOut) {} + _timeOut(timeOut), + _compress(false) {} PFXPetApi::~PFXPetApi() { } @@ -55,6 +56,10 @@ void PFXPetApi::addHeaders(const QString &key, const QString &value) { defaultHeaders.insert(key, value); } +void PFXPetApi::enableContentCompression() { + _compress = true; +} + void PFXPetApi::addPet(const PFXPet &body) { QString fullPath = QString("%1://%2%3%4%5") .arg(_scheme) @@ -66,6 +71,7 @@ void PFXPetApi::addPet(const PFXPet &body) { PFXHttpRequestWorker *worker = new PFXHttpRequestWorker(this); worker->setTimeOut(_timeOut); worker->setWorkingDirectory(_workingDirectory); + worker->setCompressionEnabled(_compress); PFXHttpRequestInput input(fullPath, "POST"); QString output = body.asJson(); @@ -87,6 +93,7 @@ void PFXPetApi::addPetCallback(PFXHttpRequestWorker *worker) { msg = QString("Success! %1 bytes").arg(worker->response.length()); } else { msg = "Error: " + worker->error_str; + error_str = QString("%1, %2").arg(worker->error_str).arg(QString(worker->response)); } worker->deleteLater(); @@ -113,6 +120,7 @@ void PFXPetApi::deletePet(const qint64 &pet_id, const QString &api_key) { PFXHttpRequestWorker *worker = new PFXHttpRequestWorker(this); worker->setTimeOut(_timeOut); worker->setWorkingDirectory(_workingDirectory); + worker->setCompressionEnabled(_compress); PFXHttpRequestInput input(fullPath, "DELETE"); if (api_key != nullptr) { @@ -135,6 +143,7 @@ void PFXPetApi::deletePetCallback(PFXHttpRequestWorker *worker) { msg = QString("Success! %1 bytes").arg(worker->response.length()); } else { msg = "Error: " + worker->error_str; + error_str = QString("%1, %2").arg(worker->error_str).arg(QString(worker->response)); } worker->deleteLater(); @@ -196,6 +205,7 @@ void PFXPetApi::findPetsByStatus(const QList &status) { PFXHttpRequestWorker *worker = new PFXHttpRequestWorker(this); worker->setTimeOut(_timeOut); worker->setWorkingDirectory(_workingDirectory); + worker->setCompressionEnabled(_compress); PFXHttpRequestInput input(fullPath, "GET"); foreach (QString key, this->defaultHeaders.keys()) { input.headers.insert(key, this->defaultHeaders.value(key)); } @@ -214,6 +224,7 @@ void PFXPetApi::findPetsByStatusCallback(PFXHttpRequestWorker *worker) { msg = QString("Success! %1 bytes").arg(worker->response.length()); } else { msg = "Error: " + worker->error_str; + error_str = QString("%1, %2").arg(worker->error_str).arg(QString(worker->response)); } QList output; QString json(worker->response); @@ -285,6 +296,7 @@ void PFXPetApi::findPetsByTags(const QList &tags) { PFXHttpRequestWorker *worker = new PFXHttpRequestWorker(this); worker->setTimeOut(_timeOut); worker->setWorkingDirectory(_workingDirectory); + worker->setCompressionEnabled(_compress); PFXHttpRequestInput input(fullPath, "GET"); foreach (QString key, this->defaultHeaders.keys()) { input.headers.insert(key, this->defaultHeaders.value(key)); } @@ -303,6 +315,7 @@ void PFXPetApi::findPetsByTagsCallback(PFXHttpRequestWorker *worker) { msg = QString("Success! %1 bytes").arg(worker->response.length()); } else { msg = "Error: " + worker->error_str; + error_str = QString("%1, %2").arg(worker->error_str).arg(QString(worker->response)); } QList output; QString json(worker->response); @@ -339,6 +352,7 @@ void PFXPetApi::getPetById(const qint64 &pet_id) { PFXHttpRequestWorker *worker = new PFXHttpRequestWorker(this); worker->setTimeOut(_timeOut); worker->setWorkingDirectory(_workingDirectory); + worker->setCompressionEnabled(_compress); PFXHttpRequestInput input(fullPath, "GET"); foreach (QString key, this->defaultHeaders.keys()) { input.headers.insert(key, this->defaultHeaders.value(key)); } @@ -357,6 +371,7 @@ void PFXPetApi::getPetByIdCallback(PFXHttpRequestWorker *worker) { msg = QString("Success! %1 bytes").arg(worker->response.length()); } else { msg = "Error: " + worker->error_str; + error_str = QString("%1, %2").arg(worker->error_str).arg(QString(worker->response)); } PFXPet output(QString(worker->response)); worker->deleteLater(); @@ -381,6 +396,7 @@ void PFXPetApi::updatePet(const PFXPet &body) { PFXHttpRequestWorker *worker = new PFXHttpRequestWorker(this); worker->setTimeOut(_timeOut); worker->setWorkingDirectory(_workingDirectory); + worker->setCompressionEnabled(_compress); PFXHttpRequestInput input(fullPath, "PUT"); QString output = body.asJson(); @@ -402,6 +418,7 @@ void PFXPetApi::updatePetCallback(PFXHttpRequestWorker *worker) { msg = QString("Success! %1 bytes").arg(worker->response.length()); } else { msg = "Error: " + worker->error_str; + error_str = QString("%1, %2").arg(worker->error_str).arg(QString(worker->response)); } worker->deleteLater(); @@ -428,6 +445,7 @@ void PFXPetApi::updatePetWithForm(const qint64 &pet_id, const QString &name, con PFXHttpRequestWorker *worker = new PFXHttpRequestWorker(this); worker->setTimeOut(_timeOut); worker->setWorkingDirectory(_workingDirectory); + worker->setCompressionEnabled(_compress); PFXHttpRequestInput input(fullPath, "POST"); input.add_var("name", ::test_namespace::toStringValue(name)); @@ -448,6 +466,7 @@ void PFXPetApi::updatePetWithFormCallback(PFXHttpRequestWorker *worker) { msg = QString("Success! %1 bytes").arg(worker->response.length()); } else { msg = "Error: " + worker->error_str; + error_str = QString("%1, %2").arg(worker->error_str).arg(QString(worker->response)); } worker->deleteLater(); @@ -474,6 +493,7 @@ void PFXPetApi::uploadFile(const qint64 &pet_id, const QString &additional_metad PFXHttpRequestWorker *worker = new PFXHttpRequestWorker(this); worker->setTimeOut(_timeOut); worker->setWorkingDirectory(_workingDirectory); + worker->setCompressionEnabled(_compress); PFXHttpRequestInput input(fullPath, "POST"); input.add_var("additionalMetadata", ::test_namespace::toStringValue(additional_metadata)); @@ -494,6 +514,7 @@ void PFXPetApi::uploadFileCallback(PFXHttpRequestWorker *worker) { msg = QString("Success! %1 bytes").arg(worker->response.length()); } else { msg = "Error: " + worker->error_str; + error_str = QString("%1, %2").arg(worker->error_str).arg(QString(worker->response)); } PFXApiResponse output(QString(worker->response)); worker->deleteLater(); diff --git a/samples/client/petstore/cpp-qt5/client/PFXPetApi.h b/samples/client/petstore/cpp-qt5/client/PFXPetApi.h index f55675845c1..7d2c00175c5 100644 --- a/samples/client/petstore/cpp-qt5/client/PFXPetApi.h +++ b/samples/client/petstore/cpp-qt5/client/PFXPetApi.h @@ -37,6 +37,7 @@ public: void setTimeOut(const int timeOut); void setWorkingDirectory(const QString &path); void addHeaders(const QString &key, const QString &value); + void enableContentCompression(); void addPet(const PFXPet &body); void deletePet(const qint64 &pet_id, const QString &api_key); @@ -54,6 +55,7 @@ private: int _timeOut; QString _workingDirectory; QMap defaultHeaders; + bool _compress; void addPetCallback(PFXHttpRequestWorker *worker); void deletePetCallback(PFXHttpRequestWorker *worker); diff --git a/samples/client/petstore/cpp-qt5/client/PFXStoreApi.cpp b/samples/client/petstore/cpp-qt5/client/PFXStoreApi.cpp index f16902079de..05ee1622f0b 100644 --- a/samples/client/petstore/cpp-qt5/client/PFXStoreApi.cpp +++ b/samples/client/petstore/cpp-qt5/client/PFXStoreApi.cpp @@ -22,7 +22,8 @@ PFXStoreApi::PFXStoreApi(const QString &scheme, const QString &host, int port, c _host(host), _port(port), _basePath(basePath), - _timeOut(timeOut) {} + _timeOut(timeOut), + _compress(false) {} PFXStoreApi::~PFXStoreApi() { } @@ -55,6 +56,10 @@ void PFXStoreApi::addHeaders(const QString &key, const QString &value) { defaultHeaders.insert(key, value); } +void PFXStoreApi::enableContentCompression() { + _compress = true; +} + void PFXStoreApi::deleteOrder(const QString &order_id) { QString fullPath = QString("%1://%2%3%4%5") .arg(_scheme) @@ -69,6 +74,7 @@ void PFXStoreApi::deleteOrder(const QString &order_id) { PFXHttpRequestWorker *worker = new PFXHttpRequestWorker(this); worker->setTimeOut(_timeOut); worker->setWorkingDirectory(_workingDirectory); + worker->setCompressionEnabled(_compress); PFXHttpRequestInput input(fullPath, "DELETE"); foreach (QString key, this->defaultHeaders.keys()) { input.headers.insert(key, this->defaultHeaders.value(key)); } @@ -87,6 +93,7 @@ void PFXStoreApi::deleteOrderCallback(PFXHttpRequestWorker *worker) { msg = QString("Success! %1 bytes").arg(worker->response.length()); } else { msg = "Error: " + worker->error_str; + error_str = QString("%1, %2").arg(worker->error_str).arg(QString(worker->response)); } worker->deleteLater(); @@ -110,6 +117,7 @@ void PFXStoreApi::getInventory() { PFXHttpRequestWorker *worker = new PFXHttpRequestWorker(this); worker->setTimeOut(_timeOut); worker->setWorkingDirectory(_workingDirectory); + worker->setCompressionEnabled(_compress); PFXHttpRequestInput input(fullPath, "GET"); foreach (QString key, this->defaultHeaders.keys()) { input.headers.insert(key, this->defaultHeaders.value(key)); } @@ -128,6 +136,7 @@ void PFXStoreApi::getInventoryCallback(PFXHttpRequestWorker *worker) { msg = QString("Success! %1 bytes").arg(worker->response.length()); } else { msg = "Error: " + worker->error_str; + error_str = QString("%1, %2").arg(worker->error_str).arg(QString(worker->response)); } QMap output; QString json(worker->response); @@ -164,6 +173,7 @@ void PFXStoreApi::getOrderById(const qint64 &order_id) { PFXHttpRequestWorker *worker = new PFXHttpRequestWorker(this); worker->setTimeOut(_timeOut); worker->setWorkingDirectory(_workingDirectory); + worker->setCompressionEnabled(_compress); PFXHttpRequestInput input(fullPath, "GET"); foreach (QString key, this->defaultHeaders.keys()) { input.headers.insert(key, this->defaultHeaders.value(key)); } @@ -182,6 +192,7 @@ void PFXStoreApi::getOrderByIdCallback(PFXHttpRequestWorker *worker) { msg = QString("Success! %1 bytes").arg(worker->response.length()); } else { msg = "Error: " + worker->error_str; + error_str = QString("%1, %2").arg(worker->error_str).arg(QString(worker->response)); } PFXOrder output(QString(worker->response)); worker->deleteLater(); @@ -206,6 +217,7 @@ void PFXStoreApi::placeOrder(const PFXOrder &body) { PFXHttpRequestWorker *worker = new PFXHttpRequestWorker(this); worker->setTimeOut(_timeOut); worker->setWorkingDirectory(_workingDirectory); + worker->setCompressionEnabled(_compress); PFXHttpRequestInput input(fullPath, "POST"); QString output = body.asJson(); @@ -227,6 +239,7 @@ void PFXStoreApi::placeOrderCallback(PFXHttpRequestWorker *worker) { msg = QString("Success! %1 bytes").arg(worker->response.length()); } else { msg = "Error: " + worker->error_str; + error_str = QString("%1, %2").arg(worker->error_str).arg(QString(worker->response)); } PFXOrder output(QString(worker->response)); worker->deleteLater(); diff --git a/samples/client/petstore/cpp-qt5/client/PFXStoreApi.h b/samples/client/petstore/cpp-qt5/client/PFXStoreApi.h index d0dec36dad0..b61fc684b28 100644 --- a/samples/client/petstore/cpp-qt5/client/PFXStoreApi.h +++ b/samples/client/petstore/cpp-qt5/client/PFXStoreApi.h @@ -36,6 +36,7 @@ public: void setTimeOut(const int timeOut); void setWorkingDirectory(const QString &path); void addHeaders(const QString &key, const QString &value); + void enableContentCompression(); void deleteOrder(const QString &order_id); void getInventory(); @@ -49,6 +50,7 @@ private: int _timeOut; QString _workingDirectory; QMap defaultHeaders; + bool _compress; void deleteOrderCallback(PFXHttpRequestWorker *worker); void getInventoryCallback(PFXHttpRequestWorker *worker); diff --git a/samples/client/petstore/cpp-qt5/client/PFXUserApi.cpp b/samples/client/petstore/cpp-qt5/client/PFXUserApi.cpp index b2d2b6aa2fe..44d8c2dee1f 100644 --- a/samples/client/petstore/cpp-qt5/client/PFXUserApi.cpp +++ b/samples/client/petstore/cpp-qt5/client/PFXUserApi.cpp @@ -22,7 +22,8 @@ PFXUserApi::PFXUserApi(const QString &scheme, const QString &host, int port, con _host(host), _port(port), _basePath(basePath), - _timeOut(timeOut) {} + _timeOut(timeOut), + _compress(false) {} PFXUserApi::~PFXUserApi() { } @@ -55,6 +56,10 @@ void PFXUserApi::addHeaders(const QString &key, const QString &value) { defaultHeaders.insert(key, value); } +void PFXUserApi::enableContentCompression() { + _compress = true; +} + void PFXUserApi::createUser(const PFXUser &body) { QString fullPath = QString("%1://%2%3%4%5") .arg(_scheme) @@ -66,6 +71,7 @@ void PFXUserApi::createUser(const PFXUser &body) { PFXHttpRequestWorker *worker = new PFXHttpRequestWorker(this); worker->setTimeOut(_timeOut); worker->setWorkingDirectory(_workingDirectory); + worker->setCompressionEnabled(_compress); PFXHttpRequestInput input(fullPath, "POST"); QString output = body.asJson(); @@ -87,6 +93,7 @@ void PFXUserApi::createUserCallback(PFXHttpRequestWorker *worker) { msg = QString("Success! %1 bytes").arg(worker->response.length()); } else { msg = "Error: " + worker->error_str; + error_str = QString("%1, %2").arg(worker->error_str).arg(QString(worker->response)); } worker->deleteLater(); @@ -110,6 +117,7 @@ void PFXUserApi::createUsersWithArrayInput(const QList &body) { PFXHttpRequestWorker *worker = new PFXHttpRequestWorker(this); worker->setTimeOut(_timeOut); worker->setWorkingDirectory(_workingDirectory); + worker->setCompressionEnabled(_compress); PFXHttpRequestInput input(fullPath, "POST"); QJsonDocument doc(::test_namespace::toJsonValue(body).toArray()); @@ -132,6 +140,7 @@ void PFXUserApi::createUsersWithArrayInputCallback(PFXHttpRequestWorker *worker) msg = QString("Success! %1 bytes").arg(worker->response.length()); } else { msg = "Error: " + worker->error_str; + error_str = QString("%1, %2").arg(worker->error_str).arg(QString(worker->response)); } worker->deleteLater(); @@ -155,6 +164,7 @@ void PFXUserApi::createUsersWithListInput(const QList &body) { PFXHttpRequestWorker *worker = new PFXHttpRequestWorker(this); worker->setTimeOut(_timeOut); worker->setWorkingDirectory(_workingDirectory); + worker->setCompressionEnabled(_compress); PFXHttpRequestInput input(fullPath, "POST"); QJsonDocument doc(::test_namespace::toJsonValue(body).toArray()); @@ -177,6 +187,7 @@ void PFXUserApi::createUsersWithListInputCallback(PFXHttpRequestWorker *worker) msg = QString("Success! %1 bytes").arg(worker->response.length()); } else { msg = "Error: " + worker->error_str; + error_str = QString("%1, %2").arg(worker->error_str).arg(QString(worker->response)); } worker->deleteLater(); @@ -203,6 +214,7 @@ void PFXUserApi::deleteUser(const QString &username) { PFXHttpRequestWorker *worker = new PFXHttpRequestWorker(this); worker->setTimeOut(_timeOut); worker->setWorkingDirectory(_workingDirectory); + worker->setCompressionEnabled(_compress); PFXHttpRequestInput input(fullPath, "DELETE"); foreach (QString key, this->defaultHeaders.keys()) { input.headers.insert(key, this->defaultHeaders.value(key)); } @@ -221,6 +233,7 @@ void PFXUserApi::deleteUserCallback(PFXHttpRequestWorker *worker) { msg = QString("Success! %1 bytes").arg(worker->response.length()); } else { msg = "Error: " + worker->error_str; + error_str = QString("%1, %2").arg(worker->error_str).arg(QString(worker->response)); } worker->deleteLater(); @@ -247,6 +260,7 @@ void PFXUserApi::getUserByName(const QString &username) { PFXHttpRequestWorker *worker = new PFXHttpRequestWorker(this); worker->setTimeOut(_timeOut); worker->setWorkingDirectory(_workingDirectory); + worker->setCompressionEnabled(_compress); PFXHttpRequestInput input(fullPath, "GET"); foreach (QString key, this->defaultHeaders.keys()) { input.headers.insert(key, this->defaultHeaders.value(key)); } @@ -265,6 +279,7 @@ void PFXUserApi::getUserByNameCallback(PFXHttpRequestWorker *worker) { msg = QString("Success! %1 bytes").arg(worker->response.length()); } else { msg = "Error: " + worker->error_str; + error_str = QString("%1, %2").arg(worker->error_str).arg(QString(worker->response)); } PFXUser output(QString(worker->response)); worker->deleteLater(); @@ -301,6 +316,7 @@ void PFXUserApi::loginUser(const QString &username, const QString &password) { PFXHttpRequestWorker *worker = new PFXHttpRequestWorker(this); worker->setTimeOut(_timeOut); worker->setWorkingDirectory(_workingDirectory); + worker->setCompressionEnabled(_compress); PFXHttpRequestInput input(fullPath, "GET"); foreach (QString key, this->defaultHeaders.keys()) { input.headers.insert(key, this->defaultHeaders.value(key)); } @@ -319,6 +335,7 @@ void PFXUserApi::loginUserCallback(PFXHttpRequestWorker *worker) { msg = QString("Success! %1 bytes").arg(worker->response.length()); } else { msg = "Error: " + worker->error_str; + error_str = QString("%1, %2").arg(worker->error_str).arg(QString(worker->response)); } QString output; ::test_namespace::fromStringValue(QString(worker->response), output); @@ -344,6 +361,7 @@ void PFXUserApi::logoutUser() { PFXHttpRequestWorker *worker = new PFXHttpRequestWorker(this); worker->setTimeOut(_timeOut); worker->setWorkingDirectory(_workingDirectory); + worker->setCompressionEnabled(_compress); PFXHttpRequestInput input(fullPath, "GET"); foreach (QString key, this->defaultHeaders.keys()) { input.headers.insert(key, this->defaultHeaders.value(key)); } @@ -362,6 +380,7 @@ void PFXUserApi::logoutUserCallback(PFXHttpRequestWorker *worker) { msg = QString("Success! %1 bytes").arg(worker->response.length()); } else { msg = "Error: " + worker->error_str; + error_str = QString("%1, %2").arg(worker->error_str).arg(QString(worker->response)); } worker->deleteLater(); @@ -388,6 +407,7 @@ void PFXUserApi::updateUser(const QString &username, const PFXUser &body) { PFXHttpRequestWorker *worker = new PFXHttpRequestWorker(this); worker->setTimeOut(_timeOut); worker->setWorkingDirectory(_workingDirectory); + worker->setCompressionEnabled(_compress); PFXHttpRequestInput input(fullPath, "PUT"); QString output = body.asJson(); @@ -409,6 +429,7 @@ void PFXUserApi::updateUserCallback(PFXHttpRequestWorker *worker) { msg = QString("Success! %1 bytes").arg(worker->response.length()); } else { msg = "Error: " + worker->error_str; + error_str = QString("%1, %2").arg(worker->error_str).arg(QString(worker->response)); } worker->deleteLater(); diff --git a/samples/client/petstore/cpp-qt5/client/PFXUserApi.h b/samples/client/petstore/cpp-qt5/client/PFXUserApi.h index 417c5a8d879..4ca836a7895 100644 --- a/samples/client/petstore/cpp-qt5/client/PFXUserApi.h +++ b/samples/client/petstore/cpp-qt5/client/PFXUserApi.h @@ -36,6 +36,7 @@ public: void setTimeOut(const int timeOut); void setWorkingDirectory(const QString &path); void addHeaders(const QString &key, const QString &value); + void enableContentCompression(); void createUser(const PFXUser &body); void createUsersWithArrayInput(const QList &body); @@ -53,6 +54,7 @@ private: int _timeOut; QString _workingDirectory; QMap defaultHeaders; + bool _compress; void createUserCallback(PFXHttpRequestWorker *worker); void createUsersWithArrayInputCallback(PFXHttpRequestWorker *worker); diff --git a/samples/client/petstore/cpp-qt5/client/PFXclient.pri b/samples/client/petstore/cpp-qt5/client/PFXclient.pri index e86f90006a1..c09a32bdf4f 100644 --- a/samples/client/petstore/cpp-qt5/client/PFXclient.pri +++ b/samples/client/petstore/cpp-qt5/client/PFXclient.pri @@ -34,5 +34,5 @@ SOURCES += \ # Others $${PWD}/PFXHelpers.cpp \ $${PWD}/PFXHttpRequest.cpp \ - $${PWD}/PFXHttpFileElement.cpp + $${PWD}/PFXHttpFileElement.cpp