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/custom_url_loader_factory.cpp | |
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/custom_url_loader_factory.cpp')
-rw-r--r-- | src/core/net/custom_url_loader_factory.cpp | 11 |
1 files changed, 11 insertions, 0 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, |