Skip to content

Commit 40a329f

Browse files
authored
[BUG] [Server: C++] [Qt5] Fix missing headers and wrong status code (#6345)
Change helper method '''writeResponseHeaders''' implementation to just set the headers, instead of write them, and also rename the method to '''setSocketResponseHeaders''', to maintain the new semantic. The implementation of '''QHttpEngine::Socket::write''' or '''QHttpEngine::Socket::writeJson''' implementations will call '''Socket::writeData''' that writes the Headers and Status Code before write the content if they are not already written. If these methods are not called (e.g.: empty reply), we could set the headers just before close the socket.
1 parent 5fe34fb commit 40a329f

File tree

8 files changed

+59
-51
lines changed

8 files changed

+59
-51
lines changed

modules/openapi-generator/src/main/resources/cpp-qt5-qhttpengine-server/apirequest.cpp.mustache

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -114,14 +114,15 @@ void {{classname}}Request::{{nickname}}Request({{#hasPathParams}}{{#pathParams}}
114114
{{/operation}}{{/operations}}
115115

116116
{{#operations}}{{#operation}}void {{classname}}Request::{{nickname}}Response({{#returnType}}const {{{returnType}}}& res{{/returnType}}){
117-
writeResponseHeaders();{{#returnType}}{{#isMapContainer}}
117+
setSocketResponseHeaders();{{#returnType}}{{#isMapContainer}}
118118
QJsonDocument resDoc(::{{cppNamespace}}::toJsonValue(res).toObject());
119119
socket->writeJson(resDoc);{{/isMapContainer}}{{^isMapContainer}}{{^returnTypeIsPrimitive}}{{^vendorExtensions.x-returns-enum}}
120120
QJsonDocument resDoc(::{{cppNamespace}}::toJsonValue(res).to{{^isListContainer}}Object{{/isListContainer}}{{#isListContainer}}Array{{/isListContainer}}());
121121
socket->writeJson(resDoc);{{/vendorExtensions.x-returns-enum}}{{#vendorExtensions.x-returns-enum}}
122122
socket->write(::{{cppNamespace}}::toStringValue(res).toUtf8());{{/vendorExtensions.x-returns-enum}}{{/returnTypeIsPrimitive}}{{#returnTypeIsPrimitive}}
123123
socket->write({{#isListContainer}}QString("["+{{/isListContainer}}::{{cppNamespace}}::toStringValue(res){{#isListContainer}}+"]"){{/isListContainer}}.toUtf8());{{/returnTypeIsPrimitive}}{{/isMapContainer}}{{/returnType}}{{^returnType}}
124-
socket->setStatusCode(QHttpEngine::Socket::OK);{{/returnType}}
124+
socket->setStatusCode(QHttpEngine::Socket::OK);
125+
socket->writeHeaders();{{/returnType}}
125126
if(socket->isOpen()){
126127
socket->close();
127128
}
@@ -130,7 +131,7 @@ void {{classname}}Request::{{nickname}}Request({{#hasPathParams}}{{#pathParams}}
130131
{{/operation}}{{/operations}}
131132
{{#operations}}{{#operation}}void {{classname}}Request::{{nickname}}Error({{#returnType}}const {{{returnType}}}& res, {{/returnType}}QNetworkReply::NetworkError error_type, QString& error_str){
132133
Q_UNUSED(error_type); // TODO: Remap error_type to QHttpEngine::Socket errors
133-
writeResponseHeaders();{{#returnType}}
134+
setSocketResponseHeaders();{{#returnType}}
134135
Q_UNUSED(error_str); // response will be used instead of error string{{#isMapContainer}}
135136
QJsonDocument resDoc(::{{cppNamespace}}::toJsonValue(res).toObject());
136137
socket->writeJson(resDoc);{{/isMapContainer}}{{^isMapContainer}}{{^returnTypeIsPrimitive}}{{^vendorExtensions.x-returns-enum}}

modules/openapi-generator/src/main/resources/cpp-qt5-qhttpengine-server/apirequest.h.mustache

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,13 +54,12 @@ private:
5454
QHttpEngine::Socket *socket;
5555
QSharedPointer<{{classname}}Handler> handler;
5656

57-
inline void writeResponseHeaders(){
57+
inline void setSocketResponseHeaders(){
5858
QHttpEngine::Socket::HeaderMap resHeaders;
5959
for(auto itr = responseHeaders.begin(); itr != responseHeaders.end(); ++itr) {
6060
resHeaders.insert(itr.key().toUtf8(), itr.value().toUtf8());
6161
}
6262
socket->setHeaders(resHeaders);
63-
socket->writeHeaders();
6463
}
6564
};
6665

samples/server/petstore/cpp-qt5-qhttpengine-server/server/src/requests/OAIPetApiRequest.cpp

Lines changed: 20 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -180,23 +180,25 @@ void OAIPetApiRequest::uploadFileRequest(const QString& pet_idstr){
180180

181181

182182
void OAIPetApiRequest::addPetResponse(){
183-
writeResponseHeaders();
183+
setSocketResponseHeaders();
184184
socket->setStatusCode(QHttpEngine::Socket::OK);
185+
socket->writeHeaders();
185186
if(socket->isOpen()){
186187
socket->close();
187188
}
188189
}
189190

190191
void OAIPetApiRequest::deletePetResponse(){
191-
writeResponseHeaders();
192+
setSocketResponseHeaders();
192193
socket->setStatusCode(QHttpEngine::Socket::OK);
194+
socket->writeHeaders();
193195
if(socket->isOpen()){
194196
socket->close();
195197
}
196198
}
197199

198200
void OAIPetApiRequest::findPetsByStatusResponse(const QList<OAIPet>& res){
199-
writeResponseHeaders();
201+
setSocketResponseHeaders();
200202
QJsonDocument resDoc(::OpenAPI::toJsonValue(res).toArray());
201203
socket->writeJson(resDoc);
202204
if(socket->isOpen()){
@@ -205,7 +207,7 @@ void OAIPetApiRequest::findPetsByStatusResponse(const QList<OAIPet>& res){
205207
}
206208

207209
void OAIPetApiRequest::findPetsByTagsResponse(const QList<OAIPet>& res){
208-
writeResponseHeaders();
210+
setSocketResponseHeaders();
209211
QJsonDocument resDoc(::OpenAPI::toJsonValue(res).toArray());
210212
socket->writeJson(resDoc);
211213
if(socket->isOpen()){
@@ -214,7 +216,7 @@ void OAIPetApiRequest::findPetsByTagsResponse(const QList<OAIPet>& res){
214216
}
215217

216218
void OAIPetApiRequest::getPetByIdResponse(const OAIPet& res){
217-
writeResponseHeaders();
219+
setSocketResponseHeaders();
218220
QJsonDocument resDoc(::OpenAPI::toJsonValue(res).toObject());
219221
socket->writeJson(resDoc);
220222
if(socket->isOpen()){
@@ -223,23 +225,25 @@ void OAIPetApiRequest::getPetByIdResponse(const OAIPet& res){
223225
}
224226

225227
void OAIPetApiRequest::updatePetResponse(){
226-
writeResponseHeaders();
228+
setSocketResponseHeaders();
227229
socket->setStatusCode(QHttpEngine::Socket::OK);
230+
socket->writeHeaders();
228231
if(socket->isOpen()){
229232
socket->close();
230233
}
231234
}
232235

233236
void OAIPetApiRequest::updatePetWithFormResponse(){
234-
writeResponseHeaders();
237+
setSocketResponseHeaders();
235238
socket->setStatusCode(QHttpEngine::Socket::OK);
239+
socket->writeHeaders();
236240
if(socket->isOpen()){
237241
socket->close();
238242
}
239243
}
240244

241245
void OAIPetApiRequest::uploadFileResponse(const OAIApiResponse& res){
242-
writeResponseHeaders();
246+
setSocketResponseHeaders();
243247
QJsonDocument resDoc(::OpenAPI::toJsonValue(res).toObject());
244248
socket->writeJson(resDoc);
245249
if(socket->isOpen()){
@@ -250,7 +254,7 @@ void OAIPetApiRequest::uploadFileResponse(const OAIApiResponse& res){
250254

251255
void OAIPetApiRequest::addPetError(QNetworkReply::NetworkError error_type, QString& error_str){
252256
Q_UNUSED(error_type); // TODO: Remap error_type to QHttpEngine::Socket errors
253-
writeResponseHeaders();
257+
setSocketResponseHeaders();
254258
socket->setStatusCode(QHttpEngine::Socket::NotFound);
255259
socket->write(error_str.toUtf8());
256260
if(socket->isOpen()){
@@ -260,7 +264,7 @@ void OAIPetApiRequest::addPetError(QNetworkReply::NetworkError error_type, QStri
260264

261265
void OAIPetApiRequest::deletePetError(QNetworkReply::NetworkError error_type, QString& error_str){
262266
Q_UNUSED(error_type); // TODO: Remap error_type to QHttpEngine::Socket errors
263-
writeResponseHeaders();
267+
setSocketResponseHeaders();
264268
socket->setStatusCode(QHttpEngine::Socket::NotFound);
265269
socket->write(error_str.toUtf8());
266270
if(socket->isOpen()){
@@ -270,7 +274,7 @@ void OAIPetApiRequest::deletePetError(QNetworkReply::NetworkError error_type, QS
270274

271275
void OAIPetApiRequest::findPetsByStatusError(const QList<OAIPet>& res, QNetworkReply::NetworkError error_type, QString& error_str){
272276
Q_UNUSED(error_type); // TODO: Remap error_type to QHttpEngine::Socket errors
273-
writeResponseHeaders();
277+
setSocketResponseHeaders();
274278
Q_UNUSED(error_str); // response will be used instead of error string
275279
QJsonDocument resDoc(::OpenAPI::toJsonValue(res).toArray());
276280
socket->writeJson(resDoc);
@@ -281,7 +285,7 @@ void OAIPetApiRequest::findPetsByStatusError(const QList<OAIPet>& res, QNetworkR
281285

282286
void OAIPetApiRequest::findPetsByTagsError(const QList<OAIPet>& res, QNetworkReply::NetworkError error_type, QString& error_str){
283287
Q_UNUSED(error_type); // TODO: Remap error_type to QHttpEngine::Socket errors
284-
writeResponseHeaders();
288+
setSocketResponseHeaders();
285289
Q_UNUSED(error_str); // response will be used instead of error string
286290
QJsonDocument resDoc(::OpenAPI::toJsonValue(res).toArray());
287291
socket->writeJson(resDoc);
@@ -292,7 +296,7 @@ void OAIPetApiRequest::findPetsByTagsError(const QList<OAIPet>& res, QNetworkRep
292296

293297
void OAIPetApiRequest::getPetByIdError(const OAIPet& res, QNetworkReply::NetworkError error_type, QString& error_str){
294298
Q_UNUSED(error_type); // TODO: Remap error_type to QHttpEngine::Socket errors
295-
writeResponseHeaders();
299+
setSocketResponseHeaders();
296300
Q_UNUSED(error_str); // response will be used instead of error string
297301
QJsonDocument resDoc(::OpenAPI::toJsonValue(res).toObject());
298302
socket->writeJson(resDoc);
@@ -303,7 +307,7 @@ void OAIPetApiRequest::getPetByIdError(const OAIPet& res, QNetworkReply::Network
303307

304308
void OAIPetApiRequest::updatePetError(QNetworkReply::NetworkError error_type, QString& error_str){
305309
Q_UNUSED(error_type); // TODO: Remap error_type to QHttpEngine::Socket errors
306-
writeResponseHeaders();
310+
setSocketResponseHeaders();
307311
socket->setStatusCode(QHttpEngine::Socket::NotFound);
308312
socket->write(error_str.toUtf8());
309313
if(socket->isOpen()){
@@ -313,7 +317,7 @@ void OAIPetApiRequest::updatePetError(QNetworkReply::NetworkError error_type, QS
313317

314318
void OAIPetApiRequest::updatePetWithFormError(QNetworkReply::NetworkError error_type, QString& error_str){
315319
Q_UNUSED(error_type); // TODO: Remap error_type to QHttpEngine::Socket errors
316-
writeResponseHeaders();
320+
setSocketResponseHeaders();
317321
socket->setStatusCode(QHttpEngine::Socket::NotFound);
318322
socket->write(error_str.toUtf8());
319323
if(socket->isOpen()){
@@ -323,7 +327,7 @@ void OAIPetApiRequest::updatePetWithFormError(QNetworkReply::NetworkError error_
323327

324328
void OAIPetApiRequest::uploadFileError(const OAIApiResponse& res, QNetworkReply::NetworkError error_type, QString& error_str){
325329
Q_UNUSED(error_type); // TODO: Remap error_type to QHttpEngine::Socket errors
326-
writeResponseHeaders();
330+
setSocketResponseHeaders();
327331
Q_UNUSED(error_str); // response will be used instead of error string
328332
QJsonDocument resDoc(::OpenAPI::toJsonValue(res).toObject());
329333
socket->writeJson(resDoc);

samples/server/petstore/cpp-qt5-qhttpengine-server/server/src/requests/OAIPetApiRequest.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -92,13 +92,12 @@ class OAIPetApiRequest : public QObject
9292
QHttpEngine::Socket *socket;
9393
QSharedPointer<OAIPetApiHandler> handler;
9494

95-
inline void writeResponseHeaders(){
95+
inline void setSocketResponseHeaders(){
9696
QHttpEngine::Socket::HeaderMap resHeaders;
9797
for(auto itr = responseHeaders.begin(); itr != responseHeaders.end(); ++itr) {
9898
resHeaders.insert(itr.key().toUtf8(), itr.value().toUtf8());
9999
}
100100
socket->setHeaders(resHeaders);
101-
socket->writeHeaders();
102101
}
103102
};
104103

samples/server/petstore/cpp-qt5-qhttpengine-server/server/src/requests/OAIStoreApiRequest.cpp

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -106,15 +106,16 @@ void OAIStoreApiRequest::placeOrderRequest(){
106106

107107

108108
void OAIStoreApiRequest::deleteOrderResponse(){
109-
writeResponseHeaders();
109+
setSocketResponseHeaders();
110110
socket->setStatusCode(QHttpEngine::Socket::OK);
111+
socket->writeHeaders();
111112
if(socket->isOpen()){
112113
socket->close();
113114
}
114115
}
115116

116117
void OAIStoreApiRequest::getInventoryResponse(const QMap<QString, qint32>& res){
117-
writeResponseHeaders();
118+
setSocketResponseHeaders();
118119
QJsonDocument resDoc(::OpenAPI::toJsonValue(res).toObject());
119120
socket->writeJson(resDoc);
120121
if(socket->isOpen()){
@@ -123,7 +124,7 @@ void OAIStoreApiRequest::getInventoryResponse(const QMap<QString, qint32>& res){
123124
}
124125

125126
void OAIStoreApiRequest::getOrderByIdResponse(const OAIOrder& res){
126-
writeResponseHeaders();
127+
setSocketResponseHeaders();
127128
QJsonDocument resDoc(::OpenAPI::toJsonValue(res).toObject());
128129
socket->writeJson(resDoc);
129130
if(socket->isOpen()){
@@ -132,7 +133,7 @@ void OAIStoreApiRequest::getOrderByIdResponse(const OAIOrder& res){
132133
}
133134

134135
void OAIStoreApiRequest::placeOrderResponse(const OAIOrder& res){
135-
writeResponseHeaders();
136+
setSocketResponseHeaders();
136137
QJsonDocument resDoc(::OpenAPI::toJsonValue(res).toObject());
137138
socket->writeJson(resDoc);
138139
if(socket->isOpen()){
@@ -143,7 +144,7 @@ void OAIStoreApiRequest::placeOrderResponse(const OAIOrder& res){
143144

144145
void OAIStoreApiRequest::deleteOrderError(QNetworkReply::NetworkError error_type, QString& error_str){
145146
Q_UNUSED(error_type); // TODO: Remap error_type to QHttpEngine::Socket errors
146-
writeResponseHeaders();
147+
setSocketResponseHeaders();
147148
socket->setStatusCode(QHttpEngine::Socket::NotFound);
148149
socket->write(error_str.toUtf8());
149150
if(socket->isOpen()){
@@ -153,7 +154,7 @@ void OAIStoreApiRequest::deleteOrderError(QNetworkReply::NetworkError error_type
153154

154155
void OAIStoreApiRequest::getInventoryError(const QMap<QString, qint32>& res, QNetworkReply::NetworkError error_type, QString& error_str){
155156
Q_UNUSED(error_type); // TODO: Remap error_type to QHttpEngine::Socket errors
156-
writeResponseHeaders();
157+
setSocketResponseHeaders();
157158
Q_UNUSED(error_str); // response will be used instead of error string
158159
QJsonDocument resDoc(::OpenAPI::toJsonValue(res).toObject());
159160
socket->writeJson(resDoc);
@@ -164,7 +165,7 @@ void OAIStoreApiRequest::getInventoryError(const QMap<QString, qint32>& res, QNe
164165

165166
void OAIStoreApiRequest::getOrderByIdError(const OAIOrder& res, QNetworkReply::NetworkError error_type, QString& error_str){
166167
Q_UNUSED(error_type); // TODO: Remap error_type to QHttpEngine::Socket errors
167-
writeResponseHeaders();
168+
setSocketResponseHeaders();
168169
Q_UNUSED(error_str); // response will be used instead of error string
169170
QJsonDocument resDoc(::OpenAPI::toJsonValue(res).toObject());
170171
socket->writeJson(resDoc);
@@ -175,7 +176,7 @@ void OAIStoreApiRequest::getOrderByIdError(const OAIOrder& res, QNetworkReply::N
175176

176177
void OAIStoreApiRequest::placeOrderError(const OAIOrder& res, QNetworkReply::NetworkError error_type, QString& error_str){
177178
Q_UNUSED(error_type); // TODO: Remap error_type to QHttpEngine::Socket errors
178-
writeResponseHeaders();
179+
setSocketResponseHeaders();
179180
Q_UNUSED(error_str); // response will be used instead of error string
180181
QJsonDocument resDoc(::OpenAPI::toJsonValue(res).toObject());
181182
socket->writeJson(resDoc);

samples/server/petstore/cpp-qt5-qhttpengine-server/server/src/requests/OAIStoreApiRequest.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -75,13 +75,12 @@ class OAIStoreApiRequest : public QObject
7575
QHttpEngine::Socket *socket;
7676
QSharedPointer<OAIStoreApiHandler> handler;
7777

78-
inline void writeResponseHeaders(){
78+
inline void setSocketResponseHeaders(){
7979
QHttpEngine::Socket::HeaderMap resHeaders;
8080
for(auto itr = responseHeaders.begin(); itr != responseHeaders.end(); ++itr) {
8181
resHeaders.insert(itr.key().toUtf8(), itr.value().toUtf8());
8282
}
8383
socket->setHeaders(resHeaders);
84-
socket->writeHeaders();
8584
}
8685
};
8786

0 commit comments

Comments
 (0)