QGIS API Documentation 4.1.0-Master (659fe69c07c)
Loading...
Searching...
No Matches
qgsbufferserverresponse.cpp
Go to the documentation of this file.
1/***************************************************************************
2 qgsbufferserverresponse.cpp
3
4 Define response wrapper for buffer response
5 -------------------
6 begin : 2017-01-03
7 copyright : (C) 2017 by David Marteau
8 email : david dot marteau at 3liz dot com
9 ***************************************************************************/
10
11/***************************************************************************
12 * *
13 * This program is free software; you can redistribute it and/or modify *
14 * it under the terms of the GNU General Public License as published by *
15 * the Free Software Foundation; either version 2 of the License, or *
16 * (at your option) any later version. *
17 * *
18 ***************************************************************************/
19
21
22#include "qgsmessagelog.h"
23
24#include <QString>
25
26using namespace Qt::StringLiterals;
27
28//
29// QgsBufferServerResponse
30//
31
33{
34 mBuffer.open( QIODevice::ReadWrite );
35}
36
37void QgsBufferServerResponse::removeHeader( const QString &key )
38{
39 if ( !mHeadersSent )
40 mHeaders.remove( key );
41}
42
43void QgsBufferServerResponse::setHeader( const QString &key, const QString &value )
44{
45 if ( !mHeadersSent )
46 {
47 mHeaders[key] = QList<QString>() << value;
48 }
49}
50
51void QgsBufferServerResponse::addHeader( const QString &key, const QString &value )
52{
53 if ( !mHeadersSent )
54 {
55 if ( !mHeaders.contains( key ) )
56 {
57 mHeaders[key] = QList<QString>();
58 }
59 mHeaders[key].append( value );
60 }
61}
62
64{
65 mStatusCode = code;
66}
67
68QString QgsBufferServerResponse::header( const QString &key ) const
69{
70 const QList<QString> values = mHeaders.value( key );
71 return values.isEmpty() ? QString() : values.last();
72}
73
74QMap<QString, QString> QgsBufferServerResponse::headers() const
75{
76 QMap<QString, QString> singleHeaders;
77 for ( auto it = mHeaders.keyBegin(); it != mHeaders.keyEnd(); ++it )
78 {
80 singleHeaders.insert( *it, header( *it ) );
82 }
83 return singleHeaders;
84}
85
87{
88 return mHeadersSent;
89}
90
91void QgsBufferServerResponse::sendError( int code, const QString &message )
92{
93 if ( mHeadersSent )
94 {
95 QgsMessageLog::logMessage( "Cannot send error after headers sent" );
96 return;
97 }
98
99 clear();
100 setStatusCode( code );
101 setHeader( u"Content-Type"_s, u"text/plain; charset=utf-8"_s );
102 write( message );
103 finish();
104}
105
107{
108 return &mBuffer;
109}
110
112{
113 if ( mFinished )
114 {
115 QgsMessageLog::logMessage( "finish() called twice" );
116 return;
117 }
118
119 if ( !mHeadersSent )
120 {
121 if ( !mHeaders.contains( "Content-Length" ) )
122 {
123 mHeaders.insert( u"Content-Length"_s, QList<QString>() << QString::number( mBuffer.pos() ) );
124 }
125 }
126 flush();
127 mFinished = true;
128}
129
131{
132 if ( !mHeadersSent )
133 {
134 mHeadersSent = true;
135 }
136
137 mBuffer.seek( 0 );
138 QByteArray &ba = mBuffer.buffer();
139 mBody.append( ba );
140 ba.clear();
141}
142
143
145{
146 mHeaders.clear();
147 mBuffer.seek( 0 );
148 mBuffer.buffer().clear();
149}
150
151
153{
154 return mBuffer.data();
155}
156
157
159{
160 mBuffer.seek( 0 );
161 mBuffer.buffer().clear();
162}
163
164
165QList<QString> QgsBufferServerResponse::fullHeader( const QString &key ) const
166{
167 return mHeaders.value( key );
168}
Q_DECL_DEPRECATED QMap< QString, QString > headers() const override
Returns all the headers as a map: only the last value is returned if multiple values are set for the ...
void setStatusCode(int code) override
Set the http status code.
void flush() override
Flushes the current output buffer to the network.
virtual QList< QString > fullHeader(const QString &key) const override
Returns all the values for a header key.
Q_DECL_DEPRECATED QString header(const QString &key) const override
Returns a single header value, or an empty string if the header is not set.
QByteArray data() const override
Gets the data written so far.
void addHeader(const QString &key, const QString &value) override
Add a header value for the given key, without replacing any existing value for the same key Add Heade...
void finish() override
Finish the response, ending the transaction.
void sendError(int code, const QString &message) override
Send error This method delegates error handling at the server level.
void setHeader(const QString &key, const QString &value) override
Set Header entry Add Header entry to the response Note that it is usually an error to set Header afte...
void clear() override
Reset all headers and content for this response.
bool headersSent() const override
Returns true if the headers have already been sent.
void truncate() override
Truncate data.
void removeHeader(const QString &key) override
Clear header Undo a previous 'setHeader' call.
QIODevice * io() override
Returns the underlying QIODevice.
static void logMessage(const QString &message, const QString &tag=QString(), Qgis::MessageLevel level=Qgis::MessageLevel::Warning, bool notifyUser=true, const char *file=__builtin_FILE(), const char *function=__builtin_FUNCTION(), int line=__builtin_LINE(), Qgis::StringFormat format=Qgis::StringFormat::PlainText)
Adds a message to the log instance (and creates it if necessary).
virtual void write(const QString &data)
Write string This is a convenient method that will write directly to the underlying I/O device.
#define Q_NOWARN_DEPRECATED_POP
Definition qgis.h:7938
#define Q_NOWARN_DEPRECATED_PUSH
Definition qgis.h:7937