QGIS API Documentation  3.14.0-Pi (9f7028fd23)
qgsserver.cpp
Go to the documentation of this file.
1 /***************************************************************************
2  qgsserver.cpp
3  A server application supporting WMS / WFS / WCS
4  -------------------
5  begin : July 04, 2006
6  copyright : (C) 2006 by Marco Hugentobler & Ionut Iosifescu Enescu
7  : (C) 2015 by Alessandro Pasotti
8  email : marco dot hugentobler at karto dot baug dot ethz dot ch
9  : elpaso at itopen dot it
10  ***************************************************************************/
11 
12 /***************************************************************************
13  * *
14  * This program is free software; you can redistribute it and/or modify *
15  * it under the terms of the GNU General Public License as published by *
16  * the Free Software Foundation; either version 2 of the License, or *
17  * (at your option) any later version. *
18  * *
19  ***************************************************************************/
20 
21 //for CMAKE_INSTALL_PREFIX
22 #include "qgsconfig.h"
23 #include "qgsserver.h"
24 #include "qgsauthmanager.h"
25 #include "qgscapabilitiescache.h"
26 #include "qgsfontutils.h"
27 #include "qgsrequesthandler.h"
28 #include "qgsproject.h"
29 #include "qgsproviderregistry.h"
30 #include "qgslogger.h"
31 #include "qgsmapserviceexception.h"
33 #include "qgsserverlogger.h"
34 #include "qgsserverrequest.h"
36 #include "qgsservice.h"
37 #include "qgsserverapi.h"
38 #include "qgsserverapicontext.h"
39 #include "qgsserverparameters.h"
40 #include "qgsapplication.h"
41 
42 #include <QDomDocument>
43 #include <QNetworkDiskCache>
44 #include <QSettings>
45 #include <QElapsedTimer>
46 
47 // TODO: remove, it's only needed by a single debug message
48 #include <fcgi_stdio.h>
49 #include <cstdlib>
50 
51 
52 
53 // Server status static initializers.
54 // Default values are for C++, SIP bindings will override their
55 // options in in init()
56 
57 QString *QgsServer::sConfigFilePath = nullptr;
58 QgsCapabilitiesCache *QgsServer::sCapabilitiesCache = nullptr;
59 QgsServerInterfaceImpl *QgsServer::sServerInterface = nullptr;
60 // Initialization must run once for all servers
61 bool QgsServer::sInitialized = false;
62 
63 QgsServiceRegistry *QgsServer::sServiceRegistry = nullptr;
64 
66 
68 {
69  // QgsApplication must exist
70  if ( qobject_cast<QgsApplication *>( qApp ) == nullptr )
71  {
72  qFatal( "A QgsApplication must exist before a QgsServer instance can be created." );
73  abort();
74  }
75  init();
76  mConfigCache = QgsConfigCache::instance();
77 }
78 
79 QFileInfo QgsServer::defaultAdminSLD()
80 {
81  return QFileInfo( QStringLiteral( "admin.sld" ) );
82 }
83 
84 void QgsServer::setupNetworkAccessManager()
85 {
86  QSettings settings;
88  QNetworkDiskCache *cache = new QNetworkDiskCache( nullptr );
89  qint64 cacheSize = sSettings()->cacheSize();
90  QString cacheDirectory = sSettings()->cacheDirectory();
91  cache->setCacheDirectory( cacheDirectory );
92  cache->setMaximumCacheSize( cacheSize );
93  QgsMessageLog::logMessage( QStringLiteral( "cacheDirectory: %1" ).arg( cache->cacheDirectory() ), QStringLiteral( "Server" ), Qgis::Info );
94  QgsMessageLog::logMessage( QStringLiteral( "maximumCacheSize: %1" ).arg( cache->maximumCacheSize() ), QStringLiteral( "Server" ), Qgis::Info );
95  nam->setCache( cache );
96 }
97 
98 QFileInfo QgsServer::defaultProjectFile()
99 {
100  QDir currentDir;
101  fprintf( FCGI_stderr, "current directory: %s\n", currentDir.absolutePath().toUtf8().constData() );
102  QStringList nameFilterList;
103  nameFilterList << QStringLiteral( "*.qgs" )
104  << QStringLiteral( "*.qgz" );
105  QFileInfoList projectFiles = currentDir.entryInfoList( nameFilterList, QDir::Files, QDir::Name );
106  for ( int x = 0; x < projectFiles.size(); x++ )
107  {
108  QgsMessageLog::logMessage( projectFiles.at( x ).absoluteFilePath(), QStringLiteral( "Server" ), Qgis::Info );
109  }
110  if ( projectFiles.isEmpty() )
111  {
112  return QFileInfo();
113  }
114  return projectFiles.at( 0 );
115 }
116 
117 void QgsServer::printRequestParameters( const QMap< QString, QString> &parameterMap, Qgis::MessageLevel logLevel )
118 {
119  if ( logLevel > Qgis::Info )
120  {
121  return;
122  }
123 
124  QMap< QString, QString>::const_iterator pIt = parameterMap.constBegin();
125  for ( ; pIt != parameterMap.constEnd(); ++pIt )
126  {
127  QgsMessageLog::logMessage( pIt.key() + ":" + pIt.value(), QStringLiteral( "Server" ), Qgis::Info );
128  }
129 }
130 
131 QString QgsServer::configPath( const QString &defaultConfigPath, const QString &configPath )
132 {
133  QString cfPath( defaultConfigPath );
134  QString projectFile = sSettings()->projectFile();
135  if ( !projectFile.isEmpty() )
136  {
137  cfPath = projectFile;
138  QgsDebugMsg( QStringLiteral( "QGIS_PROJECT_FILE:%1" ).arg( cfPath ) );
139  }
140  else
141  {
142  if ( configPath.isEmpty() )
143  {
144  // Read it from the environment, because a rewrite rule may have rewritten it
145  if ( getenv( "QGIS_PROJECT_FILE" ) )
146  {
147  cfPath = getenv( "QGIS_PROJECT_FILE" );
148  QgsMessageLog::logMessage( QStringLiteral( "Using configuration file path from environment: %1" ).arg( cfPath ), QStringLiteral( "Server" ), Qgis::Info );
149  }
150  else if ( ! defaultConfigPath.isEmpty() )
151  {
152  QgsMessageLog::logMessage( QStringLiteral( "Using default configuration file path: %1" ).arg( defaultConfigPath ), QStringLiteral( "Server" ), Qgis::Info );
153  }
154  }
155  else
156  {
157  cfPath = configPath;
158  QgsDebugMsg( QStringLiteral( "MAP:%1" ).arg( cfPath ) );
159  }
160  }
161  return cfPath;
162 }
163 
164 void QgsServer::initLocale()
165 {
166  // System locale override
167  if ( ! sSettings()->overrideSystemLocale().isEmpty() )
168  {
169  QLocale::setDefault( QLocale( sSettings()->overrideSystemLocale() ) );
170  }
171  // Number group separator settings
172  QLocale currentLocale;
173  if ( sSettings()->showGroupSeparator() )
174  {
175  currentLocale.setNumberOptions( currentLocale.numberOptions() &= ~QLocale::NumberOption::OmitGroupSeparator );
176  }
177  else
178  {
179  currentLocale.setNumberOptions( currentLocale.numberOptions() |= QLocale::NumberOption::OmitGroupSeparator );
180  }
181  QLocale::setDefault( currentLocale );
182 }
183 
184 bool QgsServer::init()
185 {
186  if ( sInitialized )
187  {
188  return false;
189  }
190 
191  QCoreApplication::setOrganizationName( QgsApplication::QGIS_ORGANIZATION_NAME );
192  QCoreApplication::setOrganizationDomain( QgsApplication::QGIS_ORGANIZATION_DOMAIN );
193  QCoreApplication::setApplicationName( QgsApplication::QGIS_APPLICATION_NAME );
194 
196 
197 #if defined(SERVER_SKIP_ECW)
198  QgsMessageLog::logMessage( "Skipping GDAL ECW drivers in server.", "Server", Qgis::Info );
200  QgsApplication::skipGdalDriver( "JP2ECW" );
201 #endif
202 
203  // reload settings to take into account QCoreApplication and QgsApplication
204  // configuration
205  sSettings()->load();
206 
207  // init and configure logger
209  QgsServerLogger::instance()->setLogLevel( sSettings()->logLevel() );
210  if ( ! sSettings()->logFile().isEmpty() )
211  {
212  QgsServerLogger::instance()->setLogFile( sSettings()->logFile() );
213  }
214  else if ( sSettings()->logStderr() )
215  {
217  }
218 
219  // Configure locale
220  initLocale();
221 
222  // log settings currently used
223  sSettings()->logSummary();
224 
225  setupNetworkAccessManager();
226  QDomImplementation::setInvalidDataPolicy( QDomImplementation::DropInvalidChars );
227 
228  // Instantiate the plugin directory so that providers are loaded
230  QgsMessageLog::logMessage( "Prefix PATH: " + QgsApplication::prefixPath(), QStringLiteral( "Server" ), Qgis::Info );
231  QgsMessageLog::logMessage( "Plugin PATH: " + QgsApplication::pluginPath(), QStringLiteral( "Server" ), Qgis::Info );
232  QgsMessageLog::logMessage( "PkgData PATH: " + QgsApplication::pkgDataPath(), QStringLiteral( "Server" ), Qgis::Info );
233  QgsMessageLog::logMessage( "User DB PATH: " + QgsApplication::qgisUserDatabaseFilePath(), QStringLiteral( "Server" ), Qgis::Info );
234  QgsMessageLog::logMessage( "Auth DB PATH: " + QgsApplication::qgisAuthDatabaseFilePath(), QStringLiteral( "Server" ), Qgis::Info );
235  QgsMessageLog::logMessage( "SVG PATHS: " + QgsApplication::svgPaths().join( QDir::listSeparator() ), QStringLiteral( "Server" ), Qgis::Info );
236 
237  QgsApplication::createDatabase(); //init qgis.db (e.g. necessary for user crs)
238 
239  // Initialize the authentication system
240  // creates or uses qgis-auth.db in ~/.qgis3/ or directory defined by QGIS_AUTH_DB_DIR_PATH env variable
241  // set the master password as first line of file defined by QGIS_AUTH_PASSWORD_FILE env variable
242  // (QGIS_AUTH_PASSWORD_FILE variable removed from environment after accessing)
244 
245  QString defaultConfigFilePath;
246  QFileInfo projectFileInfo = defaultProjectFile(); //try to find a .qgs/.qgz file in the server directory
247  if ( projectFileInfo.exists() )
248  {
249  defaultConfigFilePath = projectFileInfo.absoluteFilePath();
250  QgsMessageLog::logMessage( "Using default project file: " + defaultConfigFilePath, QStringLiteral( "Server" ), Qgis::Info );
251  }
252  else
253  {
254  QFileInfo adminSLDFileInfo = defaultAdminSLD();
255  if ( adminSLDFileInfo.exists() )
256  {
257  defaultConfigFilePath = adminSLDFileInfo.absoluteFilePath();
258  }
259  }
260  // Store the config file path
261  sConfigFilePath = new QString( defaultConfigFilePath );
262 
263  //create cache for capabilities XML
264  sCapabilitiesCache = new QgsCapabilitiesCache();
265 
266  QgsFontUtils::loadStandardTestFonts( QStringList() << QStringLiteral( "Roman" ) << QStringLiteral( "Bold" ) );
267 
268  sServiceRegistry = new QgsServiceRegistry();
269 
270  sServerInterface = new QgsServerInterfaceImpl( sCapabilitiesCache, sServiceRegistry, sSettings() );
271 
272  // Load service module
273  QString modulePath = QgsApplication::libexecPath() + "server";
274  // qDebug() << QStringLiteral( "Initializing server modules from: %1" ).arg( modulePath );
275  sServiceRegistry->init( modulePath, sServerInterface );
276 
277  sInitialized = true;
278  QgsMessageLog::logMessage( QStringLiteral( "Server initialized" ), QStringLiteral( "Server" ), Qgis::Info );
279  return true;
280 }
281 
282 
283 
284 void QgsServer::putenv( const QString &var, const QString &val )
285 {
286  if ( val.isEmpty() )
287  {
288  qunsetenv( var.toUtf8().data() );
289  }
290  else
291  {
292  qputenv( var.toUtf8().data(), val.toUtf8() );
293  }
294  sSettings()->load( var );
295 }
296 
297 void QgsServer::handleRequest( QgsServerRequest &request, QgsServerResponse &response, const QgsProject *project )
298 {
300  QElapsedTimer time; //used for measuring request time if loglevel < 1
301 
302  qApp->processEvents();
303 
304  if ( logLevel == Qgis::Info )
305  {
306  time.start();
307  }
308 
309  // Pass the filters to the requestHandler, this is needed for the following reasons:
310  // Allow server request to call sendResponse plugin hook if enabled
311  QgsFilterResponseDecorator responseDecorator( sServerInterface->filters(), response );
312 
313  //Request handler
314  QgsRequestHandler requestHandler( request, response );
315 
316  try
317  {
318  // TODO: split parse input into plain parse and processing from specific services
319  requestHandler.parseInput();
320  }
321  catch ( QgsMapServiceException &e )
322  {
323  QgsMessageLog::logMessage( "Parse input exception: " + e.message(), QStringLiteral( "Server" ), Qgis::Critical );
324  requestHandler.setServiceException( e );
325  }
326 
327  // Set the request handler into the interface for plugins to manipulate it
328  sServerInterface->setRequestHandler( &requestHandler );
329 
330  // Initialize configfilepath so that is is available
331  // before calling plugin methods
332  // Note that plugins may still change that value using
333  // setConfigFilePath() interface method
334  if ( ! project )
335  {
336  QString configFilePath = configPath( *sConfigFilePath, request.serverParameters().map() );
337  sServerInterface->setConfigFilePath( configFilePath );
338  }
339  else
340  {
341  sServerInterface->setConfigFilePath( project->fileName() );
342  }
343 
344  // Call requestReady() method (if enabled)
345  // This may also throw exceptions if there are errors in python plugins code
346  try
347  {
348  responseDecorator.start();
349  }
350  catch ( QgsException &ex )
351  {
352  // Internal server error
353  response.sendError( 500, QStringLiteral( "Internal Server Error" ) );
354  QgsMessageLog::logMessage( ex.what(), QStringLiteral( "Server" ), Qgis::Critical );
355  }
356 
357  // Plugins may have set exceptions
358  if ( !requestHandler.exceptionRaised() )
359  {
360  try
361  {
362  const QgsServerParameters params = request.serverParameters();
363  printRequestParameters( params.toMap(), logLevel );
364 
365  // Setup project (config file path)
366  if ( ! project )
367  {
368  QString configFilePath = configPath( *sConfigFilePath, params.map() );
369 
370  // load the project if needed and not empty
371  project = mConfigCache->project( configFilePath, sServerInterface->serverSettings() );
372  }
373 
374  if ( project )
375  {
376  sServerInterface->setConfigFilePath( project->fileName() );
377  }
378 
379  // Dispatcher: if SERVICE is set, we assume a OWS service, if not, let's try an API
380  // TODO: QGIS 4 fix the OWS services and treat them as APIs
381  QgsServerApi *api = nullptr;
382  if ( params.service().isEmpty() && ( api = sServiceRegistry->apiForRequest( request ) ) )
383  {
384  QgsServerApiContext context { api->rootPath(), &request, &responseDecorator, project, sServerInterface };
385  api->executeRequest( context );
386  }
387  else
388  {
389 
390  // Project is mandatory for OWS at this point
391  if ( ! project )
392  {
393  throw QgsServerException( QStringLiteral( "Project file error. For OWS services: please provide a SERVICE and a MAP parameter pointing to a valid QGIS project file" ) );
394  }
395 
396  if ( ! params.fileName().isEmpty() )
397  {
398  const QString value = QString( "attachment; filename=\"%1\"" ).arg( params.fileName() );
399  requestHandler.setResponseHeader( QStringLiteral( "Content-Disposition" ), value );
400  }
401 
402  // Lookup for service
403  QgsService *service = sServiceRegistry->getService( params.service(), params.version() );
404  if ( service )
405  {
406  service->executeRequest( request, responseDecorator, project );
407  }
408  else
409  {
410  throw QgsOgcServiceException( QStringLiteral( "Service configuration error" ),
411  QStringLiteral( "Service unknown or unsupported. Current supported services (case-sensitive): WMS WFS WCS WMTS SampleService, or use a WFS3 (OGC API Features) endpoint" ) );
412  }
413  }
414  }
415  catch ( QgsServerException &ex )
416  {
417  responseDecorator.write( ex );
418  QString format;
419  QgsMessageLog::logMessage( ex.formatResponse( format ), QStringLiteral( "Server" ), Qgis::Warning );
420  }
421  catch ( QgsException &ex )
422  {
423  // Internal server error
424  response.sendError( 500, QStringLiteral( "Internal Server Error" ) );
425  QgsMessageLog::logMessage( ex.what(), QStringLiteral( "Server" ), Qgis::Critical );
426  }
427  }
428 
429  // Terminate the response
430  // This may also throw exceptions if there are errors in python plugins code
431  try
432  {
433  responseDecorator.finish();
434  }
435  catch ( QgsException &ex )
436  {
437  // Internal server error
438  response.sendError( 500, QStringLiteral( "Internal Server Error" ) );
439  QgsMessageLog::logMessage( ex.what(), QStringLiteral( "Server" ), Qgis::Critical );
440  }
441 
442 
443  // We are done using requestHandler in plugins, make sure we don't access
444  // to a deleted request handler from Python bindings
445  sServerInterface->clearRequestHandler();
446 
447  if ( logLevel == Qgis::Info )
448  {
449  QgsMessageLog::logMessage( "Request finished in " + QString::number( time.elapsed() ) + " ms", QStringLiteral( "Server" ), Qgis::Info );
450  }
451 }
452 
453 
454 #ifdef HAVE_SERVER_PYTHON_PLUGINS
455 void QgsServer::initPython()
456 {
457  // Init plugins
458  if ( ! QgsServerPlugins::initPlugins( sServerInterface ) )
459  {
460  QgsMessageLog::logMessage( QStringLiteral( "No server python plugins are available" ), QStringLiteral( "Server" ), Qgis::Info );
461  }
462  else
463  {
464  QgsMessageLog::logMessage( QStringLiteral( "Server python plugins loaded" ), QStringLiteral( "Server" ), Qgis::Info );
465  }
466 }
467 #endif
468 
QgsServiceRegistry::getService
QgsService * getService(const QString &name, const QString &version=QString())
Retrieve a service from its name.
Definition: qgsserviceregistry.cpp:89
QgsApplication::QGIS_ORGANIZATION_NAME
static const char * QGIS_ORGANIZATION_NAME
Definition: qgsapplication.h:147
QgsServerInterfaceImpl::serverSettings
QgsServerSettings * serverSettings() override
Returns the server settings.
Definition: qgsserverinterfaceimpl.cpp:117
QgsServerInterfaceImpl::setRequestHandler
void setRequestHandler(QgsRequestHandler *requestHandler) override
Set the request handler.
Definition: qgsserverinterfaceimpl.cpp:56
QgsException
Definition: qgsexception.h:34
QgsMapServiceException
Exception class for WMS service exceptions (for compatibility only).
Definition: qgsmapserviceexception.h:43
QgsServerApiContext
Definition: qgsserverapicontext.h:38
QgsCapabilitiesCache
Definition: qgscapabilitiescache.h:34
QgsServerParameters::toMap
QMap< QString, QString > toMap() const
Returns all parameters in a map.
Definition: qgsserverparameters.cpp:504
QgsFilterResponseDecorator::start
void start() SIP_THROW(QgsServerException)
Call filters requestReady() method.
Definition: qgsfilterresponsedecorator.cpp:30
qgsserverparameters.h
qgsauthmanager.h
QgsServer::handleRequest
void handleRequest(QgsServerRequest &request, QgsServerResponse &response, const QgsProject *project=nullptr)
Handles the request.
Definition: qgsserver.cpp:297
QgsServer::putenv
void putenv(const QString &var, const QString &val)
Set environment variable.
Definition: qgsserver.cpp:284
Qgis::Warning
@ Warning
Definition: qgis.h:104
QgsService
Definition: qgsservice.h:39
QgsConfigCache::instance
static QgsConfigCache * instance()
Returns the current instance.
Definition: qgsconfigcache.cpp:26
QgsApplication::prefixPath
static QString prefixPath()
Returns the path to the application prefix directory.
Definition: qgsapplication.cpp:534
QgsServerApi::rootPath
virtual const QString rootPath() const =0
Returns the root path for the API.
QgsApplication::init
static void init(QString profileFolder=QString())
This method initializes paths etc for QGIS.
Definition: qgsapplication.cpp:190
QgsApplication::qgisAuthDatabaseFilePath
static QString qgisAuthDatabaseFilePath()
Returns the path to the user authentication database file: qgis-auth.db.
Definition: qgsapplication.cpp:983
QgsApplication::svgPaths
static QStringList svgPaths()
Returns the paths to svg directories.
Definition: qgsapplication.cpp:1029
qgsservice.h
qgsmapserviceexception.h
QgsServerRequest
Definition: qgsserverrequest.h:38
QgsDebugMsg
#define QgsDebugMsg(str)
Definition: qgslogger.h:38
qgsfontutils.h
QgsServerInterfaceImpl::filters
QgsServerFiltersMap filters() override
Returns the list of current QgsServerFilter.
Definition: qgsserverinterfaceimpl.h:53
QgsFilterResponseDecorator::finish
void finish() override
Finish the response, ending the transaction.
Definition: qgsfilterresponsedecorator.cpp:41
QgsService::executeRequest
virtual void executeRequest(const QgsServerRequest &request, QgsServerResponse &response, const QgsProject *project)=0
Execute the requests and set result in QgsServerRequest.
QgsServerInterfaceImpl
Interfaces exposed by QGIS Server and made available to plugins.
Definition: qgsserverinterfaceimpl.h:35
QgsProject
Definition: qgsproject.h:92
QgsServerLogger::setLogLevel
void setLogLevel(Qgis::MessageLevel level)
Set the current log level.
Definition: qgsserverlogger.cpp:54
QgsApplication::skipGdalDriver
static void skipGdalDriver(const QString &driver)
Sets the GDAL_SKIP environment variable to include the specified driver and then calls GDALDriverMana...
Definition: qgsapplication.cpp:1635
QgsApplication::authManager
static QgsAuthManager * authManager()
Returns the application's authentication manager instance.
Definition: qgsapplication.cpp:1263
qgsapplication.h
QgsServerResponse::write
virtual void write(const QString &data)
Write string This is a convenient method that will write directly to the underlying I/O device.
Definition: qgsserverresponse.cpp:25
QgsServerSettings
Provides a way to retrieve settings by prioritizing according to environment variables,...
Definition: qgsserversettings.h:82
QgsServiceRegistry::apiForRequest
QgsServerApi * apiForRequest(const QgsServerRequest &request) const
Searches the API register for an API matching the request and returns a (possibly NULL) pointer to it...
Definition: qgsserviceregistry.cpp:227
QgsServerParameters::version
QString version() const
Returns VERSION parameter as a string or an empty string if not defined.
Definition: qgsserverparameters.cpp:477
QgsServerLogger::instance
static QgsServerLogger * instance()
Gets the singleton instance.
Definition: qgsserverlogger.cpp:22
qgscapabilitiescache.h
QgsServerRequest::serverParameters
QgsServerParameters serverParameters() const
Returns parameters.
Definition: qgsserverrequest.cpp:90
QgsServiceRegistry::init
void init(const QString &nativeModulepath, QgsServerInterface *serverIface=nullptr)
Initialize registry, load modules and auto register services.
Definition: qgsserviceregistry.cpp:335
qgsserverrequest.h
Qgis::Info
@ Info
Definition: qgis.h:103
qgsproviderregistry.h
qgsserverapi.h
qgsnetworkaccessmanager.h
QgsServerPlugins::initPlugins
static bool initPlugins(QgsServerInterface *interface)
Initializes the Python plugins.
Definition: qgsserverplugins.cpp:39
QgsException::what
QString what() const
Definition: qgsexception.h:48
QgsRequestHandler::parseInput
void parseInput()
Parses the input and creates a request neutral Parameter/Value map.
Definition: qgsrequesthandler.cpp:188
QgsApplication::createDatabase
static bool createDatabase(QString *errorMessage=nullptr)
initialize qgis.db
Definition: qgsapplication.cpp:1831
qgsserver.h
QgsApplication::QGIS_APPLICATION_NAME
static const char * QGIS_APPLICATION_NAME
Definition: qgsapplication.h:149
QgsServerParameters::service
QString service() const
Returns SERVICE parameter as a string or an empty string if not defined.
Definition: qgsserverparameters.cpp:487
QgsApplication::pkgDataPath
static QString pkgDataPath()
Returns the common root path of all application data directories.
Definition: qgsapplication.cpp:557
QgsProject::fileName
QString fileName
Definition: qgsproject.h:96
QgsRequestHandler::setResponseHeader
void setResponseHeader(const QString &name, const QString &value)
Sets an HTTP response header.
Definition: qgsrequesthandler.cpp:47
qgsserverlogger.h
QgsNetworkAccessManager
network access manager for QGIS
Definition: qgsnetworkaccessmanager.h:251
QgsOgcServiceException
Exception base class for service exceptions.
Definition: qgsserverexception.h:82
QgsNetworkAccessManager::instance
static QgsNetworkAccessManager * instance(Qt::ConnectionType connectionType=Qt::BlockingQueuedConnection)
Returns a pointer to the active QgsNetworkAccessManager for the current thread.
Definition: qgsnetworkaccessmanager.cpp:121
QgsFilterResponseDecorator
Class defining decorator for calling filter's hooks.
Definition: qgsfilterresponsedecorator.h:35
QgsServerLogger::setLogFile
void setLogFile(const QString &filename=QString())
Set the current log file.
Definition: qgsserverlogger.cpp:59
QgsServerParameters::map
QString map() const
Returns MAP parameter as a string or an empty string if not defined.
Definition: qgsserverparameters.cpp:472
QgsServerApi::executeRequest
virtual void executeRequest(const QgsServerApiContext &context) const =0
Executes a request by passing the given context to the API handlers.
QgsRequestHandler::exceptionRaised
bool exceptionRaised() const
Pointer to last raised exception.
Definition: qgsrequesthandler.cpp:42
Q_GLOBAL_STATIC
Q_GLOBAL_STATIC(QgsServerSettings, sSettings)
QgsFontUtils::loadStandardTestFonts
static bool loadStandardTestFonts(const QStringList &loadstyles)
Loads standard test fonts from filesystem or qrc resource.
Definition: qgsfontutils.cpp:225
QgsServerLogger::setLogStderr
void setLogStderr()
Activates logging to stderr.
Definition: qgsserverlogger.cpp:71
QgsRequestHandler::setServiceException
void setServiceException(const QgsServerException &ex)
Allow plugins to return a QgsMapServiceException.
Definition: qgsrequesthandler.cpp:140
Qgis::MessageLevel
MessageLevel
Level for messages This will be used both for message log and message bar in application.
Definition: qgis.h:101
QgsOgcServiceException::message
QString message() const
Returns the exception message.
Definition: qgsserverexception.h:94
QgsApplication::libexecPath
static QString libexecPath()
Returns the path with utility executables (help viewer, crssync, ...)
Definition: qgsapplication.cpp:1220
QgsServerException
Exception base class for server exceptions.
Definition: qgsserverexception.h:42
QgsServerInterfaceImpl::setConfigFilePath
void setConfigFilePath(const QString &configFilePath) override
Set the configuration file path.
Definition: qgsserverinterfaceimpl.cpp:61
QgsMessageLog::logMessage
static void logMessage(const QString &message, const QString &tag=QString(), Qgis::MessageLevel level=Qgis::Warning, bool notifyUser=true)
Adds a message to the log instance (and creates it if necessary).
Definition: qgsmessagelog.cpp:27
QgsServiceRegistry
Definition: qgsserviceregistry.h:49
QgsServerLogger::logLevel
Qgis::MessageLevel logLevel() const
Gets the current log level.
Definition: qgsserverlogger.h:63
QgsApplication::qgisUserDatabaseFilePath
static QString qgisUserDatabaseFilePath()
Returns the path to the user qgis.db file.
Definition: qgsapplication.cpp:978
Qgis::Critical
@ Critical
Definition: qgis.h:105
QgsServer::QgsServer
QgsServer()
Creates the server instance.
Definition: qgsserver.cpp:67
QgsServerException::formatResponse
virtual QByteArray formatResponse(QString &responseFormat) const
Formats the exception for sending to client.
Definition: qgsserverexception.cpp:30
QgsServerParameters
QgsServerParameters provides an interface to retrieve and manipulate global parameters received from ...
Definition: qgsserverparameters.h:228
QgsRequestHandler
Definition: qgsrequesthandler.h:38
QgsServerApi
Definition: qgsserverapi.h:80
QgsConfigCache::project
const QgsProject * project(const QString &path, QgsServerSettings *settings=nullptr)
If the project is not cached yet, then the project is read from the path.
Definition: qgsconfigcache.cpp:42
qgsrequesthandler.h
qgslogger.h
QgsServerParameters::fileName
QString fileName() const
Returns FILE_NAME parameter as a string or an empty string if not defined.
Definition: qgsserverparameters.cpp:482
QgsAuthManager::init
bool init(const QString &pluginPath=QString(), const QString &authDatabasePath=QString())
init initialize QCA, prioritize qca-ossl plugin and optionally set up the authentication database
Definition: qgsauthmanager.cpp:168
QgsProviderRegistry::instance
static QgsProviderRegistry * instance(const QString &pluginPath=QString())
Means of accessing canonical single instance.
Definition: qgsproviderregistry.cpp:48
QgsApplication::QGIS_ORGANIZATION_DOMAIN
static const char * QGIS_ORGANIZATION_DOMAIN
Definition: qgsapplication.h:148
qgsproject.h
QgsServerInterfaceImpl::clearRequestHandler
void clearRequestHandler() override
Clear the request handler.
Definition: qgsserverinterfaceimpl.cpp:51
QgsServerResponse::sendError
virtual void sendError(int code, const QString &message)=0
Send error This method delegates error handling at the server level.
QgsServerResponse
Definition: qgsserverresponse.h:43
qgsserverapicontext.h
QgsApplication::pluginPath
static QString pluginPath()
Returns the path to the application plugin directory.
Definition: qgsapplication.cpp:552
qgsfilterresponsedecorator.h