Skip to content

Commit 24af658

Browse files
sbrunnergithub-actions[bot]
authored andcommitted
Use QMetaEnum
1 parent f57f90b commit 24af658

File tree

6 files changed

+52
-62
lines changed

6 files changed

+52
-62
lines changed

python/server/auto_generated/qgsserverrequest.sip.in

+6
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,12 @@ class QgsServerRequest
5757
X_QGIS_WCS_SERVICE_URL,
5858
// The QGIS WMTS service URL
5959
X_QGIS_WMTS_SERVICE_URL,
60+
// https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Accept
61+
ACCEPT,
62+
// https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/User-Agent
63+
USER_AGENT,
64+
// https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Authorization
65+
AUTHORIZATION,
6066
};
6167

6268
QgsServerRequest();

src/server/qgsfcgiserverrequest.cpp

+8-21
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
#include "qgsfcgiserverrequest.h"
2222
#include "qgsserverlogger.h"
2323
#include "qgsmessagelog.h"
24+
#include "qgsstringutils.h"
2425
#include <fcgi_stdio.h>
2526
#include <QDebug>
2627

@@ -107,27 +108,13 @@ QgsFcgiServerRequest::QgsFcgiServerRequest()
107108
setMethod( method );
108109

109110
// Fill the headers dictionary
110-
const QStringList headers
111+
for ( const auto &headerKey : qgsEnumMap<QgsServerRequest::RequestHeader>().values() )
111112
{
112-
QStringLiteral( "Accept" ),
113-
QStringLiteral( "User-Agent" ),
114-
QStringLiteral( "Proxy" ),
115-
QStringLiteral( "Authorization" ),
116-
QStringLiteral( "X-Qgis-Service-Url" ),
117-
QStringLiteral( "X-Qgis-WMS-Service-Url" ),
118-
QStringLiteral( "X-Qgis-WFS-Service-Url" ),
119-
QStringLiteral( "X-Qgis-WCS-Service-Url" ),
120-
QStringLiteral( "X-Qgis-WMTS-Service-Url" ),
121-
QStringLiteral( "Forwarded" ),
122-
QStringLiteral( "X-Forwarded-Host" ),
123-
QStringLiteral( "X-Forwarded-Proto" ),
124-
QStringLiteral( "Host" )
125-
};
126-
for ( const auto &headerName : headers )
127-
{
128-
const char *result = qgetenv( QStringLiteral( "HTTP_%1" ).arg(
129-
headerName.toUpper().replace( QLatin1Char( '-' ), QLatin1Char( '_' ) ) ).toStdString().c_str() );
130-
if ( result )
113+
const QString headerName = QgsStringUtils::capitalize(
114+
QString( headerKey ).replace( QLatin1Char( '_' ), QLatin1Char( ' ' ) ), Qgis::Capitalization::TitleCase
115+
).replace( QLatin1Char( ' ' ), QLatin1Char( '-' ) );
116+
const char *result = getenv( QStringLiteral( "HTTP_%1" ).arg( headerKey ).toStdString().c_str() );
117+
if ( result && strlen( result ) > 0 )
131118
{
132119
setHeader( headerName, result );
133120
}
@@ -243,6 +230,7 @@ void QgsFcgiServerRequest::printRequestInfos( const QUrl &url )
243230
QStringLiteral( "CONTENT_TYPE" ),
244231
QStringLiteral( "REQUEST_METHOD" ),
245232
QStringLiteral( "AUTH_TYPE" ),
233+
QStringLiteral( "HTTP_PROXY" ),
246234
QStringLiteral( "NO_PROXY" ),
247235
QStringLiteral( "QGIS_PROJECT_FILE" ),
248236
QStringLiteral( "QGIS_SERVER_IGNORE_BAD_LAYERS" ),
@@ -268,7 +256,6 @@ void QgsFcgiServerRequest::printRequestInfos( const QUrl &url )
268256

269257
QgsMessageLog::logMessage( QStringLiteral( "Headers:" ), QStringLiteral( "Server" ), Qgis::MessageLevel::Info );
270258
QgsMessageLog::logMessage( QStringLiteral( "------------------------------------------------" ), QStringLiteral( "Server" ), Qgis::MessageLevel::Info );
271-
272259
for ( const auto &headerName : headers().keys() )
273260
{
274261
QgsMessageLog::logMessage( QStringLiteral( "%1: %2" ).arg( headerName ).arg( headers().value( headerName ) ), QStringLiteral( "Server" ), Qgis::MessageLevel::Info );

src/server/qgsserverprojectutils.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -355,7 +355,7 @@ QString QgsServerProjectUtils::serviceUrl( const QString &service, const QgsServ
355355
QString proto;
356356
QString host;
357357

358-
QString forwarded = request.header( QgsServerRequest::FORWARDED );
358+
QString forwarded = request.header( QgsServerRequest::FORWARDED );
359359
if ( ! forwarded.isEmpty() )
360360
{
361361
forwarded = forwarded.split( QLatin1Char( ',' ) )[0];

src/server/qgsserverrequest.cpp

+6-24
Original file line numberDiff line numberDiff line change
@@ -18,14 +18,10 @@
1818
***************************************************************************/
1919

2020
#include "qgsserverrequest.h"
21+
#include "qgsstringutils.h"
2122
#include <QUrlQuery>
2223

2324

24-
QgsServerRequest::QgsServerRequest( )
25-
{
26-
init();
27-
}
28-
2925
QgsServerRequest::QgsServerRequest( const QString &url, Method method, const Headers &headers )
3026
: QgsServerRequest( QUrl( url ), method, headers )
3127
{
@@ -37,10 +33,7 @@ QgsServerRequest::QgsServerRequest( const QUrl &url, Method method, const Header
3733
, mBaseUrl( url )
3834
, mMethod( method )
3935
, mHeaders( headers )
40-
, mRequestHeaderConv()
4136
{
42-
init();
43-
4437
mParams.load( QUrlQuery( url ) );
4538
}
4639

@@ -51,22 +44,7 @@ QgsServerRequest::QgsServerRequest( const QgsServerRequest &other )
5144
, mMethod( other.mMethod )
5245
, mHeaders( other.mHeaders )
5346
, mParams( other.mParams )
54-
, mRequestHeaderConv( other.mRequestHeaderConv )
55-
{
56-
}
57-
58-
void QgsServerRequest::init( )
5947
{
60-
mRequestHeaderConv.insert( HOST, QStringLiteral( "Host" ) );
61-
mRequestHeaderConv.insert( FORWARDED, QStringLiteral( "Forwarded" ) );
62-
mRequestHeaderConv.insert( X_FORWARDED_FOR, QStringLiteral( "X-Forwarded-For" ) );
63-
mRequestHeaderConv.insert( X_FORWARDED_HOST, QStringLiteral( "X-Forwarded-Host" ) );
64-
mRequestHeaderConv.insert( X_FORWARDED_PROTO, QStringLiteral( "X-Forwarded-Proto" ) );
65-
mRequestHeaderConv.insert( X_QGIS_SERVICE_URL, QStringLiteral( "X-Qgis-Service-Url" ) );
66-
mRequestHeaderConv.insert( X_QGIS_WMS_SERVICE_URL, QStringLiteral( "X-Qgis-Wms-Service-Url" ) );
67-
mRequestHeaderConv.insert( X_QGIS_WFS_SERVICE_URL, QStringLiteral( "X-Qgis-Wfs-Service-Url" ) );
68-
mRequestHeaderConv.insert( X_QGIS_WCS_SERVICE_URL, QStringLiteral( "X-Qgis-Wcs-Service-Url" ) );
69-
mRequestHeaderConv.insert( X_QGIS_WMTS_SERVICE_URL, QStringLiteral( "X-Qgis-Wmts-Service-Url" ) );
7048
}
7149

7250
QString QgsServerRequest::methodToString( const QgsServerRequest::Method &method )
@@ -83,7 +61,11 @@ QString QgsServerRequest::header( const QString &name ) const
8361

8462
QString QgsServerRequest::header( const QgsServerRequest::RequestHeader &headerEnum ) const
8563
{
86-
return header( mRequestHeaderConv[ headerEnum ] );
64+
const QString headerKey = QString( qgsEnumValueToKey<QgsServerRequest::RequestHeader>( headerEnum ) );
65+
const QString headerName = QgsStringUtils::capitalize(
66+
QString( headerKey ).replace( QLatin1Char( '_' ), QLatin1Char( ' ' ) ), Qgis::Capitalization::TitleCase
67+
).replace( QLatin1Char( ' ' ), QLatin1Char( '-' ) );
68+
return header( headerName );
8769
}
8870

8971
void QgsServerRequest::setHeader( const QString &name, const QString &value )

src/server/qgsserverrequest.h

+7-9
Original file line numberDiff line numberDiff line change
@@ -84,13 +84,19 @@ class SERVER_EXPORT QgsServerRequest
8484
X_QGIS_WCS_SERVICE_URL,
8585
// The QGIS WMTS service URL
8686
X_QGIS_WMTS_SERVICE_URL,
87+
// https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Accept
88+
ACCEPT,
89+
// https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/User-Agent
90+
USER_AGENT,
91+
// https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Authorization
92+
AUTHORIZATION,
8793
};
8894
Q_ENUM( RequestHeader )
8995

9096
/**
9197
* Constructor
9298
*/
93-
QgsServerRequest();
99+
QgsServerRequest() = default;
94100

95101
/**
96102
* Constructor
@@ -260,13 +266,6 @@ class SERVER_EXPORT QgsServerRequest
260266
void setBaseUrl( const QUrl &url );
261267

262268
private:
263-
264-
/**
265-
* Initialize the map used to convert the header enumeration value
266-
* into header name.
267-
*/
268-
void init();
269-
270269
// Url as seen by QGIS server after web server rewrite
271270
QUrl mUrl;
272271
// Unrewritten url as seen by the web server
@@ -277,7 +276,6 @@ class SERVER_EXPORT QgsServerRequest
277276
// to support lazy initialization
278277
mutable Headers mHeaders;
279278
QgsServerParameters mParams;
280-
QMap<RequestHeader, QString> mRequestHeaderConv;
281279
};
282280

283281
#endif

tests/src/python/test_qgsserver_request.py

+24-7
Original file line numberDiff line numberDiff line change
@@ -217,13 +217,30 @@ def test_add_parameters(self):
217217

218218
def test_headers(self):
219219
"""Tests that the headers are working in Fcgi mode"""
220-
os.environ["HTTP_HOST"] = "example.com"
221-
request = QgsFcgiServerRequest()
222-
self.assertEquals(request.header("Host"), "example.com")
223-
request = QgsServerRequest(request)
224-
self.assertEquals(request.header("Host"), "example.com")
225-
self.assertEquals(request.header(QgsServerRequest.HOST), "example.com")
226-
del os.environ["HTTP_HOST"]
220+
for header, env, enum, value in (
221+
("Host", "HTTP_HOST", QgsServerRequest.HOST, "example.com"),
222+
("Forwarded", "HTTP_FORWARDED", QgsServerRequest.FORWARDED, "aaa"),
223+
("X-Forwarded-For", "HTTP_X_FORWARDED_FOR", QgsServerRequest.X_FORWARDED_FOR, "bbb"),
224+
("X-Forwarded-Host", "HTTP_X_FORWARDED_HOST", QgsServerRequest.X_FORWARDED_HOST, "ccc"),
225+
("X-Forwarded-Proto", "HTTP_X_FORWARDED_PROTO", QgsServerRequest.X_FORWARDED_PROTO, "ddd"),
226+
("X-Qgis-Service-Url", "HTTP_X_QGIS_SERVICE_URL", QgsServerRequest.X_QGIS_SERVICE_URL, "eee"),
227+
("X-Qgis-Wms-Service-Url", "HTTP_X_QGIS_WMS_SERVICE_URL", QgsServerRequest.X_QGIS_WMS_SERVICE_URL, "fff"),
228+
("X-Qgis-Wfs-Service-Url", "HTTP_X_QGIS_WFS_SERVICE_URL", QgsServerRequest.X_QGIS_WFS_SERVICE_URL, "ggg"),
229+
("X-Qgis-Wcs-Service-Url", "HTTP_X_QGIS_WCS_SERVICE_URL", QgsServerRequest.X_QGIS_WCS_SERVICE_URL, "hhh"),
230+
("X-Qgis-Wmts-Service-Url", "HTTP_X_QGIS_WMTS_SERVICE_URL", QgsServerRequest.X_QGIS_WMTS_SERVICE_URL, "iii"),
231+
("Accept", "HTTP_ACCEPT", QgsServerRequest.ACCEPT, "jjj"),
232+
("User-Agent", "HTTP_USER_AGENT", QgsServerRequest.USER_AGENT, "kkk"),
233+
("Authorization", "HTTP_AUTHORIZATION", QgsServerRequest.AUTHORIZATION, "lll"),
234+
):
235+
try:
236+
os.environ[env] = value
237+
request = QgsFcgiServerRequest()
238+
self.assertEquals(request.headers(), {header: value})
239+
request = QgsServerRequest(request)
240+
self.assertEquals(request.headers(), {header: value})
241+
self.assertEquals(request.header(enum), value)
242+
finally:
243+
del os.environ[env]
227244

228245

229246
if __name__ == '__main__':

0 commit comments

Comments
 (0)