Skip to content

Commit f57f90b

Browse files
sbrunnergithub-actions[bot]
authored andcommitted
Fix the mRequestHeaderConv initialization on FCGI request
1 parent a7cf1ec commit f57f90b

File tree

4 files changed

+65
-39
lines changed

4 files changed

+65
-39
lines changed

src/server/qgsfcgiserverrequest.cpp

+27-28
Original file line numberDiff line numberDiff line change
@@ -106,11 +106,31 @@ QgsFcgiServerRequest::QgsFcgiServerRequest()
106106
setUrl( url );
107107
setMethod( method );
108108

109-
// Get accept header for content-type negotiation
110-
const char *accept = getenv( "HTTP_ACCEPT" );
111-
if ( accept )
109+
// Fill the headers dictionary
110+
const QStringList headers
111+
{
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 )
112127
{
113-
setHeader( QStringLiteral( "Accept" ), accept );
128+
const char *result = qgetenv( QStringLiteral( "HTTP_%1" ).arg(
129+
headerName.toUpper().replace( QLatin1Char( '-' ), QLatin1Char( '_' ) ) ).toStdString().c_str() );
130+
if ( result )
131+
{
132+
setHeader( headerName, result );
133+
}
114134
}
115135

116136
// Output debug infos
@@ -233,23 +253,6 @@ void QgsFcgiServerRequest::printRequestInfos( const QUrl &url )
233253
QStringLiteral( "QGIS_SERVER_WCS_SERVICE_URL" ),
234254
QStringLiteral( "SERVER_PROTOCOL" )
235255
};
236-
const QStringList headers
237-
{
238-
QStringLiteral( "Accept" ),
239-
QStringLiteral( "User-Agent" ),
240-
QStringLiteral( "Proxy" ),
241-
QStringLiteral( "Authorization" ),
242-
QStringLiteral( "X-Qgis-Service-Url" ),
243-
QStringLiteral( "X-Qgis-WMS-Service-Url" ),
244-
QStringLiteral( "X-Qgis-WFS-Service-Url" ),
245-
QStringLiteral( "X-Qgis-WCS-Service-Url" ),
246-
QStringLiteral( "X-Qgis-WMTS-Service-Url" ),
247-
QStringLiteral( "Forwarded" ),
248-
QStringLiteral( "X-Forwarded-Host" ),
249-
QStringLiteral( "X-Forwarded-Proto" ),
250-
QStringLiteral( "Host" )
251-
};
252-
253256

254257
QgsMessageLog::logMessage( QStringLiteral( "Request URL: %2" ).arg( url.url() ), QStringLiteral( "Server" ), Qgis::MessageLevel::Info );
255258

@@ -265,14 +268,10 @@ void QgsFcgiServerRequest::printRequestInfos( const QUrl &url )
265268

266269
QgsMessageLog::logMessage( QStringLiteral( "Headers:" ), QStringLiteral( "Server" ), Qgis::MessageLevel::Info );
267270
QgsMessageLog::logMessage( QStringLiteral( "------------------------------------------------" ), QStringLiteral( "Server" ), Qgis::MessageLevel::Info );
268-
for ( const auto &headerName : headers )
271+
272+
for ( const auto &headerName : headers().keys() )
269273
{
270-
if ( !header( headerName ).isEmpty() )
271-
{
272-
QgsMessageLog::logMessage( QStringLiteral( "%1: %2" ).arg( headerName, header( headerName ) ), QStringLiteral( "Server" ), Qgis::MessageLevel::Info );
273-
// Fill the headers dictionary
274-
setHeader( headerName, header( headerName ) );
275-
}
274+
QgsMessageLog::logMessage( QStringLiteral( "%1: %2" ).arg( headerName ).arg( headers().value( headerName ) ), QStringLiteral( "Server" ), Qgis::MessageLevel::Info );
276275
}
277276
}
278277

src/server/qgsserverrequest.cpp

+20-10
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,11 @@
2121
#include <QUrlQuery>
2222

2323

24+
QgsServerRequest::QgsServerRequest( )
25+
{
26+
init();
27+
}
28+
2429
QgsServerRequest::QgsServerRequest( const QString &url, Method method, const Headers &headers )
2530
: QgsServerRequest( QUrl( url ), method, headers )
2631
{
@@ -34,16 +39,7 @@ QgsServerRequest::QgsServerRequest( const QUrl &url, Method method, const Header
3439
, mHeaders( headers )
3540
, mRequestHeaderConv()
3641
{
37-
mRequestHeaderConv.insert( HOST, QStringLiteral( "Host" ) );
38-
mRequestHeaderConv.insert( FORWARDED, QStringLiteral( "Forwarded" ) );
39-
mRequestHeaderConv.insert( X_FORWARDED_FOR, QStringLiteral( "X-Forwarded-For" ) );
40-
mRequestHeaderConv.insert( X_FORWARDED_HOST, QStringLiteral( "X-Forwarded-Host" ) );
41-
mRequestHeaderConv.insert( X_FORWARDED_PROTO, QStringLiteral( "X-Forwarded-Proto" ) );
42-
mRequestHeaderConv.insert( X_QGIS_SERVICE_URL, QStringLiteral( "X-Qgis-Service-Url" ) );
43-
mRequestHeaderConv.insert( X_QGIS_WMS_SERVICE_URL, QStringLiteral( "X-Qgis-Wms-Service-Url" ) );
44-
mRequestHeaderConv.insert( X_QGIS_WFS_SERVICE_URL, QStringLiteral( "X-Qgis-Wfs-Service-Url" ) );
45-
mRequestHeaderConv.insert( X_QGIS_WCS_SERVICE_URL, QStringLiteral( "X-Qgis-Wcs-Service-Url" ) );
46-
mRequestHeaderConv.insert( X_QGIS_WMTS_SERVICE_URL, QStringLiteral( "X-Qgis-Wmts-Service-Url" ) );
42+
init();
4743

4844
mParams.load( QUrlQuery( url ) );
4945
}
@@ -59,6 +55,20 @@ QgsServerRequest::QgsServerRequest( const QgsServerRequest &other )
5955
{
6056
}
6157

58+
void QgsServerRequest::init( )
59+
{
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" ) );
70+
}
71+
6272
QString QgsServerRequest::methodToString( const QgsServerRequest::Method &method )
6373
{
6474
static const QMetaEnum metaEnum = QMetaEnum::fromType<QgsServerRequest::Method>();

src/server/qgsserverrequest.h

+8-1
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ class SERVER_EXPORT QgsServerRequest
9090
/**
9191
* Constructor
9292
*/
93-
QgsServerRequest() = default;
93+
QgsServerRequest();
9494

9595
/**
9696
* Constructor
@@ -260,6 +260,13 @@ class SERVER_EXPORT QgsServerRequest
260260
void setBaseUrl( const QUrl &url );
261261

262262
private:
263+
264+
/**
265+
* Initialize the map used to convert the header enumeration value
266+
* into header name.
267+
*/
268+
void init();
269+
263270
// Url as seen by QGIS server after web server rewrite
264271
QUrl mUrl;
265272
// Unrewritten url as seen by the web server

tests/src/python/test_qgsserver_request.py

+10
Original file line numberDiff line numberDiff line change
@@ -215,6 +215,16 @@ def test_add_parameters(self):
215215
self.assertEqual(request.parameter('FOOBAR'), 'foobar')
216216
self.assertEqual(request.parameter('UNKNOWN'), '')
217217

218+
def test_headers(self):
219+
"""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"]
227+
218228

219229
if __name__ == '__main__':
220230
unittest.main()

0 commit comments

Comments
 (0)