26 QMap<QgsServerOgcApi::ContentType, QStringList> QgsServerOgcApi::sContentTypeMime = [ ]() -> QMap<QgsServerOgcApi::ContentType, QStringList>
28 QMap<QgsServerOgcApi::ContentType, QStringList> map;
29 map[QgsServerOgcApi::ContentType::JSON] = QStringList { QStringLiteral(
"application/json" ) };
30 map[QgsServerOgcApi::ContentType::GEOJSON] = QStringList {
31 QStringLiteral(
"application/geo+json" ),
32 QStringLiteral(
"application/vnd.geo+json" ),
33 QStringLiteral(
"application/geojson" )
35 map[QgsServerOgcApi::ContentType::HTML] = QStringList { QStringLiteral(
"text/html" ) };
36 map[QgsServerOgcApi::ContentType::OPENAPI3] = QStringList { QStringLiteral(
"application/vnd.oai.openapi+json;version=3.0" ) };
37 map[QgsServerOgcApi::ContentType::XML] = QStringList { QStringLiteral(
"application/xml" ) };
41 QHash<QgsServerOgcApi::ContentType, QList<QgsServerOgcApi::ContentType>> QgsServerOgcApi::sContentTypeAliases = [ ]() -> QHash<ContentType, QList<ContentType>>
43 QHash<QgsServerOgcApi::ContentType, QList<QgsServerOgcApi::ContentType>> map;
44 map[ContentType::JSON] = { QgsServerOgcApi::ContentType::GEOJSON, QgsServerOgcApi::ContentType::OPENAPI3 };
51 mRootPath( rootPath ),
53 mDescription( description ),
66 std::shared_ptr<QgsServerOgcApiHandler> hp( handler );
67 mHandlers.emplace_back( std::move( hp ) );
73 QUrl u { url.adjusted( QUrl::StripTrailingSlash | QUrl::NormalizePathSegments ) };
74 if ( u.path().contains( QLatin1String(
"//" ) ) )
76 u.setPath( u.path().replace( QLatin1String(
"//" ), QChar(
'/' ) ) );
79 if ( !u.path().startsWith(
'/' ) )
81 u.setPath( u.path().prepend(
'/' ) );
91 auto hasMatch {
false };
92 for (
const auto &handler : mHandlers )
94 QgsMessageLog::logMessage( QStringLiteral(
"Checking API path %1 for %2 " ).arg( path, handler->path().pattern() ), QStringLiteral(
"Server" ), Qgis::MessageLevel::Info );
95 if ( handler->path().match( path ).hasMatch() )
99 QgsMessageLog::logMessage( QStringLiteral(
"API %1: found handler %2" ).arg(
name(), QString::fromStdString( handler->operationId() ) ), QStringLiteral(
"Server" ), Qgis::MessageLevel::Info );
103 handler->handleRequest( context );
105 catch ( json::exception &ex )
121 return sContentTypeMime;
126 return sContentTypeAliases;
131 static const QMetaEnum metaEnum = QMetaEnum::fromType<QgsServerOgcApi::Rel>();
132 std::string val { metaEnum.valueToKey( rel ) };
133 std::replace( val.begin(), val.end(),
'_',
'-' );
139 static const QMetaEnum metaEnum = QMetaEnum::fromType<ContentType>();
140 QString result { metaEnum.valueToKey( ct ) };
141 return result.replace(
'_',
'-' );
146 static const QMetaEnum metaEnum = QMetaEnum::fromType<ContentType>();
147 return metaEnum.valueToKey( ct );
157 const QString exts = QString::fromStdString( extension );
159 for (
auto it = constMimeTypes.constBegin();
160 it != constMimeTypes.constEnd();
163 const auto constValues = it.value();
164 for (
const auto &value : constValues )
166 if ( value.contains( exts, Qt::CaseSensitivity::CaseInsensitive ) )
173 QgsMessageLog::logMessage( QStringLiteral(
"Content type for extension %1 not found! Returning default (JSON)" ).arg( exts ),
174 QStringLiteral(
"Server" ),
175 Qgis::MessageLevel::Warning );
176 return QgsServerOgcApi::ContentType::JSON;
181 if ( ! sContentTypeMime.contains( contentType ) )
185 return sContentTypeMime.value( contentType ).first().toStdString();