QGIS API Documentation  3.26.3-Buenos Aires (65e4edfdad)
qgsserverstatichandler.cpp
Go to the documentation of this file.
1 /***************************************************************************
2  qgsserverstatichandler.cpp - QgsServerStaticHandler
3 
4  ---------------------
5  begin : 30.7.2020
6  copyright : (C) 2020 by Alessandro Pasotti
7  email : elpaso at itopen dot it
8  ***************************************************************************
9  * *
10  * This program is free software; you can redistribute it and/or modify *
11  * it under the terms of the GNU General Public License as published by *
12  * the Free Software Foundation; either version 2 of the License, or *
13  * (at your option) any later version. *
14  * *
15  ***************************************************************************/
16 #include "qgsserverstatichandler.h"
17 #include "qgsmessagelog.h"
18 #include "qgsserverresponse.h"
19 
20 #include <QFile>
21 #include <QMimeDatabase>
22 
23 
24 QgsServerStaticHandler::QgsServerStaticHandler( const QString &pathRegExp, const QString &staticPathSuffix )
25  : mPathRegExp( pathRegExp )
26  , mStaticPathSuffix( staticPathSuffix )
27 {
28  setContentTypes( { QgsServerOgcApi::ContentType::HTML } );
29 }
30 
32 {
33  const QRegularExpressionMatch match { path().match( context.request()->url().path( ) ) };
34  if ( ! match.hasMatch() )
35  {
36  throw QgsServerApiNotFoundError( QStringLiteral( "Static file was not found" ) );
37  }
38 
39  const QString staticFilePath { match.captured( QStringLiteral( "staticFilePath" ) ) };
40  // Calculate real path
41  QString filePath { staticPath( context ) };
42  if ( ! mStaticPathSuffix.isEmpty() )
43  {
44  filePath += '/' + mStaticPathSuffix;
45  }
46  filePath += '/' + staticFilePath;
47  if ( ! QFile::exists( filePath ) )
48  {
49  QgsMessageLog::logMessage( QStringLiteral( "Static file was not found: %1" ).arg( filePath ), QStringLiteral( "Server" ), Qgis::MessageLevel::Info );
50  throw QgsServerApiNotFoundError( QStringLiteral( "Static file %1 was not found" ).arg( staticFilePath ) );
51  }
52 
53  QFile f( filePath );
54  if ( ! f.open( QIODevice::ReadOnly ) )
55  {
56  throw QgsServerApiInternalServerError( QStringLiteral( "Could not open static file %1" ).arg( staticFilePath ) );
57  }
58 
59  const qint64 size { f.size() };
60  const QByteArray content { f.readAll() };
61  const QMimeType mimeType { QMimeDatabase().mimeTypeForFile( filePath )};
62  context.response()->setHeader( QStringLiteral( "Content-Type" ), mimeType.name() );
63  context.response()->setHeader( QStringLiteral( "Content-Length" ), QString::number( size ) );
64  context.response()->write( content );
65 }
QgsServerStaticHandler::handleRequest
void handleRequest(const QgsServerApiContext &context) const override
Handles the request within its context.
Definition: qgsserverstatichandler.cpp:31
QgsServerApiContext
The QgsServerApiContext class encapsulates the resources for a particular client request: the request...
Definition: qgsserverapicontext.h:38
QgsServerOgcApiHandler::staticPath
virtual const QString staticPath(const QgsServerApiContext &context) const
Returns the absolute path to the base directory where static resources for this handler are stored in...
Definition: qgsserverogcapihandler.cpp:253
QgsServerApiNotFoundError
Not found error API exception.
Definition: qgsserverexception.h:223
QgsServerApiInternalServerError
Internal server error API exception.
Definition: qgsserverexception.h:202
QgsServerOgcApiHandler::setContentTypes
void setContentTypes(const QList< QgsServerOgcApi::ContentType > &contentTypes)
Set the content types to contentTypes.
Definition: qgsserverogcapihandler.cpp:600
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
qgsserverresponse.h
qgsserverstatichandler.h
QgsServerApiContext::response
QgsServerResponse * response() const
Returns the server response object.
Definition: qgsserverapicontext.cpp:39
QgsMessageLog::logMessage
static void logMessage(const QString &message, const QString &tag=QString(), Qgis::MessageLevel level=Qgis::MessageLevel::Warning, bool notifyUser=true)
Adds a message to the log instance (and creates it if necessary).
Definition: qgsmessagelog.cpp:27
QgsServerStaticHandler::path
QRegularExpression path() const override
URL pattern for this handler, named capture group are automatically extracted and returned by values(...
Definition: qgsserverstatichandler.h:58
QgsServerRequest::url
QUrl url() const
Definition: qgsserverrequest.cpp:86
QgsServerApiContext::request
const QgsServerRequest * request() const
Returns the server request object.
Definition: qgsserverapicontext.cpp:33
QgsServerStaticHandler::QgsServerStaticHandler
QgsServerStaticHandler(const QString &pathRegExp=QStringLiteral("/static/(?<staticFilePath>.*)$"), const QString &staticPathSuffix=QString())
Creates QgsServerStaticHandler.
Definition: qgsserverstatichandler.cpp:24
QgsServerResponse::setHeader
virtual void setHeader(const QString &key, const QString &value)=0
Set Header entry Add Header entry to the response Note that it is usually an error to set Header afte...
qgsmessagelog.h