QGIS API Documentation 3.99.0-Master (09f76ad7019)
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 mHeaders.insert( key, value );
47}
48
50{
51 mStatusCode = code;
52}
53
54QString QgsBufferServerResponse::header( const QString &key ) const
55{
56 return mHeaders.value( key );
57}
58
60{
61 return mHeadersSent;
62}
63
64void QgsBufferServerResponse::sendError( int code, const QString &message )
65{
66 if ( mHeadersSent )
67 {
68 QgsMessageLog::logMessage( "Cannot send error after headers sent" );
69 return;
70 }
71
72 clear();
73 setStatusCode( code );
74 setHeader( u"Content-Type"_s, u"text/plain; charset=utf-8"_s );
75 write( message );
76 finish();
77}
78
80{
81 return &mBuffer;
82}
83
85{
86 if ( mFinished )
87 {
88 QgsMessageLog::logMessage( "finish() called twice" );
89 return;
90 }
91
92 if ( !mHeadersSent )
93 {
94 if ( !mHeaders.contains( "Content-Length" ) )
95 {
96 mHeaders.insert( u"Content-Length"_s, QString::number( mBuffer.pos() ) );
97 }
98 }
99 flush();
100 mFinished = true;
101}
102
104{
105 if ( !mHeadersSent )
106 {
107 mHeadersSent = true;
108 }
109
110 mBuffer.seek( 0 );
111 QByteArray &ba = mBuffer.buffer();
112 mBody.append( ba );
113 ba.clear();
114}
115
116
118{
119 mHeaders.clear();
120 mBuffer.seek( 0 );
121 mBuffer.buffer().clear();
122}
123
124
126{
127 return mBuffer.data();
128}
129
130
132{
133 mBuffer.seek( 0 );
134 mBuffer.buffer().clear();
135}
void setStatusCode(int code) override
Set the http status code.
void flush() override
Flushes the current output buffer to the network.
QString header(const QString &key) const override
Returns the header value.
QByteArray data() const override
Gets the data written so far.
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())
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.