From a5bdc6236ad52586579a9a3da6a059835ed60761 Mon Sep 17 00:00:00 2001 From: Allan Sandfeld Jensen Date: Mon, 23 Jul 2018 15:06:11 +0200 Subject: Add HTTP request headers to custom URL schemes Makes it possible to read extra headers added to the request. Change-Id: I4af0ba8a5b28488b8f12a2cff29807575c24f026 Reviewed-by: Michal Klocek --- src/core/api/qwebengineurlrequestjob.cpp | 9 +++++++++ src/core/api/qwebengineurlrequestjob.h | 1 + src/core/net/url_request_custom_job.cpp | 20 ++++++++++++++++++-- src/core/net/url_request_custom_job_delegate.cpp | 11 +++++++++-- src/core/net/url_request_custom_job_delegate.h | 6 +++++- src/core/net/url_request_custom_job_proxy.cpp | 5 +++-- src/core/net/url_request_custom_job_proxy.h | 2 +- 7 files changed, 46 insertions(+), 8 deletions(-) (limited to 'src') diff --git a/src/core/api/qwebengineurlrequestjob.cpp b/src/core/api/qwebengineurlrequestjob.cpp index c028a1167..1c262d3b0 100644 --- a/src/core/api/qwebengineurlrequestjob.cpp +++ b/src/core/api/qwebengineurlrequestjob.cpp @@ -124,6 +124,15 @@ QUrl QWebEngineUrlRequestJob::initiator() const return d_ptr->initiator(); } +/*! + \since 5.12 + Returns any HTTP headers added to the request. +*/ +const QMap &QWebEngineUrlRequestJob::requestHeaders() const +{ + return d_ptr->requestHeaders(); +} + /*! Replies to the request with \a device and the MIME type \a contentType. diff --git a/src/core/api/qwebengineurlrequestjob.h b/src/core/api/qwebengineurlrequestjob.h index 7ce8be7ec..55ec7c6d2 100644 --- a/src/core/api/qwebengineurlrequestjob.h +++ b/src/core/api/qwebengineurlrequestjob.h @@ -73,6 +73,7 @@ public: QUrl requestUrl() const; QByteArray requestMethod() const; QUrl initiator() const; + const QMap &requestHeaders() const; void reply(const QByteArray &contentType, QIODevice *device); void fail(Error error); diff --git a/src/core/net/url_request_custom_job.cpp b/src/core/net/url_request_custom_job.cpp index c69fb1808..f4dfc6ae9 100644 --- a/src/core/net/url_request_custom_job.cpp +++ b/src/core/net/url_request_custom_job.cpp @@ -39,10 +39,13 @@ #include "url_request_custom_job.h" #include "url_request_custom_job_proxy.h" +#include "../type_conversion.h" + #include "content/public/browser/browser_thread.h" #include "net/base/io_buffer.h" #include +#include using namespace net; @@ -76,9 +79,22 @@ URLRequestCustomJob::~URLRequestCustomJob() void URLRequestCustomJob::Start() { DCHECK_CURRENTLY_ON(content::BrowserThread::IO); + HttpRequestHeaders requestHeaders = request()->extra_request_headers(); + QMap headers; + net::HttpRequestHeaders::Iterator it(requestHeaders); + while (it.GetNext()) + headers.insert(toQByteArray(it.name()), toQByteArray(it.value())); + if (!request()->referrer().empty()) + headers.insert(QByteArray("Referer"), toQByteArray(request()->referrer())); + + // TODO: handle UploadDataStream, for instance using a QIODevice wrapper. + content::BrowserThread::PostTask(content::BrowserThread::UI, FROM_HERE, - base::Bind(&URLRequestCustomJobProxy::initialize, - m_proxy, request()->url(), request()->method(), request()->initiator())); + base::Bind(&URLRequestCustomJobProxy::initialize, m_proxy, + request()->url(), + request()->method(), + request()->initiator(), + headers)); } void URLRequestCustomJob::Kill() diff --git a/src/core/net/url_request_custom_job_delegate.cpp b/src/core/net/url_request_custom_job_delegate.cpp index 338bd7137..4ed6a2484 100644 --- a/src/core/net/url_request_custom_job_delegate.cpp +++ b/src/core/net/url_request_custom_job_delegate.cpp @@ -51,11 +51,13 @@ namespace QtWebEngineCore { URLRequestCustomJobDelegate::URLRequestCustomJobDelegate(URLRequestCustomJobProxy *proxy, const QUrl &url, const QByteArray &method, - const QUrl &initiatorOrigin) + const QUrl &initiatorOrigin, + const QMap &headers) : m_proxy(proxy), m_request(url), m_method(method), - m_initiatorOrigin(initiatorOrigin) + m_initiatorOrigin(initiatorOrigin), + m_requestHeaders(headers) { } @@ -78,6 +80,11 @@ QUrl URLRequestCustomJobDelegate::initiator() const return m_initiatorOrigin; } +const QMap &URLRequestCustomJobDelegate::requestHeaders() const +{ + return m_requestHeaders; +} + void URLRequestCustomJobDelegate::reply(const QByteArray &contentType, QIODevice *device) { if (device) diff --git a/src/core/net/url_request_custom_job_delegate.h b/src/core/net/url_request_custom_job_delegate.h index caabfcf99..9de0224f9 100644 --- a/src/core/net/url_request_custom_job_delegate.h +++ b/src/core/net/url_request_custom_job_delegate.h @@ -54,6 +54,7 @@ #include "base/memory/ref_counted.h" #include "qtwebenginecoreglobal_p.h" +#include #include #include @@ -80,6 +81,7 @@ public: QUrl url() const; QByteArray method() const; QUrl initiator() const; + const QMap &requestHeaders() const; void reply(const QByteArray &contentType, QIODevice *device); void redirect(const QUrl& url); @@ -93,13 +95,15 @@ private: URLRequestCustomJobDelegate(URLRequestCustomJobProxy *proxy, const QUrl &url, const QByteArray &method, - const QUrl &initiatorOrigin); + const QUrl &initiatorOrigin, + const QMap &requestHeaders); friend class URLRequestCustomJobProxy; scoped_refptr m_proxy; QUrl m_request; QByteArray m_method; QUrl m_initiatorOrigin; + const QMap m_requestHeaders; }; } // namespace diff --git a/src/core/net/url_request_custom_job_proxy.cpp b/src/core/net/url_request_custom_job_proxy.cpp index 5280318ad..10ca4d0b1 100644 --- a/src/core/net/url_request_custom_job_proxy.cpp +++ b/src/core/net/url_request_custom_job_proxy.cpp @@ -152,7 +152,7 @@ void URLRequestCustomJobProxy::readyRead() m_job->notifyReadyRead(); } -void URLRequestCustomJobProxy::initialize(GURL url, std::string method, base::Optional initiator) +void URLRequestCustomJobProxy::initialize(GURL url, std::string method, base::Optional initiator, QMap headers) { DCHECK_CURRENTLY_ON(content::BrowserThread::UI); Q_ASSERT(!m_delegate); @@ -169,7 +169,8 @@ void URLRequestCustomJobProxy::initialize(GURL url, std::string method, base::Op if (schemeHandler) { m_delegate = new URLRequestCustomJobDelegate(this, toQt(url), QByteArray::fromStdString(method), - initiatorOrigin); + initiatorOrigin, + headers); QWebEngineUrlRequestJob *requestJob = new QWebEngineUrlRequestJob(m_delegate); schemeHandler->requestStarted(requestJob); } diff --git a/src/core/net/url_request_custom_job_proxy.h b/src/core/net/url_request_custom_job_proxy.h index 3986fe119..1f4494945 100644 --- a/src/core/net/url_request_custom_job_proxy.h +++ b/src/core/net/url_request_custom_job_proxy.h @@ -72,7 +72,7 @@ public: void abort(); void fail(int error); void release(); - void initialize(GURL url, std::string method, base::Optional initiatorOrigin); + void initialize(GURL url, std::string method, base::Optional initiatorOrigin, QMap headers); void readyRead(); // IO thread owned: -- cgit v1.2.3