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