Skip to content

Commit 009ee57

Browse files
committedJan 25, 2019
Allow access to content of POST requests in QgsNetworkReplyContent
1 parent 8120e4a commit 009ee57

File tree

4 files changed

+65
-4
lines changed

4 files changed

+65
-4
lines changed
 

‎python/core/auto_generated/qgsnetworkaccessmanager.sip.in

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,8 @@ Default constructor.
3030

3131
QgsNetworkRequestParameters( QNetworkAccessManager::Operation operation,
3232
const QNetworkRequest &request,
33-
int requestId );
33+
int requestId,
34+
const QByteArray &content = QByteArray() );
3435
%Docstring
3536
Constructor for QgsNetworkRequestParameters, with the specified network
3637
``operation`` and original ``request``.
@@ -57,6 +58,12 @@ Returns a string identifying the thread which the request originated from.
5758
int requestId() const;
5859
%Docstring
5960
Returns a unique ID identifying the request.
61+
%End
62+
63+
QByteArray content() const;
64+
%Docstring
65+
Returns the request's content. This is only used for POST or PUT operation
66+
requests.
6067
%End
6168

6269
};

‎src/core/qgsnetworkaccessmanager.cpp

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232

3333
#include <QUrl>
3434
#include <QTimer>
35+
#include <QBuffer>
3536
#include <QNetworkReply>
3637
#include <QThreadStorage>
3738
#include <QAuthenticator>
@@ -206,8 +207,13 @@ QNetworkReply *QgsNetworkAccessManager::createRequest( QNetworkAccessManager::Op
206207

207208
static QAtomicInt sRequestId = 0;
208209
const int requestId = ++sRequestId;
210+
QByteArray content;
211+
if ( QBuffer *buffer = qobject_cast<QBuffer *>( outgoingData ) )
212+
{
213+
content = buffer->buffer();
214+
}
209215

210-
emit requestAboutToBeCreated( QgsNetworkRequestParameters( op, req, requestId ) );
216+
emit requestAboutToBeCreated( QgsNetworkRequestParameters( op, req, requestId, content ) );
211217
Q_NOWARN_DEPRECATED_PUSH
212218
emit requestAboutToBeCreated( op, req, outgoingData );
213219
Q_NOWARN_DEPRECATED_POP
@@ -423,10 +429,11 @@ void QgsNetworkAccessManager::setupDefaultProxyAndCache( Qt::ConnectionType conn
423429
// QgsNetworkRequestParameters
424430
//
425431

426-
QgsNetworkRequestParameters::QgsNetworkRequestParameters( QNetworkAccessManager::Operation operation, const QNetworkRequest &request, int requestId )
432+
QgsNetworkRequestParameters::QgsNetworkRequestParameters( QNetworkAccessManager::Operation operation, const QNetworkRequest &request, int requestId, const QByteArray &content )
427433
: mOperation( operation )
428434
, mRequest( request )
429435
, mOriginatingThreadId( QStringLiteral( "0x%2" ).arg( reinterpret_cast<quintptr>( QThread::currentThread() ), 2 * QT_POINTER_SIZE, 16, QLatin1Char( '0' ) ) )
430436
, mRequestId( requestId )
437+
, mContent( content )
431438
{
432439
}

‎src/core/qgsnetworkaccessmanager.h

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,8 @@ class CORE_EXPORT QgsNetworkRequestParameters
5050
*/
5151
QgsNetworkRequestParameters( QNetworkAccessManager::Operation operation,
5252
const QNetworkRequest &request,
53-
int requestId );
53+
int requestId,
54+
const QByteArray &content = QByteArray() );
5455

5556
/**
5657
* Returns the request operation, e.g. GET or POST.
@@ -75,12 +76,19 @@ class CORE_EXPORT QgsNetworkRequestParameters
7576
*/
7677
int requestId() const { return mRequestId; }
7778

79+
/**
80+
* Returns the request's content. This is only used for POST or PUT operation
81+
* requests.
82+
*/
83+
QByteArray content() const { return mContent; }
84+
7885
private:
7986

8087
QNetworkAccessManager::Operation mOperation;
8188
QNetworkRequest mRequest;
8289
QString mOriginatingThreadId;
8390
int mRequestId = 0;
91+
QByteArray mContent;
8492
};
8593

8694
/**

‎tests/src/core/testqgsnetworkaccessmanager.cpp

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ class TestQgsNetworkAccessManager : public QObject
5959
void fetchEmptyUrl(); //test fetching blank url
6060
void fetchBadUrl(); //test fetching bad url
6161
void fetchEncodedContent(); //test fetching url content encoded as utf-8
62+
void fetchPost();
6263
void fetchBadSsl();
6364
void fetchTimeout();
6465

@@ -235,6 +236,44 @@ void TestQgsNetworkAccessManager::fetchEncodedContent()
235236
thread->deleteLater();
236237
}
237238

239+
void TestQgsNetworkAccessManager::fetchPost()
240+
{
241+
if ( QgsTest::isTravis() )
242+
QSKIP( "This test is disabled on Travis CI environment" );
243+
244+
QObject context;
245+
//test fetching from a blank url
246+
bool loaded = false;
247+
bool gotRequestAboutToBeCreatedSignal = false;
248+
int requestId = -1;
249+
QUrl u = QUrl::fromLocalFile( QStringLiteral( TEST_DATA_DIR ) + '/' + "encoded_html.html" );
250+
connect( QgsNetworkAccessManager::instance(), qgis::overload< QgsNetworkRequestParameters >::of( &QgsNetworkAccessManager::requestAboutToBeCreated ), &context, [&]( const QgsNetworkRequestParameters & params )
251+
{
252+
gotRequestAboutToBeCreatedSignal = true;
253+
requestId = params.requestId();
254+
QVERIFY( requestId > 0 );
255+
QCOMPARE( params.operation(), QNetworkAccessManager::GetOperation );
256+
QCOMPARE( params.request().url(), u );
257+
QCOMPARE( params.content(), QByteArray( "a=b&c=d" ) );
258+
} );
259+
connect( QgsNetworkAccessManager::instance(), qgis::overload< QgsNetworkReplyContent >::of( &QgsNetworkAccessManager::finished ), &context, [&]( const QgsNetworkReplyContent & reply )
260+
{
261+
QCOMPARE( reply.error(), QNetworkReply::NoError );
262+
QCOMPARE( reply.requestId(), requestId );
263+
QVERIFY( reply.rawHeaderList().contains( "Content-Length" ) );
264+
QCOMPARE( reply.request().url(), u );
265+
loaded = true;
266+
} );
267+
QgsNetworkAccessManager::instance()->post( QNetworkRequest( u ), QByteArray( "a=b&c=d" ) );
268+
269+
while ( !loaded )
270+
{
271+
qApp->processEvents();
272+
}
273+
274+
QVERIFY( gotRequestAboutToBeCreatedSignal );
275+
}
276+
238277
void TestQgsNetworkAccessManager::fetchBadSsl()
239278
{
240279
if ( QgsTest::isTravis() )

0 commit comments

Comments
 (0)
Please sign in to comment.