Skip to content

Commit 6a88a75

Browse files
committedJul 23, 2018
Add QgsServerParameters
1 parent b58f194 commit 6a88a75

File tree

6 files changed

+302
-28
lines changed

6 files changed

+302
-28
lines changed
 

‎src/server/CMakeLists.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ SET(QGIS_SERVER_SRCS
3030
qgsfilterrestorer.cpp
3131
qgsrequesthandler.cpp
3232
qgsserver.cpp
33+
qgsserverparameters.cpp
3334
qgsserverexception.cpp
3435
qgsserverinterface.cpp
3536
qgsserverinterfaceimpl.cpp
@@ -56,6 +57,7 @@ SET (QGIS_SERVER_MOC_HDRS
5657
qgsconfigcache.h
5758
qgsserverlogger.h
5859
qgsserversettings.h
60+
qgsserverparameters.h
5961
)
6062

6163

‎src/server/qgsserver.cpp

Lines changed: 11 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
#include "qgsfilterresponsedecorator.h"
3939
#include "qgsservice.h"
4040
#include "qgsserverprojectutils.h"
41+
#include "qgsserverparameters.h"
4142

4243
#include <QDomDocument>
4344
#include <QNetworkDiskCache>
@@ -135,7 +136,7 @@ void QgsServer::printRequestParameters( const QMap< QString, QString> &parameter
135136
}
136137
}
137138

138-
QString QgsServer::configPath( const QString &defaultConfigPath, const QMap<QString, QString> &parameters )
139+
QString QgsServer::configPath( const QString &defaultConfigPath, const QString &configPath )
139140
{
140141
QString cfPath( defaultConfigPath );
141142
QString projectFile = sSettings.projectFile();
@@ -146,14 +147,13 @@ QString QgsServer::configPath( const QString &defaultConfigPath, const QMap<QStr
146147
}
147148
else
148149
{
149-
QMap<QString, QString>::const_iterator paramIt = parameters.find( QStringLiteral( "MAP" ) );
150-
if ( paramIt == parameters.constEnd() )
150+
if ( configPath.isEmpty() )
151151
{
152152
QgsMessageLog::logMessage( QStringLiteral( "Using default configuration file path: %1" ).arg( defaultConfigPath ), QStringLiteral( "Server" ), Qgis::Info );
153153
}
154154
else
155155
{
156-
cfPath = paramIt.value();
156+
cfPath = configPath;
157157
QgsDebugMsg( QString( "MAP:%1" ).arg( cfPath ) );
158158
}
159159
}
@@ -303,13 +303,13 @@ void QgsServer::handleRequest( QgsServerRequest &request, QgsServerResponse &res
303303
{
304304
try
305305
{
306-
QMap<QString, QString> parameterMap = request.parameters();
307-
printRequestParameters( parameterMap, logLevel );
306+
const QgsServerParameters params( request.parameters() );
307+
printRequestParameters( request.parameters(), logLevel );
308308

309309
//Config file path
310310
if ( ! project )
311311
{
312-
QString configFilePath = configPath( *sConfigFilePath, parameterMap );
312+
QString configFilePath = configPath( *sConfigFilePath, params.map() );
313313

314314
// load the project if needed and not empty
315315
project = mConfigCache->project( configFilePath );
@@ -325,30 +325,14 @@ void QgsServer::handleRequest( QgsServerRequest &request, QgsServerResponse &res
325325
sServerInterface->setConfigFilePath( project->fileName() );
326326
}
327327

328-
//Service parameter
329-
QString serviceString = parameterMap.value( QStringLiteral( "SERVICE" ) );
330-
331-
if ( serviceString.isEmpty() )
332-
{
333-
// SERVICE not mandatory for WMS 1.3.0 GetMap & GetFeatureInfo
334-
QString requestString = parameterMap.value( QStringLiteral( "REQUEST" ) );
335-
if ( requestString == QLatin1String( "GetMap" ) || requestString == QLatin1String( "GetFeatureInfo" ) )
336-
{
337-
serviceString = QStringLiteral( "WMS" );
338-
}
339-
}
340-
341-
QString versionString = parameterMap.value( QStringLiteral( "VERSION" ) );
342-
343-
//possibility for client to suggest a download filename
344-
QString outputFileName = parameterMap.value( QStringLiteral( "FILE_NAME" ) );
345-
if ( !outputFileName.isEmpty() )
328+
if ( ! params.fileName().isEmpty() )
346329
{
347-
requestHandler.setResponseHeader( QStringLiteral( "Content-Disposition" ), "attachment; filename=\"" + outputFileName + "\"" );
330+
const QString value = QString( "attachment; filename=\"%1\"" ).arg( params.fileName() );
331+
requestHandler.setResponseHeader( QStringLiteral( "Content-Disposition" ), value );
348332
}
349333

350334
// Lookup for service
351-
QgsService *service = sServiceRegistry->getService( serviceString, versionString );
335+
QgsService *service = sServiceRegistry->getService( params.service(), params.version() );
352336
if ( service )
353337
{
354338
service->executeRequest( request, responseDecorator, project );

‎src/server/qgsserver.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ class SERVER_EXPORT QgsServer
106106
* Returns the configuration file path.
107107
*/
108108
static QString configPath( const QString &defaultConfigPath,
109-
const QMap<QString, QString> &parameters );
109+
const QString &configPath );
110110

111111
/**
112112
* \brief QgsServer::printRequestParameters prints the request parameters

‎src/server/qgsserverexception.h

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,5 +105,20 @@ class SERVER_EXPORT QgsOgcServiceException
105105
QString mVersion;
106106
};
107107

108+
/**
109+
* \ingroup server
110+
* \class QgsBadRequestException
111+
* \brief Exception thrown in case of malformed request
112+
*/
113+
#ifndef SIP_RUN
114+
class SERVER_EXPORT QgsBadRequestException: public QgsOgcServiceException
115+
{
116+
public:
117+
QgsBadRequestException( const QString &code, const QString &message, const QString &locator = QString() )
118+
: QgsOgcServiceException( code, message, locator, 400 )
119+
{}
120+
};
121+
#endif
122+
108123
#endif
109124

‎src/server/qgsserverparameters.cpp

Lines changed: 154 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,154 @@
1+
/***************************************************************************
2+
qgsserverparameters.cpp
3+
--------------------
4+
begin : Jun 27, 2018
5+
copyright : (C) 2018 by Paul Blottiere
6+
email : paul dot blottiere at oslandia dot com
7+
***************************************************************************/
8+
9+
/***************************************************************************
10+
* *
11+
* This program is free software; you can redistribute it and/or modify *
12+
* it under the terms of the GNU General Public License as published by *
13+
* the Free Software Foundation; either version 2 of the License, or *
14+
* (at your option) any later version. *
15+
* *
16+
***************************************************************************/
17+
18+
#include "qgsserverparameters.h"
19+
#include "qgsserverexception.h"
20+
21+
QgsServerParameters::QgsServerParameters()
22+
{
23+
const Parameter pService = { ParameterName::SERVICE,
24+
QVariant::String,
25+
QVariant( "" ),
26+
QVariant()
27+
};
28+
save( pService );
29+
30+
const Parameter pRequest = { ParameterName::REQUEST,
31+
QVariant::String,
32+
QVariant( "" ),
33+
QVariant()
34+
};
35+
save( pRequest );
36+
37+
const Parameter pVersion = { ParameterName::VERSION_SERVICE,
38+
QVariant::String,
39+
QVariant( "" ),
40+
QVariant()
41+
};
42+
save( pService );
43+
44+
const Parameter pMap = { ParameterName::MAP,
45+
QVariant::String,
46+
QVariant( "" ),
47+
QVariant()
48+
};
49+
save( pMap );
50+
51+
const Parameter pFile = { ParameterName::FILE_NAME,
52+
QVariant::String,
53+
QVariant( "" ),
54+
QVariant()
55+
};
56+
save( pFile );
57+
}
58+
59+
QgsServerParameters::QgsServerParameters( const QgsServerRequest::Parameters &parameters )
60+
: QgsServerParameters()
61+
{
62+
load( parameters );
63+
}
64+
65+
void QgsServerParameters::save( const Parameter &parameter )
66+
{
67+
mParameters[ parameter.mName ] = parameter;
68+
}
69+
70+
QString QgsServerParameters::map() const
71+
{
72+
return value( ParameterName::MAP ).toString();
73+
}
74+
75+
QString QgsServerParameters::version() const
76+
{
77+
return value( ParameterName::VERSION_SERVICE ).toString();
78+
}
79+
80+
QString QgsServerParameters::fileName() const
81+
{
82+
return value( ParameterName::FILE_NAME ).toString();
83+
}
84+
85+
QString QgsServerParameters::service() const
86+
{
87+
QString serviceValue = value( ParameterName::SERVICE ).toString();
88+
89+
if ( serviceValue.isEmpty() )
90+
{
91+
// SERVICE not mandatory for WMS 1.3.0 GetMap & GetFeatureInfo
92+
if ( request() == QLatin1String( "GetMap" ) \
93+
|| request() == QLatin1String( "GetFeatureInfo" ) )
94+
{
95+
serviceValue = "WMS";
96+
}
97+
}
98+
99+
return serviceValue;
100+
}
101+
102+
QString QgsServerParameters::request() const
103+
{
104+
return value( ParameterName::REQUEST ).toString();
105+
}
106+
107+
QVariant QgsServerParameters::value( ParameterName name ) const
108+
{
109+
return mParameters[name].mValue;
110+
}
111+
112+
void QgsServerParameters::load( const QgsServerRequest::Parameters &parameters )
113+
{
114+
const QMetaEnum metaEnum( QMetaEnum::fromType<ParameterName>() );
115+
116+
for ( const QString &key : parameters.keys() )
117+
{
118+
const ParameterName name = ( ParameterName ) metaEnum.keyToValue( key.toStdString().c_str() );
119+
if ( name >= 0 )
120+
{
121+
const QVariant value( parameters[key] );
122+
mParameters[name].mValue = value;
123+
124+
if ( !value.canConvert( mParameters[name].mType ) )
125+
{
126+
raiseError( name );
127+
}
128+
}
129+
else
130+
{
131+
mUnmanagedParameters[key] = parameters[key];
132+
}
133+
}
134+
}
135+
136+
QString QgsServerParameters::name( ParameterName name ) const
137+
{
138+
const QMetaEnum metaEnum( QMetaEnum::fromType<ParameterName>() );
139+
return metaEnum.valueToKey( name );
140+
}
141+
142+
void QgsServerParameters::raiseError( ParameterName paramName ) const
143+
{
144+
const QString value = mParameters[paramName].mValue.toString();
145+
const QString param = name( paramName );
146+
const QString type = QVariant::typeToName( mParameters[paramName].mType );
147+
const QString msg = QString( "%1 ('%2') cannot be converted into %3" ).arg( param, value, type );
148+
raiseError( msg );
149+
}
150+
151+
void QgsServerParameters::raiseError( const QString &msg ) const
152+
{
153+
throw QgsBadRequestException( QStringLiteral( "Invalid WMS Parameter" ), msg );
154+
}

‎src/server/qgsserverparameters.h

Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
1+
/***************************************************************************
2+
qgsserverparameters.h
3+
------------------
4+
begin : Jun 27, 2018
5+
copyright : (C) 2018 by Paul Blottiere
6+
email : paul dot blottiere at oslandia dot com
7+
***************************************************************************/
8+
9+
/***************************************************************************
10+
* *
11+
* This program is free software; you can redistribute it and/or modify *
12+
* it under the terms of the GNU General Public License as published by *
13+
* the Free Software Foundation; either version 2 of the License, or *
14+
* (at your option) any later version. *
15+
* *
16+
***************************************************************************/
17+
18+
#ifndef QGSSERVERPARAMETERS_H
19+
#define QGSSERVERPARAMETERS_H
20+
21+
#include <QMap>
22+
#include <QObject>
23+
#include <QMetaEnum>
24+
25+
#include "qgsserverrequest.h"
26+
27+
/**
28+
* QgsServerParameters provides an interface to retrieve and manipulate
29+
* global parameters received from the client.
30+
* \since QGIS 3.4
31+
*/
32+
class QgsServerParameters
33+
{
34+
Q_GADGET
35+
36+
public:
37+
enum ParameterName
38+
{
39+
SERVICE,
40+
VERSION_SERVICE, // should be VERSION, but there's a conflict with #define VERSION
41+
REQUEST,
42+
MAP,
43+
FILE_NAME
44+
};
45+
Q_ENUM( ParameterName )
46+
47+
struct Parameter
48+
{
49+
ParameterName mName;
50+
QVariant::Type mType;
51+
QVariant mDefaultValue;
52+
QVariant mValue;
53+
};
54+
55+
/**
56+
* Constructor.
57+
*/
58+
QgsServerParameters();
59+
60+
/**
61+
* Constructor.
62+
* \param map of parameters where keys are parameters' names.
63+
*/
64+
QgsServerParameters( const QgsServerRequest::Parameters &parameters );
65+
66+
/**
67+
* Loads new parameters.
68+
* \param map of parameters
69+
*/
70+
void load( const QgsServerRequest::Parameters &parameters );
71+
72+
/**
73+
* Returns SERVICE parameter as a string or an empty string if not
74+
* defined.
75+
* \returns service
76+
*/
77+
QString service() const;
78+
79+
/**
80+
* Returns REQUEST parameter as a string or an empty string if not
81+
* defined.
82+
* \returns request
83+
*/
84+
QString request() const;
85+
86+
/**
87+
* Returns MAP parameter as a string or an empty string if not
88+
* defined.
89+
* \returns map
90+
*/
91+
QString map() const;
92+
93+
/**
94+
* Returns FILE_NAME parameter as a string or an empty string if not
95+
* defined.
96+
* \returns filename
97+
*/
98+
QString fileName() const;
99+
100+
/**
101+
* Returns VERSION parameter as a string or an empty string if not
102+
* defined.
103+
* \returns version
104+
*/
105+
QString version() const;
106+
107+
private:
108+
void save( const Parameter &parameter );
109+
QVariant value( ParameterName name ) const;
110+
QString name( ParameterName name ) const;
111+
112+
void raiseError( ParameterName name ) const;
113+
void raiseError( const QString &msg ) const;
114+
115+
QMap<ParameterName, Parameter> mParameters;
116+
QMap<QString, QString> mUnmanagedParameters;
117+
};
118+
119+
#endif

0 commit comments

Comments
 (0)
Please sign in to comment.