summaryrefslogtreecommitdiffstats
path: root/src/core/net
diff options
context:
space:
mode:
authorAllan Sandfeld Jensen <allan.jensen@qt.io>2020-01-23 11:01:28 +0100
committerAllan Sandfeld Jensen <allan.jensen@qt.io>2020-01-23 11:01:28 +0100
commit96ec21dc0b6560cb2b86b744393b69b655af655b (patch)
treee3d03ceb9c021c6e0d67aacc50691eb60ca932e3 /src/core/net
parentc67337856dbaf66df813a176379a9f0a6fda2470 (diff)
parentd7d40469b5bfad2cc1693ef663864d2b15d59687 (diff)
Merge branch '5.14' into 5.15
Diffstat (limited to 'src/core/net')
-rw-r--r--src/core/net/url_request_custom_job.cpp14
-rw-r--r--src/core/net/url_request_custom_job.h1
-rw-r--r--src/core/net/url_request_custom_job_proxy.cpp11
-rw-r--r--src/core/net/url_request_custom_job_proxy.h1
4 files changed, 24 insertions, 3 deletions
diff --git a/src/core/net/url_request_custom_job.cpp b/src/core/net/url_request_custom_job.cpp
index fe287d0b7..9f4185d0c 100644
--- a/src/core/net/url_request_custom_job.cpp
+++ b/src/core/net/url_request_custom_job.cpp
@@ -70,6 +70,7 @@ URLRequestCustomJob::URLRequestCustomJob(URLRequest *request,
{
m_device = nullptr;
m_error = 0;
+ m_firstBytePosition = 0;
}
URLRequestCustomJob::~URLRequestCustomJob()
@@ -185,6 +186,19 @@ bool URLRequestCustomJob::IsRedirectResponse(GURL *location, int *http_status_co
return false;
}
+void URLRequestCustomJob::SetExtraRequestHeaders(const HttpRequestHeaders &headers)
+{
+ std::string rangeHeader;
+ if (headers.GetHeader(HttpRequestHeaders::kRange, &rangeHeader)) {
+ std::vector<HttpByteRange> ranges;
+ if (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();
+ }
+ }
+}
+
int URLRequestCustomJob::ReadRawData(IOBuffer *buf, int bufSize)
{
DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
diff --git a/src/core/net/url_request_custom_job.h b/src/core/net/url_request_custom_job.h
index 071a0a84f..350650f98 100644
--- a/src/core/net/url_request_custom_job.h
+++ b/src/core/net/url_request_custom_job.h
@@ -71,6 +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);
protected:
virtual ~URLRequestCustomJob();
diff --git a/src/core/net/url_request_custom_job_proxy.cpp b/src/core/net/url_request_custom_job_proxy.cpp
index cd7e173ee..d2df64f2f 100644
--- a/src/core/net/url_request_custom_job_proxy.cpp
+++ b/src/core/net/url_request_custom_job_proxy.cpp
@@ -96,9 +96,14 @@ void URLRequestCustomJobProxy::reply(std::string mimeType, QIODevice *device)
if (m_client->m_device && !m_client->m_device->isReadable())
m_client->m_device->open(QIODevice::ReadOnly);
- qint64 size = m_client->m_device ? m_client->m_device->size() : -1;
- if (size > 0)
- m_client->notifyExpectedContentSize(size);
+ if (m_client->m_firstBytePosition > 0)
+ m_client->m_device->seek(m_client->m_firstBytePosition);
+
+ qint64 deviceSize = m_client->m_device ? m_client->m_device->size() : -1;
+ qint64 remainingBytes = deviceSize - m_client->m_firstBytePosition;
+ if (remainingBytes > 0)
+ m_client->notifyExpectedContentSize(remainingBytes);
+
if (m_client->m_device && m_client->m_device->isReadable()) {
m_started = true;
m_client->notifyHeadersComplete();
diff --git a/src/core/net/url_request_custom_job_proxy.h b/src/core/net/url_request_custom_job_proxy.h
index 7091c8319..db38083dd 100644
--- a/src/core/net/url_request_custom_job_proxy.h
+++ b/src/core/net/url_request_custom_job_proxy.h
@@ -67,6 +67,7 @@ public:
std::string m_charset;
GURL m_redirect;
QIODevice *m_device;
+ int64_t m_firstBytePosition;
int m_error;
virtual void notifyExpectedContentSize(qint64 size) = 0;
virtual void notifyHeadersComplete() = 0;