[qt5 server] various improvements (#725)

* Improve handling of all primitive types

* Fix missing includes in case of simple APIs

* Fix minor error in template function

* Remove tabs

* Refactor code for simplicity

* Remove tabs

* rework the router for handling multiple path param

* rework router to handle multiple path parameters

* rework router to handle multiple path parameters

* rework router

* Add support for Multi path param

* Add comments to code block and remove duplicate parameters

* Remove tabs :(

* Add missing imports after resolving conflict
This commit is contained in:
sunn 2018-08-24 08:47:01 +02:00 committed by GitHub
parent 219a88e9c6
commit f802f8b7d7
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
34 changed files with 667 additions and 518 deletions

View File

@ -23,15 +23,19 @@ import io.swagger.v3.parser.util.SchemaTypeUtil;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.openapitools.codegen.CodegenConfig; import org.openapitools.codegen.CodegenConfig;
import org.openapitools.codegen.CodegenType; import org.openapitools.codegen.CodegenType;
import org.openapitools.codegen.CodegenOperation;
import org.openapitools.codegen.CodegenParameter;
import org.openapitools.codegen.SupportingFile; import org.openapitools.codegen.SupportingFile;
import org.openapitools.codegen.utils.ModelUtils; import org.openapitools.codegen.utils.ModelUtils;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import java.io.File; import java.io.File;
import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.HashMap; import java.util.HashMap;
import java.util.HashSet; import java.util.HashSet;
import java.util.List;
import java.util.Locale; import java.util.Locale;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
@ -55,7 +59,7 @@ public class CppQt5QHttpEngineServerCodegen extends AbstractCppCodegen implement
protected Map<String, String> namespaces = new HashMap<String, String>(); protected Map<String, String> namespaces = new HashMap<String, String>();
protected Set<String> systemIncludes = new HashSet<String>(); protected Set<String> systemIncludes = new HashSet<String>();
protected String cppNamespace = "OpenAPI"; protected String cppNamespace = "OpenAPI";
protected Set<String> nonFrameworkPrimitives = new HashSet<String>();
public CppQt5QHttpEngineServerCodegen() { public CppQt5QHttpEngineServerCodegen() {
super(); super();
@ -135,7 +139,17 @@ public class CppQt5QHttpEngineServerCodegen extends AbstractCppCodegen implement
"float", "float",
"double") "double")
); );
nonFrameworkPrimitives.addAll(languageSpecificPrimitives);
foundationClasses.addAll(
Arrays.asList(
"QString",
"QDate",
"QDateTime",
"QByteArray")
);
languageSpecificPrimitives.addAll(foundationClasses);
supportingFiles.add(new SupportingFile("helpers-header.mustache", sourceFolder + MODEL_DIR, PREFIX + "Helpers.h")); supportingFiles.add(new SupportingFile("helpers-header.mustache", sourceFolder + MODEL_DIR, PREFIX + "Helpers.h"));
supportingFiles.add(new SupportingFile("helpers-body.mustache", sourceFolder + MODEL_DIR, PREFIX + "Helpers.cpp")); supportingFiles.add(new SupportingFile("helpers-body.mustache", sourceFolder + MODEL_DIR, PREFIX + "Helpers.cpp"));
supportingFiles.add(new SupportingFile("object.mustache", sourceFolder + MODEL_DIR, PREFIX + "Object.h")); supportingFiles.add(new SupportingFile("object.mustache", sourceFolder + MODEL_DIR, PREFIX + "Object.h"));
@ -174,7 +188,7 @@ public class CppQt5QHttpEngineServerCodegen extends AbstractCppCodegen implement
importMapping = new HashMap<String, String>(); importMapping = new HashMap<String, String>();
namespaces = new HashMap<String, String>(); namespaces = new HashMap<String, String>();
foundationClasses.add("QString");
systemIncludes.add("QString"); systemIncludes.add("QString");
systemIncludes.add("QList"); systemIncludes.add("QList");
@ -434,4 +448,71 @@ public class CppQt5QHttpEngineServerCodegen extends AbstractCppCodegen implement
public String getTypeDeclaration(String str) { public String getTypeDeclaration(String str) {
return str; return str;
} }
@Override
protected boolean needToImport(String type) {
return StringUtils.isNotBlank(type) && !defaultIncludes.contains(type)
&& !nonFrameworkPrimitives.contains(type);
}
@Override
@SuppressWarnings("unchecked")
public Map<String, Object> postProcessOperations(Map<String, Object> objs) {
Map<String, Object> objectMap = (Map<String, Object>) objs.get("operations");
List<CodegenOperation> operations = (List<CodegenOperation>) objectMap.get("operation");
List<Map<String, String>> imports = (List<Map<String, String>>) objs.get("imports");
for (CodegenOperation operation : operations) {
// Check all return parameter baseType if there is a necessity to include, include it if not
// already done
if (operation.returnBaseType != null && needToImport(operation.returnBaseType)) {
if(!isIncluded(operation.returnBaseType, imports)) {
imports.add(createMapping("import", operation.returnBaseType));
}
}
List<CodegenParameter> params = new ArrayList<CodegenParameter>();
if (operation.allParams != null)params.addAll(operation.allParams);
// Check all parameter baseType if there is a necessity to include, include it if not
// already done
for(CodegenParameter param : params) {
if(param.isPrimitiveType && needToImport(param.baseType)) {
if(!isIncluded(param.baseType, imports)) {
imports.add(createMapping("import", param.baseType));
}
}
}
if (operation.pathParams != null) {
// We use QString to pass path params, add it to include
if(!isIncluded("QString", imports)) {
imports.add(createMapping("import", "QString"));
}
}
}
if(isIncluded("QMap", imports)) {
// Maps uses QString as key
if(!isIncluded("QString", imports)) {
imports.add(createMapping("import", "QString"));
}
}
return objs;
}
public Map<String, String> createMapping(String key, String value) {
Map<String, String> customImport = new HashMap<String, String>();
customImport.put(key, toModelImport(value));
return customImport;
}
private boolean isIncluded(String type, List<Map<String, String>> imports) {
boolean included = false;
String inclStr = toModelImport(type);
for (Map<String, String> importItem : imports) {
if(importItem.containsValue(inclStr)) {
included = true;
break;
}
}
return included;
}
} }

View File

@ -1,11 +1,11 @@
FROM alpine:latest AS build FROM alpine:latest AS build
RUN apk add --update \ RUN apk add --update \
cmake \ cmake \
alpine-sdk \ alpine-sdk \
openssl \ openssl \
qt5-qtbase-dev \ qt5-qtbase-dev \
qt5-qttools-dev qt5-qttools-dev
WORKDIR /usr/server WORKDIR /usr/server
ADD ./src ./src ADD ./src ./src
@ -13,10 +13,10 @@ ADD ./CMakeLists.txt ./
RUN mkdir -p ./build RUN mkdir -p ./build
WORKDIR /usr/server/build WORKDIR /usr/server/build
RUN cmake -DNODEBUG:STRING="ON" .. RUN cmake -DNODEBUG:STRING="ON" ..
RUN make RUN make
FROM alpine:latest AS runtime FROM alpine:latest AS runtime
RUN apk add --update \ RUN apk add --update \
libgcc \ libgcc \
libstdc++ \ libstdc++ \
qt5-qtbase \ qt5-qtbase \

View File

@ -1,4 +1,4 @@
QHttpEngine QHttpEngine
The MIT License (MIT) The MIT License (MIT)

View File

@ -1,8 +1,9 @@
# C++ Qt5 Server
## Qt5 HTTP Server based on the Qhttpengine ## Qt5 HTTP Server based on the Qhttpengine
This server was generated by the [openapi-generator]
(https://openapi-generator.tech) project. This server was generated by the [openapi-generator](https://openapi-generator.tech) project.
By using the [OpenAPI-Spec](https://github.com/OAI/OpenAPI-Specification) from a remote server, you can easily generate a server stub. By using the [OpenAPI-Spec](https://github.com/OAI/OpenAPI-Specification) from a remote server, you can easily generate a server stub.
-
To see how to make this your own, look here: To see how to make this your own, look here:
@ -25,30 +26,36 @@ Simple set of classes for developing HTTP server applications in Qt.
To learn more about building and using the library, please visit this page: To learn more about building and using the library, please visit this page:
https://ci.quickmediasolutions.com/job/qhttpengine-documentation/doxygen/ [Link](https://ci.quickmediasolutions.com/job/qhttpengine-documentation/doxygen)
### Viewing the code ### Viewing the code
You can view the code using an editor like Microsoft Visual Studio Code or you can
You can view the code using an editor like Microsoft Visual Studio Code or you can
Use QtCreator and browse for the root CMakeLists.txt and load it as a project Use QtCreator and browse for the root CMakeLists.txt and load it as a project
### Build with make ### Build with make
Install the tools [Linux/Debian] Install the tools [Linux/Debian]
```
```shell
sudo apt install cmake build-essential libssl-dev qtbase5-dev qtbase5-dev-tools git curl sudo apt install cmake build-essential libssl-dev qtbase5-dev qtbase5-dev-tools git curl
``` ```
To build, go to the `server` folder To build, go to the `server` folder
```
make ```shell
make
``` ```
To run the server To run the server
```
```shell
./build/src/cpp-qt5-server & ./build/src/cpp-qt5-server &
``` ```
#### Invoke an API #### Invoke an API
```
```shell
curl -X GET http://localhost:8080/v2/store/inventory curl -X GET http://localhost:8080/v2/store/inventory
curl -X POST http://localhost:8080/v2/store/order -H "Content-Type: application/json" -d "{ \"id\": 22, \"petId\": 1541, \"quantity\": 5, \"shipDate\": \"2018-06-16T18:31:43.870Z\", \"status\": \"placed\", \"complete\": \"true\" }" curl -X POST http://localhost:8080/v2/store/order -H "Content-Type: application/json" -d "{ \"id\": 22, \"petId\": 1541, \"quantity\": 5, \"shipDate\": \"2018-06-16T18:31:43.870Z\", \"status\": \"placed\", \"complete\": \"true\" }"
curl -X GET http://localhost:8080/v2/pet/findByStatus curl -X GET http://localhost:8080/v2/pet/findByStatus
@ -56,38 +63,50 @@ curl -X GET http://localhost:8080/v2/store/inventory
``` ```
### Run and build with docker ### Run and build with docker
Building with docker multistage Building with docker multistage
If you dont have docker install [here](https://docs.docker.com/install) If you dont have docker install [here](https://docs.docker.com/install)
Add yourself to the docker group Add yourself to the docker group
``` ```shell
docker build --network=host -t cpp-qt5-server . docker build --network=host -t cpp-qt5-server .
``` ```
Running with docker
``` Running with docker
docker run --rm -it --name=server-container cpp-qt5-server
```shell
docker run --rm -it --name=server-container cpp-qt5-server
``` ```
#### Invoking an API #### Invoking an API
Mind the IP here Mind the IP here
```
```shell
curl -X GET http://172.17.0.2:8080/v2/store/inventory curl -X GET http://172.17.0.2:8080/v2/store/inventory
curl -X POST http://172.17.0.2:8080/v2/store/order -H "Content-Type: application/json" -d "{ \"id\": 22, \"petId\": 1541, \"quantity\": 5, \"shipDate\": \"2018-06-16T18:31:43.870Z\", \"status\": \"placed\", \"complete\": \"true\" }" curl -X POST http://172.17.0.2:8080/v2/store/order -H "Content-Type: application/json" -d "{ \"id\": 22, \"petId\": 1541, \"quantity\": 5, \"shipDate\": \"2018-06-16T18:31:43.870Z\", \"status\": \"placed\", \"complete\": \"true\" }"
``` ```
use this command to get the container IP use this command to get the container IP
```
```shell
docker inspect server-container | grep "IPAddress" docker inspect server-container | grep "IPAddress"
``` ```
To exit from the command line
``` To exit from the command line
```shell
Ctrl + p + q Ctrl + p + q
``` ```
To stop container To stop container
```
```shell
docker stop <containername> docker stop <containername>
``` ```
or to terminate and quit or to terminate and quit
```
```shell
Ctrl+C Ctrl+C
``` ```

View File

@ -16,7 +16,7 @@ namespace {{this}} {
auto headers = s->headers(); auto headers = s->headers();
for(auto itr = headers.begin(); itr != headers.end(); itr++) { for(auto itr = headers.begin(); itr != headers.end(); itr++) {
requestHeaders.insert(QString(itr.key()), QString(itr.value())); requestHeaders.insert(QString(itr.key()), QString(itr.value()));
} }
} }
{{classname}}Request::~{{classname}}Request(){ {{classname}}Request::~{{classname}}Request(){
@ -24,7 +24,7 @@ namespace {{this}} {
qDebug() << "{{classname}}Request::~{{classname}}Request()"; qDebug() << "{{classname}}Request::~{{classname}}Request()";
} }
QMap<QString, QString> QMap<QString, QString>
{{classname}}Request::getRequestHeaders() const { {{classname}}Request::getRequestHeaders() const {
return requestHeaders; return requestHeaders;
} }
@ -44,9 +44,9 @@ QHttpEngine::Socket* {{classname}}Request::getRawSocket(){
void {{classname}}Request::{{nickname}}Request({{#hasPathParams}}{{#pathParams}}const QString& {{{paramName}}}str{{#hasMore}}, {{/hasMore}}{{/pathParams}}{{/hasPathParams}}){ void {{classname}}Request::{{nickname}}Request({{#hasPathParams}}{{#pathParams}}const QString& {{{paramName}}}str{{#hasMore}}, {{/hasMore}}{{/pathParams}}{{/hasPathParams}}){
qDebug() << "{{{basePathWithoutHost}}}{{{path}}}"; qDebug() << "{{{basePathWithoutHost}}}{{{path}}}";
connect(this, &{{classname}}Request::{{nickname}}, handler, &{{classname}}Handler::{{nickname}}); connect(this, &{{classname}}Request::{{nickname}}, handler, &{{classname}}Handler::{{nickname}});
{{#queryParams}}{{queryParam}} {{#queryParams}}{{queryParam}}
{{{dataType}}} {{paramName}}; {{{dataType}}} {{paramName}};
if(socket->queryString().keys().contains("{{paramName}}")){ if(socket->queryString().keys().contains("{{paramName}}")){
fromStringValue(socket->queryString().value{{#isListContainer}}s{{/isListContainer}}("{{paramName}}"), {{paramName}}); fromStringValue(socket->queryString().value{{#isListContainer}}s{{/isListContainer}}("{{paramName}}"), {{paramName}});
} }
@ -63,7 +63,7 @@ void {{classname}}Request::{{nickname}}Request({{#hasPathParams}}{{#pathParams}}
{{{dataType}}} {{paramName}};{{/formParams}}{{#bodyParams}} {{#bodyParam}} {{{dataType}}} {{paramName}};{{/formParams}}{{#bodyParams}} {{#bodyParam}}
{{#isListContainer}} {{#isListContainer}}
QJsonDocument doc; QJsonDocument doc;
{{{dataType}}} {{paramName}}; {{{dataType}}} {{paramName}};
if(socket->readJson(doc)){ if(socket->readJson(doc)){
QJsonArray jsonArray = doc.array(); QJsonArray jsonArray = doc.array();
foreach(QJsonValue obj, jsonArray) { foreach(QJsonValue obj, jsonArray) {
@ -84,7 +84,7 @@ void {{classname}}Request::{{nickname}}Request({{#hasPathParams}}{{#pathParams}}
QJsonDocument doc; QJsonDocument doc;
socket->readJson(doc); socket->readJson(doc);
QJsonObject obj = doc.object(); QJsonObject obj = doc.object();
{{{dataType}}} {{paramName}}; {{{dataType}}} {{paramName}};
foreach(QString key, obj.keys()) { foreach(QString key, obj.keys()) {
{{baseType}} val; {{baseType}} val;
::{{cppNamespace}}::fromJsonValue(val, obj[key]); ::{{cppNamespace}}::fromJsonValue(val, obj[key]);
@ -100,19 +100,21 @@ void {{classname}}Request::{{nickname}}Request({{#hasPathParams}}{{#pathParams}}
::{{cppNamespace}}::fromJsonValue({{paramName}}, obj); ::{{cppNamespace}}::fromJsonValue({{paramName}}, obj);
{{/isPrimitiveType}} {{/isPrimitiveType}}
{{/isMapContainer}} {{/isMapContainer}}
{{/isListContainer}} {{/isListContainer}}
{{/bodyParam}}{{/bodyParams}} {{/bodyParam}}{{/bodyParams}}
emit {{nickname}}({{#allParams}}{{#isBodyParam}}{{/isBodyParam}} {{paramName}}{{#hasMore}}, {{/hasMore}}{{/allParams}}); emit {{nickname}}({{#allParams}}{{#isBodyParam}}{{/isBodyParam}}{{paramName}}{{#hasMore}}, {{/hasMore}}{{/allParams}});
} }
{{/operation}}{{/operations}} {{/operation}}{{/operations}}
{{#operations}}{{#operation}}void {{classname}}Request::{{nickname}}Response({{#returnType}}const {{{returnType}}}& res{{/returnType}}){ {{#operations}}{{#operation}}void {{classname}}Request::{{nickname}}Response({{#returnType}}const {{{returnType}}}& res{{/returnType}}){
writeResponseHeaders();{{#returnType}}{{^isPrimitiveType}} writeResponseHeaders();{{#returnType}}{{#isMapContainer}}
QJsonDocument resDoc(::{{cppNamespace}}::toJsonValue(res).to{{^isListContainer}}Object{{/isListContainer}}{{#isListContainer}}Array{{/isListContainer}}());{{/isPrimitiveType}} QJsonDocument resDoc(::{{cppNamespace}}::toJsonValue(res).toObject());
socket->writeJson(resDoc);{{#isPrimitiveType}} socket->writeJson(resDoc);{{/isMapContainer}}{{^isMapContainer}}{{^returnTypeIsPrimitive}}
socket->write({{#isListContainer}}QString("["+{{/isListContainer}}::{{cppNamespace}}::toStringValue(res){{#isListContainer}}+"]"){{/isListContainer}}.toUtf8());{{/isPrimitiveType}}{{/returnType}}{{^returnType}} QJsonDocument resDoc(::{{cppNamespace}}::toJsonValue(res).to{{^isListContainer}}Object{{/isListContainer}}{{#isListContainer}}Array{{/isListContainer}}());
socket->writeJson(resDoc);{{/returnTypeIsPrimitive}}{{#returnTypeIsPrimitive}}
socket->write({{#isListContainer}}QString("["+{{/isListContainer}}::{{cppNamespace}}::toStringValue(res){{#isListContainer}}+"]"){{/isListContainer}}.toUtf8());{{/returnTypeIsPrimitive}}{{/isMapContainer}}{{/returnType}}{{^returnType}}
socket->setStatusCode(QHttpEngine::Socket::OK);{{/returnType}} socket->setStatusCode(QHttpEngine::Socket::OK);{{/returnType}}
if(socket->isOpen()){ if(socket->isOpen()){
socket->close(); socket->close();
@ -123,10 +125,12 @@ void {{classname}}Request::{{nickname}}Request({{#hasPathParams}}{{#pathParams}}
{{#operations}}{{#operation}}void {{classname}}Request::{{nickname}}Error({{#returnType}}const {{{returnType}}}& res, {{/returnType}}QNetworkReply::NetworkError error_type, QString& error_str){ {{#operations}}{{#operation}}void {{classname}}Request::{{nickname}}Error({{#returnType}}const {{{returnType}}}& res, {{/returnType}}QNetworkReply::NetworkError error_type, QString& error_str){
Q_UNUSED(error_type); // TODO: Remap error_type to QHttpEngine::Socket errors Q_UNUSED(error_type); // TODO: Remap error_type to QHttpEngine::Socket errors
writeResponseHeaders();{{#returnType}} writeResponseHeaders();{{#returnType}}
Q_UNUSED(error_str); // response will be used instead of error string{{^isPrimitiveType}} Q_UNUSED(error_str); // response will be used instead of error string{{#isMapContainer}}
QJsonDocument resDoc(::{{cppNamespace}}::toJsonValue(res).to{{^isListContainer}}Object{{/isListContainer}}{{#isListContainer}}Array{{/isListContainer}}());{{/isPrimitiveType}} QJsonDocument resDoc(::{{cppNamespace}}::toJsonValue(res).toObject());
socket->writeJson(resDoc);{{#isPrimitiveType}} socket->writeJson(resDoc);{{/isMapContainer}}{{^isMapContainer}}{{^returnTypeIsPrimitive}}
socket->write({{#isListContainer}}QString("["+{{/isListContainer}}::{{cppNamespace}}::toStringValue(res){{#isListContainer}}+"]"){{/isListContainer}}.toUtf8());{{/isPrimitiveType}}{{/returnType}}{{^returnType}} QJsonDocument resDoc(::{{cppNamespace}}::toJsonValue(res).to{{^isListContainer}}Object{{/isListContainer}}{{#isListContainer}}Array{{/isListContainer}}());
socket->writeJson(resDoc);{{/returnTypeIsPrimitive}}{{#returnTypeIsPrimitive}}
socket->write({{#isListContainer}}QString("["+{{/isListContainer}}::{{cppNamespace}}::toStringValue(res){{#isListContainer}}+"]"){{/isListContainer}}.toUtf8());{{/returnTypeIsPrimitive}}{{/isMapContainer}}{{/returnType}}{{^returnType}}
socket->setStatusCode(QHttpEngine::Socket::NotFound); socket->setStatusCode(QHttpEngine::Socket::NotFound);
socket->write(error_str.toUtf8());{{/returnType}} socket->write(error_str.toUtf8());{{/returnType}}
if(socket->isOpen()){ if(socket->isOpen()){
@ -139,7 +143,7 @@ void {{classname}}Request::sendCustomResponse(QByteArray & res, QNetworkReply::N
Q_UNUSED(res); // TODO Q_UNUSED(res); // TODO
Q_UNUSED(error_type); // TODO Q_UNUSED(error_type); // TODO
} }
void {{classname}}Request::sendCustomResponse(QIODevice *res, QNetworkReply::NetworkError error_type){ void {{classname}}Request::sendCustomResponse(QIODevice *res, QNetworkReply::NetworkError error_type){
Q_UNUSED(res); // TODO Q_UNUSED(res); // TODO
Q_UNUSED(error_type); // TODO Q_UNUSED(error_type); // TODO

View File

@ -20,7 +20,7 @@ namespace {{this}} {
class {{classname}}Request : public QObject class {{classname}}Request : public QObject
{ {
Q_OBJECT Q_OBJECT
public: public:
{{classname}}Request(QHttpEngine::Socket *s, {{classname}}Handler* handler); {{classname}}Request(QHttpEngine::Socket *s, {{classname}}Handler* handler);
virtual ~{{classname}}Request(); virtual ~{{classname}}Request();
@ -60,7 +60,7 @@ private:
resHeaders.insert(itr.key().toUtf8(), itr.value().toUtf8()); resHeaders.insert(itr.key().toUtf8(), itr.value().toUtf8());
} }
socket->setHeaders(resHeaders); socket->setHeaders(resHeaders);
socket->writeHeaders(); socket->writeHeaders();
} }
}; };

View File

@ -13,80 +13,73 @@
namespace {{this}} { namespace {{this}} {
{{/cppNamespaceDeclarations}} {{/cppNamespaceDeclarations}}
inline QHttpEngine::Socket::Method toQHttpEngineMethod(QString method){ {{prefix}}ApiRouter::{{prefix}}ApiRouter() {
createApiHandlers();
if( method == QString("OPTIONS"))
return QHttpEngine::Socket::Method::OPTIONS;
if( method == QString("GET"))
return QHttpEngine::Socket::Method::GET;
if( method == QString("HEAD"))
return QHttpEngine::Socket::Method::HEAD;
if( method == QString("POST"))
return QHttpEngine::Socket::Method::POST;
if( method == QString("PUT"))
return QHttpEngine::Socket::Method::PUT;
if( method == QString("DELETE"))
return QHttpEngine::Socket::Method::DELETE;
if( method == QString("TRACE"))
return QHttpEngine::Socket::Method::TRACE;
if( method == QString("CONNECT"))
return QHttpEngine::Socket::Method::CONNECT;
return static_cast<QHttpEngine::Socket::Method>(-1);
} }
ApiRouter::ApiRouter() { {{prefix}}ApiRouter::~{{prefix}}ApiRouter(){
{{#apiInfo}}{{#apis}}{{classname}}ApiHandler = new {{classname}}Handler(); qDebug() << "~ApiRouter()";{{#apiInfo}}{{#apis}}
{{/apis}}{{/apiInfo}} delete {{classname}}ApiHandler;{{/apis}}{{/apiInfo}}
} }
ApiRouter::~ApiRouter(){ void {{prefix}}ApiRouter::createApiHandlers() { {{#apiInfo}}{{#apis}}
qDebug() << "~ApiRouter()"; {{classname}}ApiHandler = new {{classname}}Handler();{{/apis}}{{/apiInfo}}
{{#apiInfo}}{{#apis}}delete {{classname}}ApiHandler;
{{/apis}}{{/apiInfo}}
} }
void ApiRouter::setUpRoutes() { void {{prefix}}ApiRouter::setUpRoutes() {
{{#apiInfo}}{{#apis}}{{#operations}}{{#operation}}{{^pathParams}} {{#apiInfo}}{{#apis}}{{#operations}}{{#operation}}{{^hasPathParams}}
Routes.insert("{{{basePathWithoutHost}}}{{{path}}}",[this](QHttpEngine::Socket *socket) { Routes.insert(QString("%1 %2").arg("{{httpMethod}}").arg("{{{basePathWithoutHost}}}{{{path}}}").toLower(), [this](QHttpEngine::Socket *socket) {
if(toQHttpEngineMethod("{{httpMethod}}") == socket->method()){
auto reqObj = new {{classname}}Request(socket, {{classname}}ApiHandler); auto reqObj = new {{classname}}Request(socket, {{classname}}ApiHandler);
reqObj->{{nickname}}Request(); reqObj->{{nickname}}Request();
} });{{/hasPathParams}}{{/operation}}{{/operations}}{{/apis}}{{/apiInfo}}
});{{/pathParams}}{{/operation}}{{/operations}}{{/apis}}{{/apiInfo}}
} }
void ApiRouter::processRequest(QHttpEngine::Socket *socket){ void {{prefix}}ApiRouter::processRequest(QHttpEngine::Socket *socket){
if (Routes.contains(socket->path())) { if( handleRequest(socket) ){
for(auto endpoints : Routes.values(socket->path())) { return;
endpoints.operator()(socket); }
} if( handleRequestAndExtractPathParam(socket) ){
} else return;
{ {{#apiInfo}}{{#apis}}{{#operations}}{{#operation}}{{#pathParams}}
{
QString completePath("{{{basePathWithoutHost}}}{{{path}}}");
QString {{paramName}}PathParam("{");
{{paramName}}PathParam.append("{{baseName}}").append("}");
completePath.replace("/", "\\/"); // replace '/' with '\/' for regex
completePath.replace({{paramName}}PathParam, "([^\\/]*?)"); // match anything but '/''
completePath.append("$"); // End of string
QRegularExpression re(completePath, QRegularExpression::CaseInsensitiveOption);
QRegularExpressionMatch match = re.match(socket->path());
if ((toQHttpEngineMethod("{{httpMethod}}") == socket->method()) && match.hasMatch() ) {
QString pathparam = match.captured(1);
auto reqObj = new {{classname}}Request(socket, {{classname}}ApiHandler);
reqObj->{{nickname}}Request({{#hasPathParams}}{{#pathParams}}pathparam{{/pathParams}}{{/hasPathParams}});
return;
}
}{{/pathParams}}{{/operation}}{{/operations}}{{/apis}}{{/apiInfo}}
} }
socket->setStatusCode(QHttpEngine::Socket::NotFound); socket->setStatusCode(QHttpEngine::Socket::NotFound);
if(socket->isOpen()){ if(socket->isOpen()){
socket->writeHeaders(); socket->writeHeaders();
socket->close(); socket->close();
} }
return;
} }
bool {{prefix}}ApiRouter::handleRequest(QHttpEngine::Socket *socket){
auto reqPath = QString("%1 %2").arg(fromQHttpEngineMethod(socket->method())).arg(socket->path()).toLower();
if ( Routes.contains(reqPath) ) {
Routes.value(reqPath).operator()(socket);
return true;
}
return false;
}
bool {{prefix}}ApiRouter::handleRequestAndExtractPathParam(QHttpEngine::Socket *socket){
auto reqPath = QString("%1 %2").arg(fromQHttpEngineMethod(socket->method())).arg(socket->path()).toLower();{{#apiInfo}}{{#apis}}{{#operations}}{{#operation}}{{#hasPathParams}}
{
auto completePath = QString("%1 %2").arg("{{httpMethod}}").arg("{{{basePathWithoutHost}}}{{{path}}}").toLower();
if ( reqPath.startsWith(completePath.leftRef( completePath.indexOf(QString("/{")))) ) {
QRegularExpression parExpr( R"(\{([^\/\\s]+)\})" );
completePath.replace( parExpr, R"((?<\1>[^\/\s]+))" );
completePath.append("[\\/]?$");
QRegularExpression pathExpr( completePath );
QRegularExpressionMatch match = pathExpr.match( reqPath );
if ( match.hasMatch() ){
{{#pathParams}}
QString {{baseName}} = match.captured(QString("{{baseName}}").toLower());
{{/pathParams}}
auto reqObj = new {{classname}}Request(socket, {{classname}}ApiHandler);
reqObj->{{nickname}}Request({{#pathParams}}{{baseName}}{{#hasMore}}, {{/hasMore}}{{/pathParams}});
return true;
}
}
}{{/hasPathParams}}{{/operation}}{{/operations}}{{/apis}}{{/apiInfo}}
return false;
}
{{#cppNamespaceDeclarations}} {{#cppNamespaceDeclarations}}
} }
{{/cppNamespaceDeclarations}} {{/cppNamespaceDeclarations}}

View File

@ -19,7 +19,7 @@
namespace {{this}} { namespace {{this}} {
{{/cppNamespaceDeclarations}} {{/cppNamespaceDeclarations}}
class RequestHandler : public QHttpEngine::QObjectHandler class {{prefix}}ApiRequestHandler : public QHttpEngine::QObjectHandler
{ {
Q_OBJECT Q_OBJECT
signals: signals:
@ -32,19 +32,51 @@ protected:
} }
}; };
class ApiRouter : public QObject class {{prefix}}ApiRouter : public QObject
{ {
Q_OBJECT Q_OBJECT
public: public:
ApiRouter(); {{prefix}}ApiRouter();
virtual ~ApiRouter(); virtual ~{{prefix}}ApiRouter();
void setUpRoutes(); void setUpRoutes();
void processRequest(QHttpEngine::Socket *socket); void processRequest(QHttpEngine::Socket *socket);
private: private:
QMultiMap<QString, std::function<void(QHttpEngine::Socket *)>> Routes; QMap<QString, std::function<void(QHttpEngine::Socket *)>> Routes;
QMultiMap<QString, std::function<void(QHttpEngine::Socket *)>> RoutesWithPathParam;
bool handleRequest(QHttpEngine::Socket *socket);
bool handleRequestAndExtractPathParam(QHttpEngine::Socket *socket);
{{#apiInfo}}{{#apis}} {{#apiInfo}}{{#apis}}
{{classname}}Handler *{{classname}}ApiHandler;{{/apis}}{{/apiInfo}} {{classname}}Handler *{{classname}}ApiHandler;{{/apis}}{{/apiInfo}}
protected:
// override this method to provide custom class derived from ApiHandler classes
virtual void createApiHandlers();
private :
inline QString fromQHttpEngineMethod(QHttpEngine::Socket::Method method){
switch( method ){
case QHttpEngine::Socket::Method::OPTIONS:
return QStringLiteral("OPTIONS");
case QHttpEngine::Socket::Method::GET:
return QStringLiteral("GET");
case QHttpEngine::Socket::Method::HEAD:
return QStringLiteral("HEAD");
case QHttpEngine::Socket::Method::POST:
return QStringLiteral("POST");
case QHttpEngine::Socket::Method::PUT:
return QStringLiteral("PUT");
case QHttpEngine::Socket::Method::DELETE:
return QStringLiteral("DELETE");
case QHttpEngine::Socket::Method::TRACE:
return QStringLiteral("TRACE");
case QHttpEngine::Socket::Method::CONNECT:
return QStringLiteral("CONNECT");
}
return QStringLiteral("");
}
}; };

View File

@ -125,7 +125,7 @@ namespace {{this}} {
for(auto itemkey : varmap.keys() ){ for(auto itemkey : varmap.keys() ){
T itemVal; T itemVal;
fromJsonValue(itemVal, QJsonValue::fromVariant(varmap.value(itemkey))); fromJsonValue(itemVal, QJsonValue::fromVariant(varmap.value(itemkey)));
val.insert(itemkey, val); val.insert(itemkey, itemVal);
} }
} }
return; return;

View File

@ -8,43 +8,43 @@
#include <QStringList> #include <QStringList>
#include <QSharedPointer> #include <QSharedPointer>
#include <QObject> #include <QObject>
#ifdef __linux__ #ifdef __linux__
#include <signal.h> #include <signal.h>
#include <unistd.h> #include <unistd.h>
#endif #endif
#include <qhttpengine/server.h> #include <qhttpengine/server.h>
#include "{{prefix}}ApiRouter.h" #include "{{prefix}}ApiRouter.h"
#ifdef __linux__ #ifdef __linux__
void catchUnixSignals(QList<int> quitSignals) { void catchUnixSignals(QList<int> quitSignals) {
auto handler = [](int sig) -> void { auto handler = [](int sig) -> void {
// blocking and not aysnc-signal-safe func are valid // blocking and not aysnc-signal-safe func are valid
qDebug() << "\nquit the application by signal " << sig; qDebug() << "\nquit the application by signal " << sig;
QCoreApplication::quit(); QCoreApplication::quit();
}; };
sigset_t blocking_mask; sigset_t blocking_mask;
sigemptyset(&blocking_mask); sigemptyset(&blocking_mask);
for (auto sig : quitSignals) for (auto sig : quitSignals)
sigaddset(&blocking_mask, sig); sigaddset(&blocking_mask, sig);
struct sigaction sa; struct sigaction sa;
sa.sa_handler = handler; sa.sa_handler = handler;
sa.sa_mask = blocking_mask; sa.sa_mask = blocking_mask;
sa.sa_flags = 0; sa.sa_flags = 0;
for (auto sig : quitSignals) for (auto sig : quitSignals)
sigaction(sig, &sa, nullptr); sigaction(sig, &sa, nullptr);
} }
#endif #endif
int main(int argc, char * argv[]) int main(int argc, char * argv[])
{ {
QCoreApplication a(argc, argv); QCoreApplication a(argc, argv);
#ifdef __linux__ #ifdef __linux__
QList<int> sigs({SIGQUIT, SIGINT, SIGTERM, SIGHUP}); QList<int> sigs({SIGQUIT, SIGINT, SIGTERM, SIGHUP});
catchUnixSignals(sigs); catchUnixSignals(sigs);
#endif #endif
// Build the command-line options // Build the command-line options
QCommandLineParser parser; QCommandLineParser parser;
QCommandLineOption addressOption( QCommandLineOption addressOption(
@ -69,11 +69,11 @@ int main(int argc, char * argv[])
// Obtain the values // Obtain the values
QHostAddress address = QHostAddress(parser.value(addressOption)); QHostAddress address = QHostAddress(parser.value(addressOption));
quint16 port = static_cast<quint16>(parser.value(portOption).toInt()); quint16 port = static_cast<quint16>(parser.value(portOption).toInt());
QSharedPointer<{{cppNamespace}}::RequestHandler> handler(new {{cppNamespace}}::RequestHandler()); QSharedPointer<{{cppNamespace}}::{{prefix}}ApiRequestHandler> handler(new {{cppNamespace}}::{{prefix}}ApiRequestHandler());
{{cppNamespace}}::ApiRouter router; {{cppNamespace}}::{{prefix}}ApiRouter router;
router.setUpRoutes(); router.setUpRoutes();
QObject::connect(handler.data(), &{{cppNamespace}}::RequestHandler::requestReceived, [&](QHttpEngine::Socket *socket) { QObject::connect(handler.data(), &{{cppNamespace}}::{{prefix}}ApiRequestHandler::requestReceived, [&](QHttpEngine::Socket *socket) {
router.processRequest(socket); router.processRequest(socket);
}); });
@ -84,6 +84,6 @@ int main(int argc, char * argv[])
qCritical("Unable to listen on the specified port."); qCritical("Unable to listen on the specified port.");
return 1; return 1;
} }
return a.exec(); return a.exec();
} }

View File

@ -22,7 +22,7 @@ namespace {{this}} {
} }
{{classname}}::~{{classname}}() { {{classname}}::~{{classname}}() {
} }
void void
@ -77,7 +77,7 @@ QJsonObject
{{classname}}::asJsonObject() const { {{classname}}::asJsonObject() const {
QJsonObject obj; QJsonObject obj;
{{#vars}} {{#vars}}
{{^isContainer}}{{#complexType}}{{^isString}}{{^isDateTime}}{{^isByteArray}}{{^isDate}}if({{name}}.isSet()){{/isDate}}{{/isByteArray}}{{/isDateTime}}{{/isString}}{{/complexType}}{{^complexType}}if(m_{{name}}_isSet){{/complexType}}{{#isString}}if(m_{{name}}_isSet){{/isString}}{{#isDateTime}}if(m_{{name}}_isSet){{/isDateTime}}{{#isByteArray}}if(m_{{name}}_isSet){{/isByteArray}}{{#isDate}}if(m_{{name}}_isSet){{/isDate}}{ {{^isContainer}}{{#complexType}}if({{name}}.isSet()){{/complexType}}{{^complexType}}if(m_{{name}}_isSet){{/complexType}}{
obj.insert(QString("{{baseName}}"), ::{{cppNamespace}}::toJsonValue({{name}})); obj.insert(QString("{{baseName}}"), ::{{cppNamespace}}::toJsonValue({{name}}));
}{{/isContainer}}{{#isContainer}} }{{/isContainer}}{{#isContainer}}
if({{name}}.size() > 0){ if({{name}}.size() > 0){
@ -105,7 +105,7 @@ bool
{{classname}}::isSet() const { {{classname}}::isSet() const {
bool isObjectUpdated = false; bool isObjectUpdated = false;
do{ {{#vars}} do{ {{#vars}}
{{#isContainer}}if({{name}}.size() > 0){{/isContainer}}{{^isContainer}}{{#complexType}}{{^isString}}{{^isDateTime}}{{^isByteArray}}{{^isDate}}if({{name}}.isSet()){{/isDate}}{{/isByteArray}}{{/isDateTime}}{{/isString}}{{/complexType}}{{^complexType}}if(m_{{name}}_isSet){{/complexType}}{{#isString}}if(m_{{name}}_isSet){{/isString}}{{#isDateTime}}if(m_{{name}}_isSet){{/isDateTime}}{{#isByteArray}}if(m_{{name}}_isSet){{/isByteArray}}{{#isDate}}if(m_{{name}}_isSet){{/isDate}}{{/isContainer}}{ isObjectUpdated = true; break;} {{#isContainer}}if({{name}}.size() > 0){{/isContainer}}{{^isContainer}}{{#complexType}}if({{name}}.isSet()){{/complexType}}{{^complexType}}if(m_{{name}}_isSet){{/complexType}}{{/isContainer}}{ isObjectUpdated = true; break;}
{{/vars}}}while(false); {{/vars}}}while(false);
return isObjectUpdated; return isObjectUpdated;
} }

View File

@ -12,9 +12,9 @@ namespace {{this}} {
class {{prefix}}Object { class {{prefix}}Object {
public: public:
virtual ~{{prefix}}Object(){ virtual ~{{prefix}}Object(){
} }
virtual QJsonObject asJsonObject() const { virtual QJsonObject asJsonObject() const {
return jObj; return jObj;
} }

View File

@ -12,7 +12,7 @@ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC -std=c++14 -Wall -Wno-unused-varia
if(${NODEBUG} STREQUAL "OFF") if(${NODEBUG} STREQUAL "OFF")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -pg -g3") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -pg -g3")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pg -g3") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pg -g3")
else (${NODEBUG} STREQUAL "OFF") else (${NODEBUG} STREQUAL "OFF")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -s -O3") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -s -O3")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -s -O3") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -s -O3")
endif(${NODEBUG} STREQUAL "OFF") endif(${NODEBUG} STREQUAL "OFF")

View File

@ -1,11 +1,11 @@
FROM alpine:latest AS build FROM alpine:latest AS build
RUN apk add --update \ RUN apk add --update \
cmake \ cmake \
alpine-sdk \ alpine-sdk \
openssl \ openssl \
qt5-qtbase-dev \ qt5-qtbase-dev \
qt5-qttools-dev qt5-qttools-dev
WORKDIR /usr/server WORKDIR /usr/server
ADD ./src ./src ADD ./src ./src
@ -13,10 +13,10 @@ ADD ./CMakeLists.txt ./
RUN mkdir -p ./build RUN mkdir -p ./build
WORKDIR /usr/server/build WORKDIR /usr/server/build
RUN cmake -DNODEBUG:STRING="ON" .. RUN cmake -DNODEBUG:STRING="ON" ..
RUN make RUN make
FROM alpine:latest AS runtime FROM alpine:latest AS runtime
RUN apk add --update \ RUN apk add --update \
libgcc \ libgcc \
libstdc++ \ libstdc++ \
qt5-qtbase \ qt5-qtbase \

View File

@ -1,4 +1,4 @@
QHttpEngine QHttpEngine
The MIT License (MIT) The MIT License (MIT)

View File

@ -1,8 +1,9 @@
# C++ Qt5 Server
## Qt5 HTTP Server based on the Qhttpengine ## Qt5 HTTP Server based on the Qhttpengine
This server was generated by the [openapi-generator]
(https://openapi-generator.tech) project. This server was generated by the [openapi-generator](https://openapi-generator.tech) project.
By using the [OpenAPI-Spec](https://github.com/OAI/OpenAPI-Specification) from a remote server, you can easily generate a server stub. By using the [OpenAPI-Spec](https://github.com/OAI/OpenAPI-Specification) from a remote server, you can easily generate a server stub.
-
To see how to make this your own, look here: To see how to make this your own, look here:
@ -21,30 +22,36 @@ Simple set of classes for developing HTTP server applications in Qt.
To learn more about building and using the library, please visit this page: To learn more about building and using the library, please visit this page:
https://ci.quickmediasolutions.com/job/qhttpengine-documentation/doxygen/ [Link](https://ci.quickmediasolutions.com/job/qhttpengine-documentation/doxygen)
### Viewing the code ### Viewing the code
You can view the code using an editor like Microsoft Visual Studio Code or you can
You can view the code using an editor like Microsoft Visual Studio Code or you can
Use QtCreator and browse for the root CMakeLists.txt and load it as a project Use QtCreator and browse for the root CMakeLists.txt and load it as a project
### Build with make ### Build with make
Install the tools [Linux/Debian] Install the tools [Linux/Debian]
```
```shell
sudo apt install cmake build-essential libssl-dev qtbase5-dev qtbase5-dev-tools git curl sudo apt install cmake build-essential libssl-dev qtbase5-dev qtbase5-dev-tools git curl
``` ```
To build, go to the `server` folder To build, go to the `server` folder
```
make ```shell
make
``` ```
To run the server To run the server
```
```shell
./build/src/cpp-qt5-server & ./build/src/cpp-qt5-server &
``` ```
#### Invoke an API #### Invoke an API
```
```shell
curl -X GET http://localhost:8080/v2/store/inventory curl -X GET http://localhost:8080/v2/store/inventory
curl -X POST http://localhost:8080/v2/store/order -H "Content-Type: application/json" -d "{ \"id\": 22, \"petId\": 1541, \"quantity\": 5, \"shipDate\": \"2018-06-16T18:31:43.870Z\", \"status\": \"placed\", \"complete\": \"true\" }" curl -X POST http://localhost:8080/v2/store/order -H "Content-Type: application/json" -d "{ \"id\": 22, \"petId\": 1541, \"quantity\": 5, \"shipDate\": \"2018-06-16T18:31:43.870Z\", \"status\": \"placed\", \"complete\": \"true\" }"
curl -X GET http://localhost:8080/v2/pet/findByStatus curl -X GET http://localhost:8080/v2/pet/findByStatus
@ -52,38 +59,50 @@ curl -X GET http://localhost:8080/v2/store/inventory
``` ```
### Run and build with docker ### Run and build with docker
Building with docker multistage Building with docker multistage
If you dont have docker install [here](https://docs.docker.com/install) If you dont have docker install [here](https://docs.docker.com/install)
Add yourself to the docker group Add yourself to the docker group
``` ```shell
docker build --network=host -t cpp-qt5-server . docker build --network=host -t cpp-qt5-server .
``` ```
Running with docker
``` Running with docker
docker run --rm -it --name=server-container cpp-qt5-server
```shell
docker run --rm -it --name=server-container cpp-qt5-server
``` ```
#### Invoking an API #### Invoking an API
Mind the IP here Mind the IP here
```
```shell
curl -X GET http://172.17.0.2:8080/v2/store/inventory curl -X GET http://172.17.0.2:8080/v2/store/inventory
curl -X POST http://172.17.0.2:8080/v2/store/order -H "Content-Type: application/json" -d "{ \"id\": 22, \"petId\": 1541, \"quantity\": 5, \"shipDate\": \"2018-06-16T18:31:43.870Z\", \"status\": \"placed\", \"complete\": \"true\" }" curl -X POST http://172.17.0.2:8080/v2/store/order -H "Content-Type: application/json" -d "{ \"id\": 22, \"petId\": 1541, \"quantity\": 5, \"shipDate\": \"2018-06-16T18:31:43.870Z\", \"status\": \"placed\", \"complete\": \"true\" }"
``` ```
use this command to get the container IP use this command to get the container IP
```
```shell
docker inspect server-container | grep "IPAddress" docker inspect server-container | grep "IPAddress"
``` ```
To exit from the command line
``` To exit from the command line
```shell
Ctrl + p + q Ctrl + p + q
``` ```
To stop container To stop container
```
```shell
docker stop <containername> docker stop <containername>
``` ```
or to terminate and quit or to terminate and quit
```
```shell
Ctrl+C Ctrl+C
``` ```

View File

@ -12,7 +12,7 @@ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC -std=c++14 -Wall -Wno-unused-varia
if(${NODEBUG} STREQUAL "OFF") if(${NODEBUG} STREQUAL "OFF")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -pg -g3") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -pg -g3")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pg -g3") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pg -g3")
else (${NODEBUG} STREQUAL "OFF") else (${NODEBUG} STREQUAL "OFF")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -s -O3") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -s -O3")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -s -O3") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -s -O3")
endif(${NODEBUG} STREQUAL "OFF") endif(${NODEBUG} STREQUAL "OFF")

View File

@ -24,270 +24,241 @@
namespace OpenAPI { namespace OpenAPI {
inline QHttpEngine::Socket::Method toQHttpEngineMethod(QString method){ OAIApiRouter::OAIApiRouter() {
createApiHandlers();
if( method == QString("OPTIONS"))
return QHttpEngine::Socket::Method::OPTIONS;
if( method == QString("GET"))
return QHttpEngine::Socket::Method::GET;
if( method == QString("HEAD"))
return QHttpEngine::Socket::Method::HEAD;
if( method == QString("POST"))
return QHttpEngine::Socket::Method::POST;
if( method == QString("PUT"))
return QHttpEngine::Socket::Method::PUT;
if( method == QString("DELETE"))
return QHttpEngine::Socket::Method::DELETE;
if( method == QString("TRACE"))
return QHttpEngine::Socket::Method::TRACE;
if( method == QString("CONNECT"))
return QHttpEngine::Socket::Method::CONNECT;
return static_cast<QHttpEngine::Socket::Method>(-1);
} }
ApiRouter::ApiRouter() { OAIApiRouter::~OAIApiRouter(){
OAIPetApiApiHandler = new OAIPetApiHandler(); qDebug() << "~ApiRouter()";
OAIStoreApiApiHandler = new OAIStoreApiHandler();
OAIUserApiApiHandler = new OAIUserApiHandler();
}
ApiRouter::~ApiRouter(){
qDebug() << "~ApiRouter()";
delete OAIPetApiApiHandler; delete OAIPetApiApiHandler;
delete OAIStoreApiApiHandler; delete OAIStoreApiApiHandler;
delete OAIUserApiApiHandler; delete OAIUserApiApiHandler;
} }
void ApiRouter::setUpRoutes() { void OAIApiRouter::createApiHandlers() {
OAIPetApiApiHandler = new OAIPetApiHandler();
OAIStoreApiApiHandler = new OAIStoreApiHandler();
OAIUserApiApiHandler = new OAIUserApiHandler();
}
void OAIApiRouter::setUpRoutes() {
Routes.insert("/v2/pet",[this](QHttpEngine::Socket *socket) { Routes.insert(QString("%1 %2").arg("POST").arg("/v2/pet").toLower(), [this](QHttpEngine::Socket *socket) {
if(toQHttpEngineMethod("POST") == socket->method()){
auto reqObj = new OAIPetApiRequest(socket, OAIPetApiApiHandler); auto reqObj = new OAIPetApiRequest(socket, OAIPetApiApiHandler);
reqObj->addPetRequest(); reqObj->addPetRequest();
}
}); });
Routes.insert("/v2/pet/findByStatus",[this](QHttpEngine::Socket *socket) { Routes.insert(QString("%1 %2").arg("GET").arg("/v2/pet/findByStatus").toLower(), [this](QHttpEngine::Socket *socket) {
if(toQHttpEngineMethod("GET") == socket->method()){
auto reqObj = new OAIPetApiRequest(socket, OAIPetApiApiHandler); auto reqObj = new OAIPetApiRequest(socket, OAIPetApiApiHandler);
reqObj->findPetsByStatusRequest(); reqObj->findPetsByStatusRequest();
}
}); });
Routes.insert("/v2/pet/findByTags",[this](QHttpEngine::Socket *socket) { Routes.insert(QString("%1 %2").arg("GET").arg("/v2/pet/findByTags").toLower(), [this](QHttpEngine::Socket *socket) {
if(toQHttpEngineMethod("GET") == socket->method()){
auto reqObj = new OAIPetApiRequest(socket, OAIPetApiApiHandler); auto reqObj = new OAIPetApiRequest(socket, OAIPetApiApiHandler);
reqObj->findPetsByTagsRequest(); reqObj->findPetsByTagsRequest();
}
}); });
Routes.insert("/v2/pet",[this](QHttpEngine::Socket *socket) { Routes.insert(QString("%1 %2").arg("PUT").arg("/v2/pet").toLower(), [this](QHttpEngine::Socket *socket) {
if(toQHttpEngineMethod("PUT") == socket->method()){
auto reqObj = new OAIPetApiRequest(socket, OAIPetApiApiHandler); auto reqObj = new OAIPetApiRequest(socket, OAIPetApiApiHandler);
reqObj->updatePetRequest(); reqObj->updatePetRequest();
}
}); });
Routes.insert("/v2/store/inventory",[this](QHttpEngine::Socket *socket) { Routes.insert(QString("%1 %2").arg("GET").arg("/v2/store/inventory").toLower(), [this](QHttpEngine::Socket *socket) {
if(toQHttpEngineMethod("GET") == socket->method()){
auto reqObj = new OAIStoreApiRequest(socket, OAIStoreApiApiHandler); auto reqObj = new OAIStoreApiRequest(socket, OAIStoreApiApiHandler);
reqObj->getInventoryRequest(); reqObj->getInventoryRequest();
}
}); });
Routes.insert("/v2/store/order",[this](QHttpEngine::Socket *socket) { Routes.insert(QString("%1 %2").arg("POST").arg("/v2/store/order").toLower(), [this](QHttpEngine::Socket *socket) {
if(toQHttpEngineMethod("POST") == socket->method()){
auto reqObj = new OAIStoreApiRequest(socket, OAIStoreApiApiHandler); auto reqObj = new OAIStoreApiRequest(socket, OAIStoreApiApiHandler);
reqObj->placeOrderRequest(); reqObj->placeOrderRequest();
}
}); });
Routes.insert("/v2/user",[this](QHttpEngine::Socket *socket) { Routes.insert(QString("%1 %2").arg("POST").arg("/v2/user").toLower(), [this](QHttpEngine::Socket *socket) {
if(toQHttpEngineMethod("POST") == socket->method()){
auto reqObj = new OAIUserApiRequest(socket, OAIUserApiApiHandler); auto reqObj = new OAIUserApiRequest(socket, OAIUserApiApiHandler);
reqObj->createUserRequest(); reqObj->createUserRequest();
}
}); });
Routes.insert("/v2/user/createWithArray",[this](QHttpEngine::Socket *socket) { Routes.insert(QString("%1 %2").arg("POST").arg("/v2/user/createWithArray").toLower(), [this](QHttpEngine::Socket *socket) {
if(toQHttpEngineMethod("POST") == socket->method()){
auto reqObj = new OAIUserApiRequest(socket, OAIUserApiApiHandler); auto reqObj = new OAIUserApiRequest(socket, OAIUserApiApiHandler);
reqObj->createUsersWithArrayInputRequest(); reqObj->createUsersWithArrayInputRequest();
}
}); });
Routes.insert("/v2/user/createWithList",[this](QHttpEngine::Socket *socket) { Routes.insert(QString("%1 %2").arg("POST").arg("/v2/user/createWithList").toLower(), [this](QHttpEngine::Socket *socket) {
if(toQHttpEngineMethod("POST") == socket->method()){
auto reqObj = new OAIUserApiRequest(socket, OAIUserApiApiHandler); auto reqObj = new OAIUserApiRequest(socket, OAIUserApiApiHandler);
reqObj->createUsersWithListInputRequest(); reqObj->createUsersWithListInputRequest();
}
}); });
Routes.insert("/v2/user/login",[this](QHttpEngine::Socket *socket) { Routes.insert(QString("%1 %2").arg("GET").arg("/v2/user/login").toLower(), [this](QHttpEngine::Socket *socket) {
if(toQHttpEngineMethod("GET") == socket->method()){
auto reqObj = new OAIUserApiRequest(socket, OAIUserApiApiHandler); auto reqObj = new OAIUserApiRequest(socket, OAIUserApiApiHandler);
reqObj->loginUserRequest(); reqObj->loginUserRequest();
}
}); });
Routes.insert("/v2/user/logout",[this](QHttpEngine::Socket *socket) { Routes.insert(QString("%1 %2").arg("GET").arg("/v2/user/logout").toLower(), [this](QHttpEngine::Socket *socket) {
if(toQHttpEngineMethod("GET") == socket->method()){
auto reqObj = new OAIUserApiRequest(socket, OAIUserApiApiHandler); auto reqObj = new OAIUserApiRequest(socket, OAIUserApiApiHandler);
reqObj->logoutUserRequest(); reqObj->logoutUserRequest();
} });
});
} }
void ApiRouter::processRequest(QHttpEngine::Socket *socket){ void OAIApiRouter::processRequest(QHttpEngine::Socket *socket){
if (Routes.contains(socket->path())) { if( handleRequest(socket) ){
for(auto endpoints : Routes.values(socket->path())) { return;
endpoints.operator()(socket); }
} if( handleRequestAndExtractPathParam(socket) ){
} else return;
{
{
QString completePath("/v2/pet/{petId}");
QString pet_idPathParam("{");
pet_idPathParam.append("petId").append("}");
completePath.replace("/", "\\/"); // replace '/' with '\/' for regex
completePath.replace(pet_idPathParam, "([^\\/]*?)"); // match anything but '/''
completePath.append("$"); // End of string
QRegularExpression re(completePath, QRegularExpression::CaseInsensitiveOption);
QRegularExpressionMatch match = re.match(socket->path());
if ((toQHttpEngineMethod("DELETE") == socket->method()) && match.hasMatch() ) {
QString pathparam = match.captured(1);
auto reqObj = new OAIPetApiRequest(socket, OAIPetApiApiHandler);
reqObj->deletePetRequest(pathparam);;
return;
}
}
{
QString completePath("/v2/pet/{petId}");
QString pet_idPathParam("{");
pet_idPathParam.append("petId").append("}");
completePath.replace("/", "\\/"); // replace '/' with '\/' for regex
completePath.replace(pet_idPathParam, "([^\\/]*?)"); // match anything but '/''
completePath.append("$"); // End of string
QRegularExpression re(completePath, QRegularExpression::CaseInsensitiveOption);
QRegularExpressionMatch match = re.match(socket->path());
if ((toQHttpEngineMethod("GET") == socket->method()) && match.hasMatch() ) {
QString pathparam = match.captured(1);
auto reqObj = new OAIPetApiRequest(socket, OAIPetApiApiHandler);
reqObj->getPetByIdRequest(pathparam);;
return;
}
}
{
QString completePath("/v2/pet/{petId}");
QString pet_idPathParam("{");
pet_idPathParam.append("petId").append("}");
completePath.replace("/", "\\/"); // replace '/' with '\/' for regex
completePath.replace(pet_idPathParam, "([^\\/]*?)"); // match anything but '/''
completePath.append("$"); // End of string
QRegularExpression re(completePath, QRegularExpression::CaseInsensitiveOption);
QRegularExpressionMatch match = re.match(socket->path());
if ((toQHttpEngineMethod("POST") == socket->method()) && match.hasMatch() ) {
QString pathparam = match.captured(1);
auto reqObj = new OAIPetApiRequest(socket, OAIPetApiApiHandler);
reqObj->updatePetWithFormRequest(pathparam);;
return;
}
}
{
QString completePath("/v2/pet/{petId}/uploadImage");
QString pet_idPathParam("{");
pet_idPathParam.append("petId").append("}");
completePath.replace("/", "\\/"); // replace '/' with '\/' for regex
completePath.replace(pet_idPathParam, "([^\\/]*?)"); // match anything but '/''
completePath.append("$"); // End of string
QRegularExpression re(completePath, QRegularExpression::CaseInsensitiveOption);
QRegularExpressionMatch match = re.match(socket->path());
if ((toQHttpEngineMethod("POST") == socket->method()) && match.hasMatch() ) {
QString pathparam = match.captured(1);
auto reqObj = new OAIPetApiRequest(socket, OAIPetApiApiHandler);
reqObj->uploadFileRequest(pathparam);;
return;
}
}
{
QString completePath("/v2/store/order/{orderId}");
QString order_idPathParam("{");
order_idPathParam.append("orderId").append("}");
completePath.replace("/", "\\/"); // replace '/' with '\/' for regex
completePath.replace(order_idPathParam, "([^\\/]*?)"); // match anything but '/''
completePath.append("$"); // End of string
QRegularExpression re(completePath, QRegularExpression::CaseInsensitiveOption);
QRegularExpressionMatch match = re.match(socket->path());
if ((toQHttpEngineMethod("DELETE") == socket->method()) && match.hasMatch() ) {
QString pathparam = match.captured(1);
auto reqObj = new OAIStoreApiRequest(socket, OAIStoreApiApiHandler);
reqObj->deleteOrderRequest(pathparam);;
return;
}
}
{
QString completePath("/v2/store/order/{orderId}");
QString order_idPathParam("{");
order_idPathParam.append("orderId").append("}");
completePath.replace("/", "\\/"); // replace '/' with '\/' for regex
completePath.replace(order_idPathParam, "([^\\/]*?)"); // match anything but '/''
completePath.append("$"); // End of string
QRegularExpression re(completePath, QRegularExpression::CaseInsensitiveOption);
QRegularExpressionMatch match = re.match(socket->path());
if ((toQHttpEngineMethod("GET") == socket->method()) && match.hasMatch() ) {
QString pathparam = match.captured(1);
auto reqObj = new OAIStoreApiRequest(socket, OAIStoreApiApiHandler);
reqObj->getOrderByIdRequest(pathparam);;
return;
}
}
{
QString completePath("/v2/user/{username}");
QString usernamePathParam("{");
usernamePathParam.append("username").append("}");
completePath.replace("/", "\\/"); // replace '/' with '\/' for regex
completePath.replace(usernamePathParam, "([^\\/]*?)"); // match anything but '/''
completePath.append("$"); // End of string
QRegularExpression re(completePath, QRegularExpression::CaseInsensitiveOption);
QRegularExpressionMatch match = re.match(socket->path());
if ((toQHttpEngineMethod("DELETE") == socket->method()) && match.hasMatch() ) {
QString pathparam = match.captured(1);
auto reqObj = new OAIUserApiRequest(socket, OAIUserApiApiHandler);
reqObj->deleteUserRequest(pathparam);;
return;
}
}
{
QString completePath("/v2/user/{username}");
QString usernamePathParam("{");
usernamePathParam.append("username").append("}");
completePath.replace("/", "\\/"); // replace '/' with '\/' for regex
completePath.replace(usernamePathParam, "([^\\/]*?)"); // match anything but '/''
completePath.append("$"); // End of string
QRegularExpression re(completePath, QRegularExpression::CaseInsensitiveOption);
QRegularExpressionMatch match = re.match(socket->path());
if ((toQHttpEngineMethod("GET") == socket->method()) && match.hasMatch() ) {
QString pathparam = match.captured(1);
auto reqObj = new OAIUserApiRequest(socket, OAIUserApiApiHandler);
reqObj->getUserByNameRequest(pathparam);;
return;
}
}
{
QString completePath("/v2/user/{username}");
QString usernamePathParam("{");
usernamePathParam.append("username").append("}");
completePath.replace("/", "\\/"); // replace '/' with '\/' for regex
completePath.replace(usernamePathParam, "([^\\/]*?)"); // match anything but '/''
completePath.append("$"); // End of string
QRegularExpression re(completePath, QRegularExpression::CaseInsensitiveOption);
QRegularExpressionMatch match = re.match(socket->path());
if ((toQHttpEngineMethod("PUT") == socket->method()) && match.hasMatch() ) {
QString pathparam = match.captured(1);
auto reqObj = new OAIUserApiRequest(socket, OAIUserApiApiHandler);
reqObj->updateUserRequest(pathparam);;
return;
}
}
} }
socket->setStatusCode(QHttpEngine::Socket::NotFound); socket->setStatusCode(QHttpEngine::Socket::NotFound);
if(socket->isOpen()){ if(socket->isOpen()){
socket->writeHeaders(); socket->writeHeaders();
socket->close(); socket->close();
} }
return;
} }
bool OAIApiRouter::handleRequest(QHttpEngine::Socket *socket){
auto reqPath = QString("%1 %2").arg(fromQHttpEngineMethod(socket->method())).arg(socket->path()).toLower();
if ( Routes.contains(reqPath) ) {
Routes.value(reqPath).operator()(socket);
return true;
}
return false;
}
bool OAIApiRouter::handleRequestAndExtractPathParam(QHttpEngine::Socket *socket){
auto reqPath = QString("%1 %2").arg(fromQHttpEngineMethod(socket->method())).arg(socket->path()).toLower();
{
auto completePath = QString("%1 %2").arg("DELETE").arg("/v2/pet/{petId}").toLower();
if ( reqPath.startsWith(completePath.leftRef( completePath.indexOf(QString("/{")))) ) {
QRegularExpression parExpr( R"(\{([^\/\\s]+)\})" );
completePath.replace( parExpr, R"((?<\1>[^\/\s]+))" );
completePath.append("[\\/]?$");
QRegularExpression pathExpr( completePath );
QRegularExpressionMatch match = pathExpr.match( reqPath );
if ( match.hasMatch() ){
QString petId = match.captured(QString("petId").toLower());
auto reqObj = new OAIPetApiRequest(socket, OAIPetApiApiHandler);
reqObj->deletePetRequest(petId);
return true;
}
}
}
{
auto completePath = QString("%1 %2").arg("GET").arg("/v2/pet/{petId}").toLower();
if ( reqPath.startsWith(completePath.leftRef( completePath.indexOf(QString("/{")))) ) {
QRegularExpression parExpr( R"(\{([^\/\\s]+)\})" );
completePath.replace( parExpr, R"((?<\1>[^\/\s]+))" );
completePath.append("[\\/]?$");
QRegularExpression pathExpr( completePath );
QRegularExpressionMatch match = pathExpr.match( reqPath );
if ( match.hasMatch() ){
QString petId = match.captured(QString("petId").toLower());
auto reqObj = new OAIPetApiRequest(socket, OAIPetApiApiHandler);
reqObj->getPetByIdRequest(petId);
return true;
}
}
}
{
auto completePath = QString("%1 %2").arg("POST").arg("/v2/pet/{petId}").toLower();
if ( reqPath.startsWith(completePath.leftRef( completePath.indexOf(QString("/{")))) ) {
QRegularExpression parExpr( R"(\{([^\/\\s]+)\})" );
completePath.replace( parExpr, R"((?<\1>[^\/\s]+))" );
completePath.append("[\\/]?$");
QRegularExpression pathExpr( completePath );
QRegularExpressionMatch match = pathExpr.match( reqPath );
if ( match.hasMatch() ){
QString petId = match.captured(QString("petId").toLower());
auto reqObj = new OAIPetApiRequest(socket, OAIPetApiApiHandler);
reqObj->updatePetWithFormRequest(petId);
return true;
}
}
}
{
auto completePath = QString("%1 %2").arg("POST").arg("/v2/pet/{petId}/uploadImage").toLower();
if ( reqPath.startsWith(completePath.leftRef( completePath.indexOf(QString("/{")))) ) {
QRegularExpression parExpr( R"(\{([^\/\\s]+)\})" );
completePath.replace( parExpr, R"((?<\1>[^\/\s]+))" );
completePath.append("[\\/]?$");
QRegularExpression pathExpr( completePath );
QRegularExpressionMatch match = pathExpr.match( reqPath );
if ( match.hasMatch() ){
QString petId = match.captured(QString("petId").toLower());
auto reqObj = new OAIPetApiRequest(socket, OAIPetApiApiHandler);
reqObj->uploadFileRequest(petId);
return true;
}
}
}
{
auto completePath = QString("%1 %2").arg("DELETE").arg("/v2/store/order/{orderId}").toLower();
if ( reqPath.startsWith(completePath.leftRef( completePath.indexOf(QString("/{")))) ) {
QRegularExpression parExpr( R"(\{([^\/\\s]+)\})" );
completePath.replace( parExpr, R"((?<\1>[^\/\s]+))" );
completePath.append("[\\/]?$");
QRegularExpression pathExpr( completePath );
QRegularExpressionMatch match = pathExpr.match( reqPath );
if ( match.hasMatch() ){
QString orderId = match.captured(QString("orderId").toLower());
auto reqObj = new OAIStoreApiRequest(socket, OAIStoreApiApiHandler);
reqObj->deleteOrderRequest(orderId);
return true;
}
}
}
{
auto completePath = QString("%1 %2").arg("GET").arg("/v2/store/order/{orderId}").toLower();
if ( reqPath.startsWith(completePath.leftRef( completePath.indexOf(QString("/{")))) ) {
QRegularExpression parExpr( R"(\{([^\/\\s]+)\})" );
completePath.replace( parExpr, R"((?<\1>[^\/\s]+))" );
completePath.append("[\\/]?$");
QRegularExpression pathExpr( completePath );
QRegularExpressionMatch match = pathExpr.match( reqPath );
if ( match.hasMatch() ){
QString orderId = match.captured(QString("orderId").toLower());
auto reqObj = new OAIStoreApiRequest(socket, OAIStoreApiApiHandler);
reqObj->getOrderByIdRequest(orderId);
return true;
}
}
}
{
auto completePath = QString("%1 %2").arg("DELETE").arg("/v2/user/{username}").toLower();
if ( reqPath.startsWith(completePath.leftRef( completePath.indexOf(QString("/{")))) ) {
QRegularExpression parExpr( R"(\{([^\/\\s]+)\})" );
completePath.replace( parExpr, R"((?<\1>[^\/\s]+))" );
completePath.append("[\\/]?$");
QRegularExpression pathExpr( completePath );
QRegularExpressionMatch match = pathExpr.match( reqPath );
if ( match.hasMatch() ){
QString username = match.captured(QString("username").toLower());
auto reqObj = new OAIUserApiRequest(socket, OAIUserApiApiHandler);
reqObj->deleteUserRequest(username);
return true;
}
}
}
{
auto completePath = QString("%1 %2").arg("GET").arg("/v2/user/{username}").toLower();
if ( reqPath.startsWith(completePath.leftRef( completePath.indexOf(QString("/{")))) ) {
QRegularExpression parExpr( R"(\{([^\/\\s]+)\})" );
completePath.replace( parExpr, R"((?<\1>[^\/\s]+))" );
completePath.append("[\\/]?$");
QRegularExpression pathExpr( completePath );
QRegularExpressionMatch match = pathExpr.match( reqPath );
if ( match.hasMatch() ){
QString username = match.captured(QString("username").toLower());
auto reqObj = new OAIUserApiRequest(socket, OAIUserApiApiHandler);
reqObj->getUserByNameRequest(username);
return true;
}
}
}
{
auto completePath = QString("%1 %2").arg("PUT").arg("/v2/user/{username}").toLower();
if ( reqPath.startsWith(completePath.leftRef( completePath.indexOf(QString("/{")))) ) {
QRegularExpression parExpr( R"(\{([^\/\\s]+)\})" );
completePath.replace( parExpr, R"((?<\1>[^\/\s]+))" );
completePath.append("[\\/]?$");
QRegularExpression pathExpr( completePath );
QRegularExpressionMatch match = pathExpr.match( reqPath );
if ( match.hasMatch() ){
QString username = match.captured(QString("username").toLower());
auto reqObj = new OAIUserApiRequest(socket, OAIUserApiApiHandler);
reqObj->updateUserRequest(username);
return true;
}
}
}
return false;
}
} }

View File

@ -30,7 +30,7 @@
namespace OpenAPI { namespace OpenAPI {
class RequestHandler : public QHttpEngine::QObjectHandler class OAIApiRequestHandler : public QHttpEngine::QObjectHandler
{ {
Q_OBJECT Q_OBJECT
signals: signals:
@ -43,21 +43,53 @@ protected:
} }
}; };
class ApiRouter : public QObject class OAIApiRouter : public QObject
{ {
Q_OBJECT Q_OBJECT
public: public:
ApiRouter(); OAIApiRouter();
virtual ~ApiRouter(); virtual ~OAIApiRouter();
void setUpRoutes(); void setUpRoutes();
void processRequest(QHttpEngine::Socket *socket); void processRequest(QHttpEngine::Socket *socket);
private: private:
QMultiMap<QString, std::function<void(QHttpEngine::Socket *)>> Routes; QMap<QString, std::function<void(QHttpEngine::Socket *)>> Routes;
QMultiMap<QString, std::function<void(QHttpEngine::Socket *)>> RoutesWithPathParam;
bool handleRequest(QHttpEngine::Socket *socket);
bool handleRequestAndExtractPathParam(QHttpEngine::Socket *socket);
OAIPetApiHandler *OAIPetApiApiHandler; OAIPetApiHandler *OAIPetApiApiHandler;
OAIStoreApiHandler *OAIStoreApiApiHandler; OAIStoreApiHandler *OAIStoreApiApiHandler;
OAIUserApiHandler *OAIUserApiApiHandler; OAIUserApiHandler *OAIUserApiApiHandler;
protected:
// override this method to provide custom class derived from ApiHandler classes
virtual void createApiHandlers();
private :
inline QString fromQHttpEngineMethod(QHttpEngine::Socket::Method method){
switch( method ){
case QHttpEngine::Socket::Method::OPTIONS:
return QStringLiteral("OPTIONS");
case QHttpEngine::Socket::Method::GET:
return QStringLiteral("GET");
case QHttpEngine::Socket::Method::HEAD:
return QStringLiteral("HEAD");
case QHttpEngine::Socket::Method::POST:
return QStringLiteral("POST");
case QHttpEngine::Socket::Method::PUT:
return QStringLiteral("PUT");
case QHttpEngine::Socket::Method::DELETE:
return QStringLiteral("DELETE");
case QHttpEngine::Socket::Method::TRACE:
return QStringLiteral("TRACE");
case QHttpEngine::Socket::Method::CONNECT:
return QStringLiteral("CONNECT");
}
return QStringLiteral("");
}
}; };

View File

@ -19,43 +19,43 @@
#include <QStringList> #include <QStringList>
#include <QSharedPointer> #include <QSharedPointer>
#include <QObject> #include <QObject>
#ifdef __linux__ #ifdef __linux__
#include <signal.h> #include <signal.h>
#include <unistd.h> #include <unistd.h>
#endif #endif
#include <qhttpengine/server.h> #include <qhttpengine/server.h>
#include "OAIApiRouter.h" #include "OAIApiRouter.h"
#ifdef __linux__ #ifdef __linux__
void catchUnixSignals(QList<int> quitSignals) { void catchUnixSignals(QList<int> quitSignals) {
auto handler = [](int sig) -> void { auto handler = [](int sig) -> void {
// blocking and not aysnc-signal-safe func are valid // blocking and not aysnc-signal-safe func are valid
qDebug() << "\nquit the application by signal " << sig; qDebug() << "\nquit the application by signal " << sig;
QCoreApplication::quit(); QCoreApplication::quit();
}; };
sigset_t blocking_mask; sigset_t blocking_mask;
sigemptyset(&blocking_mask); sigemptyset(&blocking_mask);
for (auto sig : quitSignals) for (auto sig : quitSignals)
sigaddset(&blocking_mask, sig); sigaddset(&blocking_mask, sig);
struct sigaction sa; struct sigaction sa;
sa.sa_handler = handler; sa.sa_handler = handler;
sa.sa_mask = blocking_mask; sa.sa_mask = blocking_mask;
sa.sa_flags = 0; sa.sa_flags = 0;
for (auto sig : quitSignals) for (auto sig : quitSignals)
sigaction(sig, &sa, nullptr); sigaction(sig, &sa, nullptr);
} }
#endif #endif
int main(int argc, char * argv[]) int main(int argc, char * argv[])
{ {
QCoreApplication a(argc, argv); QCoreApplication a(argc, argv);
#ifdef __linux__ #ifdef __linux__
QList<int> sigs({SIGQUIT, SIGINT, SIGTERM, SIGHUP}); QList<int> sigs({SIGQUIT, SIGINT, SIGTERM, SIGHUP});
catchUnixSignals(sigs); catchUnixSignals(sigs);
#endif #endif
// Build the command-line options // Build the command-line options
QCommandLineParser parser; QCommandLineParser parser;
QCommandLineOption addressOption( QCommandLineOption addressOption(
@ -80,11 +80,11 @@ int main(int argc, char * argv[])
// Obtain the values // Obtain the values
QHostAddress address = QHostAddress(parser.value(addressOption)); QHostAddress address = QHostAddress(parser.value(addressOption));
quint16 port = static_cast<quint16>(parser.value(portOption).toInt()); quint16 port = static_cast<quint16>(parser.value(portOption).toInt());
QSharedPointer<OpenAPI::RequestHandler> handler(new OpenAPI::RequestHandler()); QSharedPointer<OpenAPI::OAIApiRequestHandler> handler(new OpenAPI::OAIApiRequestHandler());
OpenAPI::ApiRouter router; OpenAPI::OAIApiRouter router;
router.setUpRoutes(); router.setUpRoutes();
QObject::connect(handler.data(), &OpenAPI::RequestHandler::requestReceived, [&](QHttpEngine::Socket *socket) { QObject::connect(handler.data(), &OpenAPI::OAIApiRequestHandler::requestReceived, [&](QHttpEngine::Socket *socket) {
router.processRequest(socket); router.processRequest(socket);
}); });
@ -95,6 +95,6 @@ int main(int argc, char * argv[])
qCritical("Unable to listen on the specified port."); qCritical("Unable to listen on the specified port.");
return 1; return 1;
} }
return a.exec(); return a.exec();
} }

View File

@ -31,7 +31,7 @@ OAIApiResponse::OAIApiResponse() {
} }
OAIApiResponse::~OAIApiResponse() { OAIApiResponse::~OAIApiResponse() {
} }
void void

View File

@ -31,7 +31,7 @@ OAICategory::OAICategory() {
} }
OAICategory::~OAICategory() { OAICategory::~OAICategory() {
} }
void void

View File

@ -134,7 +134,7 @@ namespace OpenAPI {
for(auto itemkey : varmap.keys() ){ for(auto itemkey : varmap.keys() ){
T itemVal; T itemVal;
fromJsonValue(itemVal, QJsonValue::fromVariant(varmap.value(itemkey))); fromJsonValue(itemVal, QJsonValue::fromVariant(varmap.value(itemkey)));
val.insert(itemkey, val); val.insert(itemkey, itemVal);
} }
} }
return; return;

View File

@ -21,9 +21,9 @@ namespace OpenAPI {
class OAIObject { class OAIObject {
public: public:
virtual ~OAIObject(){ virtual ~OAIObject(){
} }
virtual QJsonObject asJsonObject() const { virtual QJsonObject asJsonObject() const {
return jObj; return jObj;
} }

View File

@ -31,7 +31,7 @@ OAIOrder::OAIOrder() {
} }
OAIOrder::~OAIOrder() { OAIOrder::~OAIOrder() {
} }
void void

View File

@ -31,7 +31,7 @@ OAIPet::OAIPet() {
} }
OAIPet::~OAIPet() { OAIPet::~OAIPet() {
} }
void void

View File

@ -31,7 +31,7 @@ OAITag::OAITag() {
} }
OAITag::~OAITag() { OAITag::~OAITag() {
} }
void void

View File

@ -31,7 +31,7 @@ OAIUser::OAIUser() {
} }
OAIUser::~OAIUser() { OAIUser::~OAIUser() {
} }
void void

View File

@ -25,7 +25,7 @@ OAIPetApiRequest::OAIPetApiRequest(QHttpEngine::Socket *s, OAIPetApiHandler* hdl
auto headers = s->headers(); auto headers = s->headers();
for(auto itr = headers.begin(); itr != headers.end(); itr++) { for(auto itr = headers.begin(); itr != headers.end(); itr++) {
requestHeaders.insert(QString(itr.key()), QString(itr.value())); requestHeaders.insert(QString(itr.key()), QString(itr.value()));
} }
} }
OAIPetApiRequest::~OAIPetApiRequest(){ OAIPetApiRequest::~OAIPetApiRequest(){
@ -33,7 +33,7 @@ OAIPetApiRequest::~OAIPetApiRequest(){
qDebug() << "OAIPetApiRequest::~OAIPetApiRequest()"; qDebug() << "OAIPetApiRequest::~OAIPetApiRequest()";
} }
QMap<QString, QString> QMap<QString, QString>
OAIPetApiRequest::getRequestHeaders() const { OAIPetApiRequest::getRequestHeaders() const {
return requestHeaders; return requestHeaders;
} }
@ -53,7 +53,7 @@ QHttpEngine::Socket* OAIPetApiRequest::getRawSocket(){
void OAIPetApiRequest::addPetRequest(){ void OAIPetApiRequest::addPetRequest(){
qDebug() << "/v2/pet"; qDebug() << "/v2/pet";
connect(this, &OAIPetApiRequest::addPet, handler, &OAIPetApiHandler::addPet); connect(this, &OAIPetApiRequest::addPet, handler, &OAIPetApiHandler::addPet);
QJsonDocument doc; QJsonDocument doc;
@ -63,14 +63,14 @@ void OAIPetApiRequest::addPetRequest(){
::OpenAPI::fromJsonValue(oai_pet, obj); ::OpenAPI::fromJsonValue(oai_pet, obj);
emit addPet( oai_pet); emit addPet(oai_pet);
} }
void OAIPetApiRequest::deletePetRequest(const QString& pet_idstr){ void OAIPetApiRequest::deletePetRequest(const QString& pet_idstr){
qDebug() << "/v2/pet/{petId}"; qDebug() << "/v2/pet/{petId}";
connect(this, &OAIPetApiRequest::deletePet, handler, &OAIPetApiHandler::deletePet); connect(this, &OAIPetApiRequest::deletePet, handler, &OAIPetApiHandler::deletePet);
qint64 pet_id; qint64 pet_id;
fromStringValue(pet_idstr, pet_id); fromStringValue(pet_idstr, pet_id);
@ -81,59 +81,59 @@ void OAIPetApiRequest::deletePetRequest(const QString& pet_idstr){
} }
emit deletePet( pet_id, api_key); emit deletePet(pet_id, api_key);
} }
void OAIPetApiRequest::findPetsByStatusRequest(){ void OAIPetApiRequest::findPetsByStatusRequest(){
qDebug() << "/v2/pet/findByStatus"; qDebug() << "/v2/pet/findByStatus";
connect(this, &OAIPetApiRequest::findPetsByStatus, handler, &OAIPetApiHandler::findPetsByStatus); connect(this, &OAIPetApiRequest::findPetsByStatus, handler, &OAIPetApiHandler::findPetsByStatus);
QList<QString> status;
QList<QString> status;
if(socket->queryString().keys().contains("status")){ if(socket->queryString().keys().contains("status")){
fromStringValue(socket->queryString().values("status"), status); fromStringValue(socket->queryString().values("status"), status);
} }
emit findPetsByStatus( status); emit findPetsByStatus(status);
} }
void OAIPetApiRequest::findPetsByTagsRequest(){ void OAIPetApiRequest::findPetsByTagsRequest(){
qDebug() << "/v2/pet/findByTags"; qDebug() << "/v2/pet/findByTags";
connect(this, &OAIPetApiRequest::findPetsByTags, handler, &OAIPetApiHandler::findPetsByTags); connect(this, &OAIPetApiRequest::findPetsByTags, handler, &OAIPetApiHandler::findPetsByTags);
QList<QString> tags;
QList<QString> tags;
if(socket->queryString().keys().contains("tags")){ if(socket->queryString().keys().contains("tags")){
fromStringValue(socket->queryString().values("tags"), tags); fromStringValue(socket->queryString().values("tags"), tags);
} }
emit findPetsByTags( tags); emit findPetsByTags(tags);
} }
void OAIPetApiRequest::getPetByIdRequest(const QString& pet_idstr){ void OAIPetApiRequest::getPetByIdRequest(const QString& pet_idstr){
qDebug() << "/v2/pet/{petId}"; qDebug() << "/v2/pet/{petId}";
connect(this, &OAIPetApiRequest::getPetById, handler, &OAIPetApiHandler::getPetById); connect(this, &OAIPetApiRequest::getPetById, handler, &OAIPetApiHandler::getPetById);
qint64 pet_id; qint64 pet_id;
fromStringValue(pet_idstr, pet_id); fromStringValue(pet_idstr, pet_id);
emit getPetById( pet_id); emit getPetById(pet_id);
} }
void OAIPetApiRequest::updatePetRequest(){ void OAIPetApiRequest::updatePetRequest(){
qDebug() << "/v2/pet"; qDebug() << "/v2/pet";
connect(this, &OAIPetApiRequest::updatePet, handler, &OAIPetApiHandler::updatePet); connect(this, &OAIPetApiRequest::updatePet, handler, &OAIPetApiHandler::updatePet);
QJsonDocument doc; QJsonDocument doc;
@ -143,14 +143,14 @@ void OAIPetApiRequest::updatePetRequest(){
::OpenAPI::fromJsonValue(oai_pet, obj); ::OpenAPI::fromJsonValue(oai_pet, obj);
emit updatePet( oai_pet); emit updatePet(oai_pet);
} }
void OAIPetApiRequest::updatePetWithFormRequest(const QString& pet_idstr){ void OAIPetApiRequest::updatePetWithFormRequest(const QString& pet_idstr){
qDebug() << "/v2/pet/{petId}"; qDebug() << "/v2/pet/{petId}";
connect(this, &OAIPetApiRequest::updatePetWithForm, handler, &OAIPetApiHandler::updatePetWithForm); connect(this, &OAIPetApiRequest::updatePetWithForm, handler, &OAIPetApiHandler::updatePetWithForm);
qint64 pet_id; qint64 pet_id;
fromStringValue(pet_idstr, pet_id); fromStringValue(pet_idstr, pet_id);
@ -158,14 +158,14 @@ void OAIPetApiRequest::updatePetWithFormRequest(const QString& pet_idstr){
QString name; QString name;
QString status; QString status;
emit updatePetWithForm( pet_id, name, status); emit updatePetWithForm(pet_id, name, status);
} }
void OAIPetApiRequest::uploadFileRequest(const QString& pet_idstr){ void OAIPetApiRequest::uploadFileRequest(const QString& pet_idstr){
qDebug() << "/v2/pet/{petId}/uploadImage"; qDebug() << "/v2/pet/{petId}/uploadImage";
connect(this, &OAIPetApiRequest::uploadFile, handler, &OAIPetApiHandler::uploadFile); connect(this, &OAIPetApiRequest::uploadFile, handler, &OAIPetApiHandler::uploadFile);
qint64 pet_id; qint64 pet_id;
fromStringValue(pet_idstr, pet_id); fromStringValue(pet_idstr, pet_id);
@ -173,13 +173,13 @@ void OAIPetApiRequest::uploadFileRequest(const QString& pet_idstr){
QString additional_metadata; QString additional_metadata;
QIODevice* file; QIODevice* file;
emit uploadFile( pet_id, additional_metadata, file); emit uploadFile(pet_id, additional_metadata, file);
} }
void OAIPetApiRequest::addPetResponse(){ void OAIPetApiRequest::addPetResponse(){
writeResponseHeaders(); writeResponseHeaders();
socket->setStatusCode(QHttpEngine::Socket::OK); socket->setStatusCode(QHttpEngine::Socket::OK);
if(socket->isOpen()){ if(socket->isOpen()){
socket->close(); socket->close();
@ -187,7 +187,7 @@ void OAIPetApiRequest::addPetResponse(){
} }
void OAIPetApiRequest::deletePetResponse(){ void OAIPetApiRequest::deletePetResponse(){
writeResponseHeaders(); writeResponseHeaders();
socket->setStatusCode(QHttpEngine::Socket::OK); socket->setStatusCode(QHttpEngine::Socket::OK);
if(socket->isOpen()){ if(socket->isOpen()){
socket->close(); socket->close();
@ -222,7 +222,7 @@ void OAIPetApiRequest::getPetByIdResponse(const OAIPet& res){
} }
void OAIPetApiRequest::updatePetResponse(){ void OAIPetApiRequest::updatePetResponse(){
writeResponseHeaders(); writeResponseHeaders();
socket->setStatusCode(QHttpEngine::Socket::OK); socket->setStatusCode(QHttpEngine::Socket::OK);
if(socket->isOpen()){ if(socket->isOpen()){
socket->close(); socket->close();
@ -230,7 +230,7 @@ void OAIPetApiRequest::updatePetResponse(){
} }
void OAIPetApiRequest::updatePetWithFormResponse(){ void OAIPetApiRequest::updatePetWithFormResponse(){
writeResponseHeaders(); writeResponseHeaders();
socket->setStatusCode(QHttpEngine::Socket::OK); socket->setStatusCode(QHttpEngine::Socket::OK);
if(socket->isOpen()){ if(socket->isOpen()){
socket->close(); socket->close();
@ -249,7 +249,7 @@ void OAIPetApiRequest::uploadFileResponse(const OAIApiResponse& res){
void OAIPetApiRequest::addPetError(QNetworkReply::NetworkError error_type, QString& error_str){ void OAIPetApiRequest::addPetError(QNetworkReply::NetworkError error_type, QString& error_str){
Q_UNUSED(error_type); // TODO: Remap error_type to QHttpEngine::Socket errors Q_UNUSED(error_type); // TODO: Remap error_type to QHttpEngine::Socket errors
writeResponseHeaders(); writeResponseHeaders();
socket->setStatusCode(QHttpEngine::Socket::NotFound); socket->setStatusCode(QHttpEngine::Socket::NotFound);
socket->write(error_str.toUtf8()); socket->write(error_str.toUtf8());
if(socket->isOpen()){ if(socket->isOpen()){
@ -259,7 +259,7 @@ void OAIPetApiRequest::addPetError(QNetworkReply::NetworkError error_type, QStri
void OAIPetApiRequest::deletePetError(QNetworkReply::NetworkError error_type, QString& error_str){ void OAIPetApiRequest::deletePetError(QNetworkReply::NetworkError error_type, QString& error_str){
Q_UNUSED(error_type); // TODO: Remap error_type to QHttpEngine::Socket errors Q_UNUSED(error_type); // TODO: Remap error_type to QHttpEngine::Socket errors
writeResponseHeaders(); writeResponseHeaders();
socket->setStatusCode(QHttpEngine::Socket::NotFound); socket->setStatusCode(QHttpEngine::Socket::NotFound);
socket->write(error_str.toUtf8()); socket->write(error_str.toUtf8());
if(socket->isOpen()){ if(socket->isOpen()){
@ -302,7 +302,7 @@ void OAIPetApiRequest::getPetByIdError(const OAIPet& res, QNetworkReply::Network
void OAIPetApiRequest::updatePetError(QNetworkReply::NetworkError error_type, QString& error_str){ void OAIPetApiRequest::updatePetError(QNetworkReply::NetworkError error_type, QString& error_str){
Q_UNUSED(error_type); // TODO: Remap error_type to QHttpEngine::Socket errors Q_UNUSED(error_type); // TODO: Remap error_type to QHttpEngine::Socket errors
writeResponseHeaders(); writeResponseHeaders();
socket->setStatusCode(QHttpEngine::Socket::NotFound); socket->setStatusCode(QHttpEngine::Socket::NotFound);
socket->write(error_str.toUtf8()); socket->write(error_str.toUtf8());
if(socket->isOpen()){ if(socket->isOpen()){
@ -312,7 +312,7 @@ void OAIPetApiRequest::updatePetError(QNetworkReply::NetworkError error_type, QS
void OAIPetApiRequest::updatePetWithFormError(QNetworkReply::NetworkError error_type, QString& error_str){ void OAIPetApiRequest::updatePetWithFormError(QNetworkReply::NetworkError error_type, QString& error_str){
Q_UNUSED(error_type); // TODO: Remap error_type to QHttpEngine::Socket errors Q_UNUSED(error_type); // TODO: Remap error_type to QHttpEngine::Socket errors
writeResponseHeaders(); writeResponseHeaders();
socket->setStatusCode(QHttpEngine::Socket::NotFound); socket->setStatusCode(QHttpEngine::Socket::NotFound);
socket->write(error_str.toUtf8()); socket->write(error_str.toUtf8());
if(socket->isOpen()){ if(socket->isOpen()){
@ -336,7 +336,7 @@ void OAIPetApiRequest::sendCustomResponse(QByteArray & res, QNetworkReply::Netwo
Q_UNUSED(res); // TODO Q_UNUSED(res); // TODO
Q_UNUSED(error_type); // TODO Q_UNUSED(error_type); // TODO
} }
void OAIPetApiRequest::sendCustomResponse(QIODevice *res, QNetworkReply::NetworkError error_type){ void OAIPetApiRequest::sendCustomResponse(QIODevice *res, QNetworkReply::NetworkError error_type){
Q_UNUSED(res); // TODO Q_UNUSED(res); // TODO
Q_UNUSED(error_type); // TODO Q_UNUSED(error_type); // TODO

View File

@ -31,7 +31,7 @@ namespace OpenAPI {
class OAIPetApiRequest : public QObject class OAIPetApiRequest : public QObject
{ {
Q_OBJECT Q_OBJECT
public: public:
OAIPetApiRequest(QHttpEngine::Socket *s, OAIPetApiHandler* handler); OAIPetApiRequest(QHttpEngine::Socket *s, OAIPetApiHandler* handler);
virtual ~OAIPetApiRequest(); virtual ~OAIPetApiRequest();
@ -99,7 +99,7 @@ private:
resHeaders.insert(itr.key().toUtf8(), itr.value().toUtf8()); resHeaders.insert(itr.key().toUtf8(), itr.value().toUtf8());
} }
socket->setHeaders(resHeaders); socket->setHeaders(resHeaders);
socket->writeHeaders(); socket->writeHeaders();
} }
}; };

View File

@ -25,7 +25,7 @@ OAIStoreApiRequest::OAIStoreApiRequest(QHttpEngine::Socket *s, OAIStoreApiHandle
auto headers = s->headers(); auto headers = s->headers();
for(auto itr = headers.begin(); itr != headers.end(); itr++) { for(auto itr = headers.begin(); itr != headers.end(); itr++) {
requestHeaders.insert(QString(itr.key()), QString(itr.value())); requestHeaders.insert(QString(itr.key()), QString(itr.value()));
} }
} }
OAIStoreApiRequest::~OAIStoreApiRequest(){ OAIStoreApiRequest::~OAIStoreApiRequest(){
@ -33,7 +33,7 @@ OAIStoreApiRequest::~OAIStoreApiRequest(){
qDebug() << "OAIStoreApiRequest::~OAIStoreApiRequest()"; qDebug() << "OAIStoreApiRequest::~OAIStoreApiRequest()";
} }
QMap<QString, QString> QMap<QString, QString>
OAIStoreApiRequest::getRequestHeaders() const { OAIStoreApiRequest::getRequestHeaders() const {
return requestHeaders; return requestHeaders;
} }
@ -53,20 +53,20 @@ QHttpEngine::Socket* OAIStoreApiRequest::getRawSocket(){
void OAIStoreApiRequest::deleteOrderRequest(const QString& order_idstr){ void OAIStoreApiRequest::deleteOrderRequest(const QString& order_idstr){
qDebug() << "/v2/store/order/{orderId}"; qDebug() << "/v2/store/order/{orderId}";
connect(this, &OAIStoreApiRequest::deleteOrder, handler, &OAIStoreApiHandler::deleteOrder); connect(this, &OAIStoreApiRequest::deleteOrder, handler, &OAIStoreApiHandler::deleteOrder);
QString order_id; QString order_id;
fromStringValue(order_idstr, order_id); fromStringValue(order_idstr, order_id);
emit deleteOrder( order_id); emit deleteOrder(order_id);
} }
void OAIStoreApiRequest::getInventoryRequest(){ void OAIStoreApiRequest::getInventoryRequest(){
qDebug() << "/v2/store/inventory"; qDebug() << "/v2/store/inventory";
connect(this, &OAIStoreApiRequest::getInventory, handler, &OAIStoreApiHandler::getInventory); connect(this, &OAIStoreApiRequest::getInventory, handler, &OAIStoreApiHandler::getInventory);
@ -77,20 +77,20 @@ void OAIStoreApiRequest::getInventoryRequest(){
void OAIStoreApiRequest::getOrderByIdRequest(const QString& order_idstr){ void OAIStoreApiRequest::getOrderByIdRequest(const QString& order_idstr){
qDebug() << "/v2/store/order/{orderId}"; qDebug() << "/v2/store/order/{orderId}";
connect(this, &OAIStoreApiRequest::getOrderById, handler, &OAIStoreApiHandler::getOrderById); connect(this, &OAIStoreApiRequest::getOrderById, handler, &OAIStoreApiHandler::getOrderById);
qint64 order_id; qint64 order_id;
fromStringValue(order_idstr, order_id); fromStringValue(order_idstr, order_id);
emit getOrderById( order_id); emit getOrderById(order_id);
} }
void OAIStoreApiRequest::placeOrderRequest(){ void OAIStoreApiRequest::placeOrderRequest(){
qDebug() << "/v2/store/order"; qDebug() << "/v2/store/order";
connect(this, &OAIStoreApiRequest::placeOrder, handler, &OAIStoreApiHandler::placeOrder); connect(this, &OAIStoreApiRequest::placeOrder, handler, &OAIStoreApiHandler::placeOrder);
QJsonDocument doc; QJsonDocument doc;
@ -100,13 +100,13 @@ void OAIStoreApiRequest::placeOrderRequest(){
::OpenAPI::fromJsonValue(oai_order, obj); ::OpenAPI::fromJsonValue(oai_order, obj);
emit placeOrder( oai_order); emit placeOrder(oai_order);
} }
void OAIStoreApiRequest::deleteOrderResponse(){ void OAIStoreApiRequest::deleteOrderResponse(){
writeResponseHeaders(); writeResponseHeaders();
socket->setStatusCode(QHttpEngine::Socket::OK); socket->setStatusCode(QHttpEngine::Socket::OK);
if(socket->isOpen()){ if(socket->isOpen()){
socket->close(); socket->close();
@ -143,7 +143,7 @@ void OAIStoreApiRequest::placeOrderResponse(const OAIOrder& res){
void OAIStoreApiRequest::deleteOrderError(QNetworkReply::NetworkError error_type, QString& error_str){ void OAIStoreApiRequest::deleteOrderError(QNetworkReply::NetworkError error_type, QString& error_str){
Q_UNUSED(error_type); // TODO: Remap error_type to QHttpEngine::Socket errors Q_UNUSED(error_type); // TODO: Remap error_type to QHttpEngine::Socket errors
writeResponseHeaders(); writeResponseHeaders();
socket->setStatusCode(QHttpEngine::Socket::NotFound); socket->setStatusCode(QHttpEngine::Socket::NotFound);
socket->write(error_str.toUtf8()); socket->write(error_str.toUtf8());
if(socket->isOpen()){ if(socket->isOpen()){
@ -189,7 +189,7 @@ void OAIStoreApiRequest::sendCustomResponse(QByteArray & res, QNetworkReply::Net
Q_UNUSED(res); // TODO Q_UNUSED(res); // TODO
Q_UNUSED(error_type); // TODO Q_UNUSED(error_type); // TODO
} }
void OAIStoreApiRequest::sendCustomResponse(QIODevice *res, QNetworkReply::NetworkError error_type){ void OAIStoreApiRequest::sendCustomResponse(QIODevice *res, QNetworkReply::NetworkError error_type){
Q_UNUSED(res); // TODO Q_UNUSED(res); // TODO
Q_UNUSED(error_type); // TODO Q_UNUSED(error_type); // TODO

View File

@ -30,7 +30,7 @@ namespace OpenAPI {
class OAIStoreApiRequest : public QObject class OAIStoreApiRequest : public QObject
{ {
Q_OBJECT Q_OBJECT
public: public:
OAIStoreApiRequest(QHttpEngine::Socket *s, OAIStoreApiHandler* handler); OAIStoreApiRequest(QHttpEngine::Socket *s, OAIStoreApiHandler* handler);
virtual ~OAIStoreApiRequest(); virtual ~OAIStoreApiRequest();
@ -82,7 +82,7 @@ private:
resHeaders.insert(itr.key().toUtf8(), itr.value().toUtf8()); resHeaders.insert(itr.key().toUtf8(), itr.value().toUtf8());
} }
socket->setHeaders(resHeaders); socket->setHeaders(resHeaders);
socket->writeHeaders(); socket->writeHeaders();
} }
}; };

View File

@ -25,7 +25,7 @@ OAIUserApiRequest::OAIUserApiRequest(QHttpEngine::Socket *s, OAIUserApiHandler*
auto headers = s->headers(); auto headers = s->headers();
for(auto itr = headers.begin(); itr != headers.end(); itr++) { for(auto itr = headers.begin(); itr != headers.end(); itr++) {
requestHeaders.insert(QString(itr.key()), QString(itr.value())); requestHeaders.insert(QString(itr.key()), QString(itr.value()));
} }
} }
OAIUserApiRequest::~OAIUserApiRequest(){ OAIUserApiRequest::~OAIUserApiRequest(){
@ -33,7 +33,7 @@ OAIUserApiRequest::~OAIUserApiRequest(){
qDebug() << "OAIUserApiRequest::~OAIUserApiRequest()"; qDebug() << "OAIUserApiRequest::~OAIUserApiRequest()";
} }
QMap<QString, QString> QMap<QString, QString>
OAIUserApiRequest::getRequestHeaders() const { OAIUserApiRequest::getRequestHeaders() const {
return requestHeaders; return requestHeaders;
} }
@ -53,7 +53,7 @@ QHttpEngine::Socket* OAIUserApiRequest::getRawSocket(){
void OAIUserApiRequest::createUserRequest(){ void OAIUserApiRequest::createUserRequest(){
qDebug() << "/v2/user"; qDebug() << "/v2/user";
connect(this, &OAIUserApiRequest::createUser, handler, &OAIUserApiHandler::createUser); connect(this, &OAIUserApiRequest::createUser, handler, &OAIUserApiHandler::createUser);
QJsonDocument doc; QJsonDocument doc;
@ -63,18 +63,18 @@ void OAIUserApiRequest::createUserRequest(){
::OpenAPI::fromJsonValue(oai_user, obj); ::OpenAPI::fromJsonValue(oai_user, obj);
emit createUser( oai_user); emit createUser(oai_user);
} }
void OAIUserApiRequest::createUsersWithArrayInputRequest(){ void OAIUserApiRequest::createUsersWithArrayInputRequest(){
qDebug() << "/v2/user/createWithArray"; qDebug() << "/v2/user/createWithArray";
connect(this, &OAIUserApiRequest::createUsersWithArrayInput, handler, &OAIUserApiHandler::createUsersWithArrayInput); connect(this, &OAIUserApiRequest::createUsersWithArrayInput, handler, &OAIUserApiHandler::createUsersWithArrayInput);
QJsonDocument doc; QJsonDocument doc;
QList<OAIUser> oai_user; QList<OAIUser> oai_user;
if(socket->readJson(doc)){ if(socket->readJson(doc)){
QJsonArray jsonArray = doc.array(); QJsonArray jsonArray = doc.array();
foreach(QJsonValue obj, jsonArray) { foreach(QJsonValue obj, jsonArray) {
@ -85,18 +85,18 @@ void OAIUserApiRequest::createUsersWithArrayInputRequest(){
} }
emit createUsersWithArrayInput( oai_user); emit createUsersWithArrayInput(oai_user);
} }
void OAIUserApiRequest::createUsersWithListInputRequest(){ void OAIUserApiRequest::createUsersWithListInputRequest(){
qDebug() << "/v2/user/createWithList"; qDebug() << "/v2/user/createWithList";
connect(this, &OAIUserApiRequest::createUsersWithListInput, handler, &OAIUserApiHandler::createUsersWithListInput); connect(this, &OAIUserApiRequest::createUsersWithListInput, handler, &OAIUserApiHandler::createUsersWithListInput);
QJsonDocument doc; QJsonDocument doc;
QList<OAIUser> oai_user; QList<OAIUser> oai_user;
if(socket->readJson(doc)){ if(socket->readJson(doc)){
QJsonArray jsonArray = doc.array(); QJsonArray jsonArray = doc.array();
foreach(QJsonValue obj, jsonArray) { foreach(QJsonValue obj, jsonArray) {
@ -107,61 +107,61 @@ void OAIUserApiRequest::createUsersWithListInputRequest(){
} }
emit createUsersWithListInput( oai_user); emit createUsersWithListInput(oai_user);
} }
void OAIUserApiRequest::deleteUserRequest(const QString& usernamestr){ void OAIUserApiRequest::deleteUserRequest(const QString& usernamestr){
qDebug() << "/v2/user/{username}"; qDebug() << "/v2/user/{username}";
connect(this, &OAIUserApiRequest::deleteUser, handler, &OAIUserApiHandler::deleteUser); connect(this, &OAIUserApiRequest::deleteUser, handler, &OAIUserApiHandler::deleteUser);
QString username; QString username;
fromStringValue(usernamestr, username); fromStringValue(usernamestr, username);
emit deleteUser( username); emit deleteUser(username);
} }
void OAIUserApiRequest::getUserByNameRequest(const QString& usernamestr){ void OAIUserApiRequest::getUserByNameRequest(const QString& usernamestr){
qDebug() << "/v2/user/{username}"; qDebug() << "/v2/user/{username}";
connect(this, &OAIUserApiRequest::getUserByName, handler, &OAIUserApiHandler::getUserByName); connect(this, &OAIUserApiRequest::getUserByName, handler, &OAIUserApiHandler::getUserByName);
QString username; QString username;
fromStringValue(usernamestr, username); fromStringValue(usernamestr, username);
emit getUserByName( username); emit getUserByName(username);
} }
void OAIUserApiRequest::loginUserRequest(){ void OAIUserApiRequest::loginUserRequest(){
qDebug() << "/v2/user/login"; qDebug() << "/v2/user/login";
connect(this, &OAIUserApiRequest::loginUser, handler, &OAIUserApiHandler::loginUser); connect(this, &OAIUserApiRequest::loginUser, handler, &OAIUserApiHandler::loginUser);
QString username;
QString username;
if(socket->queryString().keys().contains("username")){ if(socket->queryString().keys().contains("username")){
fromStringValue(socket->queryString().value("username"), username); fromStringValue(socket->queryString().value("username"), username);
} }
QString password; QString password;
if(socket->queryString().keys().contains("password")){ if(socket->queryString().keys().contains("password")){
fromStringValue(socket->queryString().value("password"), password); fromStringValue(socket->queryString().value("password"), password);
} }
emit loginUser( username, password); emit loginUser(username, password);
} }
void OAIUserApiRequest::logoutUserRequest(){ void OAIUserApiRequest::logoutUserRequest(){
qDebug() << "/v2/user/logout"; qDebug() << "/v2/user/logout";
connect(this, &OAIUserApiRequest::logoutUser, handler, &OAIUserApiHandler::logoutUser); connect(this, &OAIUserApiRequest::logoutUser, handler, &OAIUserApiHandler::logoutUser);
@ -172,7 +172,7 @@ void OAIUserApiRequest::logoutUserRequest(){
void OAIUserApiRequest::updateUserRequest(const QString& usernamestr){ void OAIUserApiRequest::updateUserRequest(const QString& usernamestr){
qDebug() << "/v2/user/{username}"; qDebug() << "/v2/user/{username}";
connect(this, &OAIUserApiRequest::updateUser, handler, &OAIUserApiHandler::updateUser); connect(this, &OAIUserApiRequest::updateUser, handler, &OAIUserApiHandler::updateUser);
QString username; QString username;
fromStringValue(usernamestr, username); fromStringValue(usernamestr, username);
@ -184,13 +184,13 @@ void OAIUserApiRequest::updateUserRequest(const QString& usernamestr){
::OpenAPI::fromJsonValue(oai_user, obj); ::OpenAPI::fromJsonValue(oai_user, obj);
emit updateUser( username, oai_user); emit updateUser(username, oai_user);
} }
void OAIUserApiRequest::createUserResponse(){ void OAIUserApiRequest::createUserResponse(){
writeResponseHeaders(); writeResponseHeaders();
socket->setStatusCode(QHttpEngine::Socket::OK); socket->setStatusCode(QHttpEngine::Socket::OK);
if(socket->isOpen()){ if(socket->isOpen()){
socket->close(); socket->close();
@ -198,7 +198,7 @@ void OAIUserApiRequest::createUserResponse(){
} }
void OAIUserApiRequest::createUsersWithArrayInputResponse(){ void OAIUserApiRequest::createUsersWithArrayInputResponse(){
writeResponseHeaders(); writeResponseHeaders();
socket->setStatusCode(QHttpEngine::Socket::OK); socket->setStatusCode(QHttpEngine::Socket::OK);
if(socket->isOpen()){ if(socket->isOpen()){
socket->close(); socket->close();
@ -206,7 +206,7 @@ void OAIUserApiRequest::createUsersWithArrayInputResponse(){
} }
void OAIUserApiRequest::createUsersWithListInputResponse(){ void OAIUserApiRequest::createUsersWithListInputResponse(){
writeResponseHeaders(); writeResponseHeaders();
socket->setStatusCode(QHttpEngine::Socket::OK); socket->setStatusCode(QHttpEngine::Socket::OK);
if(socket->isOpen()){ if(socket->isOpen()){
socket->close(); socket->close();
@ -214,7 +214,7 @@ void OAIUserApiRequest::createUsersWithListInputResponse(){
} }
void OAIUserApiRequest::deleteUserResponse(){ void OAIUserApiRequest::deleteUserResponse(){
writeResponseHeaders(); writeResponseHeaders();
socket->setStatusCode(QHttpEngine::Socket::OK); socket->setStatusCode(QHttpEngine::Socket::OK);
if(socket->isOpen()){ if(socket->isOpen()){
socket->close(); socket->close();
@ -232,15 +232,14 @@ void OAIUserApiRequest::getUserByNameResponse(const OAIUser& res){
void OAIUserApiRequest::loginUserResponse(const QString& res){ void OAIUserApiRequest::loginUserResponse(const QString& res){
writeResponseHeaders(); writeResponseHeaders();
QJsonDocument resDoc(::OpenAPI::toJsonValue(res).toObject()); socket->write(::OpenAPI::toStringValue(res).toUtf8());
socket->writeJson(resDoc);
if(socket->isOpen()){ if(socket->isOpen()){
socket->close(); socket->close();
} }
} }
void OAIUserApiRequest::logoutUserResponse(){ void OAIUserApiRequest::logoutUserResponse(){
writeResponseHeaders(); writeResponseHeaders();
socket->setStatusCode(QHttpEngine::Socket::OK); socket->setStatusCode(QHttpEngine::Socket::OK);
if(socket->isOpen()){ if(socket->isOpen()){
socket->close(); socket->close();
@ -248,7 +247,7 @@ void OAIUserApiRequest::logoutUserResponse(){
} }
void OAIUserApiRequest::updateUserResponse(){ void OAIUserApiRequest::updateUserResponse(){
writeResponseHeaders(); writeResponseHeaders();
socket->setStatusCode(QHttpEngine::Socket::OK); socket->setStatusCode(QHttpEngine::Socket::OK);
if(socket->isOpen()){ if(socket->isOpen()){
socket->close(); socket->close();
@ -258,7 +257,7 @@ void OAIUserApiRequest::updateUserResponse(){
void OAIUserApiRequest::createUserError(QNetworkReply::NetworkError error_type, QString& error_str){ void OAIUserApiRequest::createUserError(QNetworkReply::NetworkError error_type, QString& error_str){
Q_UNUSED(error_type); // TODO: Remap error_type to QHttpEngine::Socket errors Q_UNUSED(error_type); // TODO: Remap error_type to QHttpEngine::Socket errors
writeResponseHeaders(); writeResponseHeaders();
socket->setStatusCode(QHttpEngine::Socket::NotFound); socket->setStatusCode(QHttpEngine::Socket::NotFound);
socket->write(error_str.toUtf8()); socket->write(error_str.toUtf8());
if(socket->isOpen()){ if(socket->isOpen()){
@ -268,7 +267,7 @@ void OAIUserApiRequest::createUserError(QNetworkReply::NetworkError error_type,
void OAIUserApiRequest::createUsersWithArrayInputError(QNetworkReply::NetworkError error_type, QString& error_str){ void OAIUserApiRequest::createUsersWithArrayInputError(QNetworkReply::NetworkError error_type, QString& error_str){
Q_UNUSED(error_type); // TODO: Remap error_type to QHttpEngine::Socket errors Q_UNUSED(error_type); // TODO: Remap error_type to QHttpEngine::Socket errors
writeResponseHeaders(); writeResponseHeaders();
socket->setStatusCode(QHttpEngine::Socket::NotFound); socket->setStatusCode(QHttpEngine::Socket::NotFound);
socket->write(error_str.toUtf8()); socket->write(error_str.toUtf8());
if(socket->isOpen()){ if(socket->isOpen()){
@ -278,7 +277,7 @@ void OAIUserApiRequest::createUsersWithArrayInputError(QNetworkReply::NetworkErr
void OAIUserApiRequest::createUsersWithListInputError(QNetworkReply::NetworkError error_type, QString& error_str){ void OAIUserApiRequest::createUsersWithListInputError(QNetworkReply::NetworkError error_type, QString& error_str){
Q_UNUSED(error_type); // TODO: Remap error_type to QHttpEngine::Socket errors Q_UNUSED(error_type); // TODO: Remap error_type to QHttpEngine::Socket errors
writeResponseHeaders(); writeResponseHeaders();
socket->setStatusCode(QHttpEngine::Socket::NotFound); socket->setStatusCode(QHttpEngine::Socket::NotFound);
socket->write(error_str.toUtf8()); socket->write(error_str.toUtf8());
if(socket->isOpen()){ if(socket->isOpen()){
@ -288,7 +287,7 @@ void OAIUserApiRequest::createUsersWithListInputError(QNetworkReply::NetworkErro
void OAIUserApiRequest::deleteUserError(QNetworkReply::NetworkError error_type, QString& error_str){ void OAIUserApiRequest::deleteUserError(QNetworkReply::NetworkError error_type, QString& error_str){
Q_UNUSED(error_type); // TODO: Remap error_type to QHttpEngine::Socket errors Q_UNUSED(error_type); // TODO: Remap error_type to QHttpEngine::Socket errors
writeResponseHeaders(); writeResponseHeaders();
socket->setStatusCode(QHttpEngine::Socket::NotFound); socket->setStatusCode(QHttpEngine::Socket::NotFound);
socket->write(error_str.toUtf8()); socket->write(error_str.toUtf8());
if(socket->isOpen()){ if(socket->isOpen()){
@ -311,8 +310,7 @@ void OAIUserApiRequest::loginUserError(const QString& res, QNetworkReply::Networ
Q_UNUSED(error_type); // TODO: Remap error_type to QHttpEngine::Socket errors Q_UNUSED(error_type); // TODO: Remap error_type to QHttpEngine::Socket errors
writeResponseHeaders(); writeResponseHeaders();
Q_UNUSED(error_str); // response will be used instead of error string Q_UNUSED(error_str); // response will be used instead of error string
QJsonDocument resDoc(::OpenAPI::toJsonValue(res).toObject()); socket->write(::OpenAPI::toStringValue(res).toUtf8());
socket->writeJson(resDoc);
if(socket->isOpen()){ if(socket->isOpen()){
socket->close(); socket->close();
} }
@ -320,7 +318,7 @@ void OAIUserApiRequest::loginUserError(const QString& res, QNetworkReply::Networ
void OAIUserApiRequest::logoutUserError(QNetworkReply::NetworkError error_type, QString& error_str){ void OAIUserApiRequest::logoutUserError(QNetworkReply::NetworkError error_type, QString& error_str){
Q_UNUSED(error_type); // TODO: Remap error_type to QHttpEngine::Socket errors Q_UNUSED(error_type); // TODO: Remap error_type to QHttpEngine::Socket errors
writeResponseHeaders(); writeResponseHeaders();
socket->setStatusCode(QHttpEngine::Socket::NotFound); socket->setStatusCode(QHttpEngine::Socket::NotFound);
socket->write(error_str.toUtf8()); socket->write(error_str.toUtf8());
if(socket->isOpen()){ if(socket->isOpen()){
@ -330,7 +328,7 @@ void OAIUserApiRequest::logoutUserError(QNetworkReply::NetworkError error_type,
void OAIUserApiRequest::updateUserError(QNetworkReply::NetworkError error_type, QString& error_str){ void OAIUserApiRequest::updateUserError(QNetworkReply::NetworkError error_type, QString& error_str){
Q_UNUSED(error_type); // TODO: Remap error_type to QHttpEngine::Socket errors Q_UNUSED(error_type); // TODO: Remap error_type to QHttpEngine::Socket errors
writeResponseHeaders(); writeResponseHeaders();
socket->setStatusCode(QHttpEngine::Socket::NotFound); socket->setStatusCode(QHttpEngine::Socket::NotFound);
socket->write(error_str.toUtf8()); socket->write(error_str.toUtf8());
if(socket->isOpen()){ if(socket->isOpen()){
@ -343,7 +341,7 @@ void OAIUserApiRequest::sendCustomResponse(QByteArray & res, QNetworkReply::Netw
Q_UNUSED(res); // TODO Q_UNUSED(res); // TODO
Q_UNUSED(error_type); // TODO Q_UNUSED(error_type); // TODO
} }
void OAIUserApiRequest::sendCustomResponse(QIODevice *res, QNetworkReply::NetworkError error_type){ void OAIUserApiRequest::sendCustomResponse(QIODevice *res, QNetworkReply::NetworkError error_type){
Q_UNUSED(res); // TODO Q_UNUSED(res); // TODO
Q_UNUSED(error_type); // TODO Q_UNUSED(error_type); // TODO

View File

@ -30,7 +30,7 @@ namespace OpenAPI {
class OAIUserApiRequest : public QObject class OAIUserApiRequest : public QObject
{ {
Q_OBJECT Q_OBJECT
public: public:
OAIUserApiRequest(QHttpEngine::Socket *s, OAIUserApiHandler* handler); OAIUserApiRequest(QHttpEngine::Socket *s, OAIUserApiHandler* handler);
virtual ~OAIUserApiRequest(); virtual ~OAIUserApiRequest();
@ -98,7 +98,7 @@ private:
resHeaders.insert(itr.key().toUtf8(), itr.value().toUtf8()); resHeaders.insert(itr.key().toUtf8(), itr.value().toUtf8());
} }
socket->setHeaders(resHeaders); socket->setHeaders(resHeaders);
socket->writeHeaders(); socket->writeHeaders();
} }
}; };