QGIS API Documentation 3.43.0-Master (ebb4087afc0)
Loading...
Searching...
No Matches
qgshttpheaders.cpp
Go to the documentation of this file.
1/***************************************************************************
2 qgshttpheaders.cpp
3 This class implements simple http header management.
4
5 -------------------
6 begin : 2021-09-09
7 copyright : (C) 2021 B. De Mezzo
8 email : benoit dot de dot mezzo at oslandia dot com
9
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#include "qgshttpheaders.h"
22#include "qgssettings.h"
23
24
25#include <QDir>
26#include <QNetworkRequest>
27#include <QUrlQuery>
28#include <QDomElement>
29
30//
31// QgsHttpHeaders
32//
33
34const QString QgsHttpHeaders::PATH_PREFIX = "http-header/";
35const QString QgsHttpHeaders::PARAM_PREFIX = "http-header:";
36const QString QgsHttpHeaders::KEY_REFERER = "referer";
37
39
40QgsHttpHeaders::QgsHttpHeaders( const QVariantMap &headers )
41 : mHeaders( headers )
42{
43 mHeaders.detach(); // clone like
44}
45
46QgsHttpHeaders::QgsHttpHeaders( const QgsSettings &settings, const QString &key )
47{
48 setFromSettings( settings, key );
49}
50
51QgsHttpHeaders::QgsHttpHeaders( const QString &key )
52{
54}
55
56QgsHttpHeaders::QgsHttpHeaders( const QDomElement &element )
57{
58 setFromDomElement( element );
59}
60
62
63bool QgsHttpHeaders::updateNetworkRequest( QNetworkRequest &request ) const
64{
65 for ( auto ite = mHeaders.constBegin(); ite != mHeaders.constEnd(); ++ite )
66 {
67 request.setRawHeader( ite.key().toUtf8(), ite.value().toString().toUtf8() );
68 }
69 return true;
70}
71
72bool QgsHttpHeaders::updateUrlQuery( QUrlQuery &uri ) const
73{
74 for ( auto ite = mHeaders.constBegin(); ite != mHeaders.constEnd(); ++ite )
75 {
76 uri.addQueryItem( QgsHttpHeaders::PARAM_PREFIX + ite.key().toUtf8(), ite.value().toString().toUtf8() );
77 }
78 return true;
79}
80
81bool QgsHttpHeaders::updateSettings( QgsSettings &settings, const QString &key ) const
82{
83 QString keyFixed = sanitizeKey( key );
84 if ( !keyFixed.isEmpty() )
85 keyFixed = keyFixed + "/";
86
87 QString keyHH = keyFixed + QgsHttpHeaders::PATH_PREFIX;
88 settings.remove( keyHH ); // cleanup
89 for ( auto ite = mHeaders.constBegin(); ite != mHeaders.constEnd(); ++ite )
90 {
91 settings.setValue( keyHH + ite.key(), ite.value() );
92 }
93
94 if ( !mHeaders[QgsHttpHeaders::KEY_REFERER].toString().isEmpty() && settings.contains( keyFixed + QgsHttpHeaders::KEY_REFERER ) ) // backward comptibility
95 {
96 settings.setValue( keyFixed + QgsHttpHeaders::KEY_REFERER, mHeaders[QgsHttpHeaders::KEY_REFERER].toString() );
97 }
98
99// TODO REMOVE!
100#if 0
101 QgsLogger::debug( QString( "updateSettings key: %1" ).arg( keyFixed ) );
102 for ( auto k : settings.allKeys() )
103 if ( k.startsWith( keyFixed ) )
104 QgsLogger::debug( QString( "updateSettings in settings: %1=%2" ).arg( k, settings.value( k ).toString() ) );
105#endif
106 return true;
107}
108
109bool QgsHttpHeaders::updateMap( QVariantMap &map ) const
110{
111 for ( auto ite = mHeaders.constBegin(); ite != mHeaders.constEnd(); ++ite )
112 {
113 map.insert( QgsHttpHeaders::PARAM_PREFIX + ite.key().toUtf8(), ite.value().toString() );
114 }
115
116 if ( mHeaders.contains( QgsHttpHeaders::KEY_REFERER ) )
117 {
118 map.insert( QgsHttpHeaders::KEY_REFERER, mHeaders[QgsHttpHeaders::KEY_REFERER].toString() );
119 }
120
121 return true;
122}
123
124bool QgsHttpHeaders::updateDomElement( QDomElement &el ) const
125{
126 QMap<QString, QString> namespaceDeclarations;
127 return updateDomElement( el, namespaceDeclarations );
128}
129
130bool QgsHttpHeaders::updateDomElement( QDomElement &el, QMap<QString, QString> &namespaceDeclarations ) const
131{
132 QString httpHeaderURIPrefix( QgsHttpHeaders::PARAM_PREFIX );
133 httpHeaderURIPrefix.chop( 1 );
134
135 for ( auto ite = mHeaders.constBegin(); ite != mHeaders.constEnd(); ++ite )
136 {
137 namespaceDeclarations.insert( httpHeaderURIPrefix, QStringLiteral( "https://qgis.org/" ) + httpHeaderURIPrefix );
138 el.setAttribute( QgsHttpHeaders::PARAM_PREFIX + ite.key().toUtf8(), ite.value().toString() );
139 }
140
141 if ( mHeaders.contains( QgsHttpHeaders::KEY_REFERER ) )
142 {
143 el.setAttribute( QgsHttpHeaders::KEY_REFERER, mHeaders[QgsHttpHeaders::KEY_REFERER].toString() );
144 }
145
146 return true;
147}
148
149
150void QgsHttpHeaders::setFromSettings( const QgsSettings &settings, const QString &key )
151{
152 QString keyFixed = sanitizeKey( key );
153 if ( !keyFixed.isEmpty() )
154 keyFixed = keyFixed + "/";
155 QString keyHH = keyFixed + QgsHttpHeaders::PATH_PREFIX;
156
157#if 0
158 QgsLogger::debug( QString( "setFromSettings key: %1" ).arg( keyFixed ) );
159 for ( auto k : settings.allKeys() )
160 if ( k.startsWith( keyFixed ) )
161 QgsLogger::debug( QString( "setFromSettings called: %1=%2" ).arg( k, settings.value( k ).toString() ) );
162 QgsLogger::debug( QString( "setFromSettings keyHH: %1" ).arg( keyHH ) );
163#endif
164
165 QStringList keys = settings.allKeys();
166 for ( auto ite = keys.cbegin(); ite != keys.cend(); ++ite )
167 {
168 if ( ite->startsWith( keyHH ) )
169 {
170 QString name = ite->right( ite->size() - keyHH.size() );
171 mHeaders.insert( name, settings.value( *ite ).toString() );
172 }
173 }
174
175 if ( settings.contains( keyFixed + QgsHttpHeaders::KEY_REFERER ) ) // backward comptibility
176 {
177 mHeaders[QgsHttpHeaders::KEY_REFERER] = settings.value( keyFixed + QgsHttpHeaders::KEY_REFERER ).toString(); // retrieve value from old location
178 }
179
180#if 0
181 for ( auto k : mHeaders.keys() )
182 QgsLogger::debug( QString( "setFromSettings mHeaders[%1]=%2" ).arg( k, mHeaders[k].toString() ) );
183#endif
184}
185
186void QgsHttpHeaders::setFromUrlQuery( const QUrlQuery &uri )
187{
188 const auto constQueryItems = uri.queryItems( QUrl::ComponentFormattingOption::FullyDecoded );
189 for ( const QPair<QString, QString> &item : constQueryItems )
190 {
191 const QString &key = item.first;
192 if ( key.startsWith( QgsHttpHeaders::PARAM_PREFIX ) )
193 {
194 QString name = key.right( key.size() - QgsHttpHeaders::PARAM_PREFIX.size() );
195 mHeaders[sanitizeKey( name )] = item.second;
196 }
197 else if ( key == QgsHttpHeaders::KEY_REFERER ) // backward comptibility
198 {
199 mHeaders[QgsHttpHeaders::KEY_REFERER] = item.second;
200 }
201 }
202}
203
204void QgsHttpHeaders::setFromMap( const QVariantMap &map )
205{
206 for ( auto ite = map.keyBegin(); ite != map.keyEnd(); ++ite )
207 {
208 QString key = *ite;
209 if ( key.startsWith( QgsHttpHeaders::PARAM_PREFIX ) )
210 {
211 QString name = key.right( key.size() - QgsHttpHeaders::PARAM_PREFIX.size() );
212 mHeaders[sanitizeKey( name )] = map [key].toString();
213 }
214 }
215
216 if ( map.contains( QgsHttpHeaders::KEY_REFERER ) ) // backward comptibility
217 {
218 mHeaders[QgsHttpHeaders::KEY_REFERER] = map [QgsHttpHeaders::KEY_REFERER].toString();
219 }
220}
221
222
223void QgsHttpHeaders::setFromDomElement( const QDomElement &el )
224{
225 QDomNamedNodeMap attribs = el.attributes();
226
227 for ( int i = 0; i < attribs.length(); i++ )
228 {
229 QDomNode item = attribs.item( i );
230 QString key = item.nodeName();
231 if ( key.startsWith( QgsHttpHeaders::PARAM_PREFIX ) )
232 {
233 QString name = key.right( key.size() - QgsHttpHeaders::PARAM_PREFIX.size() );
234 mHeaders[sanitizeKey( name )] = item.nodeValue();
235 }
236 }
237
238 if ( attribs.contains( QgsHttpHeaders::KEY_REFERER ) ) // backward comptibility
239 {
240 mHeaders[QgsHttpHeaders::KEY_REFERER] = attribs.namedItem( QgsHttpHeaders::KEY_REFERER ).nodeValue();
241 }
242
243}
244
246{
247 QString out;
248 for ( auto ite = mHeaders.constBegin(); ite != mHeaders.constEnd(); ++ite )
249 {
250 out += QStringLiteral( " %1%2='%3'" ).arg( QgsHttpHeaders::PARAM_PREFIX, ite.key(), ite.value().toString() );
251 }
252
253 if ( !mHeaders [ QgsHttpHeaders::KEY_REFERER ].toString().isEmpty() )
254 out += QStringLiteral( " %1='%2'" ).arg( QgsHttpHeaders::KEY_REFERER, mHeaders [QgsHttpHeaders::KEY_REFERER].toString() );
255
256 return out;
257}
258
259
260
261// To clean the path
262QString QgsHttpHeaders::sanitizeKey( const QString &key ) const
263{
264 QString out = QDir::cleanPath( key );
265 return out;
266}
267
268
269QVariant &QgsHttpHeaders::operator[]( const QString &key )
270{
271 return mHeaders[sanitizeKey( key )];
272}
273
274const QVariant QgsHttpHeaders::operator[]( const QString &key ) const
275{
276 return mHeaders[sanitizeKey( key )];
277}
278
279QgsHttpHeaders &QgsHttpHeaders::operator = ( const QMap<QString, QVariant> &headers )
280{
281 mHeaders = headers;
282 return *this;
283}
284
285QList<QString> QgsHttpHeaders::keys() const
286{
287 return mHeaders.keys();
288}
289
290
291void QgsHttpHeaders::insert( const QString &key, const QVariant &val )
292{
293 QString k2 = key;
294
295 if ( k2.startsWith( QgsHttpHeaders::PARAM_PREFIX ) )
296 {
297 k2 = k2.right( k2.length() - QgsHttpHeaders::PARAM_PREFIX.length() );
298 }
299 mHeaders.insert( k2, val );
300}
301
303{
304 return mHeaders == other.mHeaders;
305}
306
308{
309 return !( *this == other );
310}
This class implements simple http header management.
Q_DECL_DEPRECATED bool updateDomElement(QDomElement &el) const
Updates a DOM element by adding all the HTTP headers.
QString toSpacedString() const
Returns key/value pairs as strings separated by space.
QString sanitizeKey(const QString &key) const
Returns a cleansed key.
Q_DECL_DEPRECATED bool updateSettings(QgsSettings &settings, const QString &key=QString()) const
Updates the settings by adding all the http headers in the path "key/PATH_PREFIX/".
QList< QString > keys() const
static const QString PARAM_PREFIX
Used in uri to pass headers as params.
QgsHttpHeaders & operator=(const QMap< QString, QVariant > &headers)
static const QString KEY_REFERER
Used in settings as the referer key.
bool updateMap(QVariantMap &map) const
Updates a map by adding all the HTTP headers.
QVariantMap headers() const
Returns the headers as a variant map.
bool updateUrlQuery(QUrlQuery &uri) const
Updates an uri by adding all the HTTP headers.
bool updateNetworkRequest(QNetworkRequest &request) const
Updates a request by adding all the HTTP headers.
void setFromSettings(const QgsSettings &settings, const QString &key=QString())
Loads headers from the settings.
void setFromMap(const QVariantMap &map)
Loads headers from the map.
void setFromUrlQuery(const QUrlQuery &uri)
Loads headers from the uri.
QVariant & operator[](const QString &key)
static const QString PATH_PREFIX
Used in settings as the group name.
void setFromDomElement(const QDomElement &element)
Loads headers from the element.
virtual ~QgsHttpHeaders()
default detructor
bool operator==(const QgsHttpHeaders &other) const
void insert(const QString &key, const QVariant &value)
insert a key with the specific value
bool operator!=(const QgsHttpHeaders &other) const
static void debug(const QString &msg, int debuglevel=1, const char *file=nullptr, const char *function=nullptr, int line=-1)
Goes to qDebug.
Definition qgslogger.cpp:59
This class is a composition of two QSettings instances:
Definition qgssettings.h:64
QVariant value(const QString &key, const QVariant &defaultValue=QVariant(), Section section=NoSection) const
Returns the value for setting key.
bool contains(const QString &key, QgsSettings::Section section=QgsSettings::NoSection) const
Returns true if there exists a setting called key; returns false otherwise.
void remove(const QString &key, QgsSettings::Section section=QgsSettings::NoSection)
Removes the setting key and any sub-settings of key in a section.
void setValue(const QString &key, const QVariant &value, QgsSettings::Section section=QgsSettings::NoSection)
Sets the value of setting key to value.
QStringList allKeys() const
Returns a list of all keys, including subkeys, that can be read using the QSettings object.