summaryrefslogtreecommitdiffstats
path: root/src/core/net
diff options
context:
space:
mode:
authorSzabolcs David <davidsz@inf.u-szeged.hu>2020-01-20 13:04:10 +0100
committerAllan Sandfeld Jensen <allan.jensen@qt.io>2020-01-24 09:15:17 +0100
commitfe9de69e014457de39ddb09c5773f546613e9727 (patch)
tree60e0c962fba753d383bd336fe06577e4ee310b88 /src/core/net
parent96ec21dc0b6560cb2b86b744393b69b655af655b (diff)
Support Range headers in custom URLRequestJobs
This is essential when Chromium tries to load media files in multiple jobs over custom protocols, like qrc. Allow subsequent jobs to continue reading media files from specified positions to avoid media glitches and errors. Implemented with network service. Change-Id: I8df963ce94015ff65316dd6e0b6f2fcc77c20427 Reviewed-by: Allan Sandfeld Jensen <allan.jensen@qt.io>
Diffstat (limited to 'src/core/net')
-rw-r--r--src/core/net/custom_url_loader_factory.cpp11
-rw-r--r--src/core/net/url_request_custom_job.cpp2
-rw-r--r--src/core/net/url_request_custom_job.h2
3 files changed, 13 insertions, 2 deletions
diff --git a/src/core/net/custom_url_loader_factory.cpp b/src/core/net/custom_url_loader_factory.cpp
index a9e7e1c34..f6485c56b 100644
--- a/src/core/net/custom_url_loader_factory.cpp
+++ b/src/core/net/custom_url_loader_factory.cpp
@@ -123,6 +123,7 @@ private:
{
m_binding.set_connection_error_handler(
base::BindOnce(&CustomURLLoader::OnConnectionError, base::Unretained(this)));
+ m_firstBytePosition = 0;
m_device = nullptr;
m_error = 0;
QWebEngineUrlScheme scheme = QWebEngineUrlScheme::schemeByName(QByteArray::fromStdString(request.url.scheme()));
@@ -145,6 +146,16 @@ private:
if (!m_request.referrer.is_empty())
headers.emplace("Referer", m_request.referrer.spec());
+ std::string rangeHeader;
+ if (m_request.headers.GetHeader(net::HttpRequestHeaders::kRange, &rangeHeader)) {
+ std::vector<net::HttpByteRange> ranges;
+ if (net::HttpUtil::ParseRangeHeader(rangeHeader, &ranges)) {
+ // Chromium doesn't support multiple range requests in one single URL request.
+ if (ranges.size() == 1)
+ m_firstBytePosition = ranges[0].first_byte_position();
+ }
+ }
+
// m_taskRunner->PostTask(FROM_HERE,
base::PostTaskWithTraits(FROM_HERE, { content::BrowserThread::UI },
base::BindOnce(&URLRequestCustomJobProxy::initialize, m_proxy,
diff --git a/src/core/net/url_request_custom_job.cpp b/src/core/net/url_request_custom_job.cpp
index 9f4185d0c..1f6e6abf7 100644
--- a/src/core/net/url_request_custom_job.cpp
+++ b/src/core/net/url_request_custom_job.cpp
@@ -69,8 +69,8 @@ URLRequestCustomJob::URLRequestCustomJob(URLRequest *request,
.flags().testFlag(QWebEngineUrlScheme::CorsEnabled))
{
m_device = nullptr;
- m_error = 0;
m_firstBytePosition = 0;
+ m_error = 0;
}
URLRequestCustomJob::~URLRequestCustomJob()
diff --git a/src/core/net/url_request_custom_job.h b/src/core/net/url_request_custom_job.h
index 350650f98..517f68c3f 100644
--- a/src/core/net/url_request_custom_job.h
+++ b/src/core/net/url_request_custom_job.h
@@ -71,7 +71,7 @@ public:
bool GetCharset(std::string *charset) override;
void GetResponseInfo(net::HttpResponseInfo *info) override;
bool IsRedirectResponse(GURL *location, int *http_status_code, bool *insecure_scheme_was_upgraded) override;
- void SetExtraRequestHeaders(const net::HttpRequestHeaders &headers);
+ void SetExtraRequestHeaders(const net::HttpRequestHeaders &headers) override;
protected:
virtual ~URLRequestCustomJob();