diff options
author | Szabolcs David <davidsz@inf.u-szeged.hu> | 2020-01-20 13:04:10 +0100 |
---|---|---|
committer | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2020-01-24 09:15:17 +0100 |
commit | fe9de69e014457de39ddb09c5773f546613e9727 (patch) | |
tree | 60e0c962fba753d383bd336fe06577e4ee310b88 /src/core/net | |
parent | 96ec21dc0b6560cb2b86b744393b69b655af655b (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.cpp | 11 | ||||
-rw-r--r-- | src/core/net/url_request_custom_job.cpp | 2 | ||||
-rw-r--r-- | src/core/net/url_request_custom_job.h | 2 |
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(); |