1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "chrome/browser/extensions/blob_reader.h"
7 #include "base/format_macros.h"
8 #include "base/strings/string_util.h"
9 #include "base/strings/stringprintf.h"
10 #include "chrome/browser/profiles/profile.h"
11 #include "content/public/browser/browser_thread.h"
12 #include "net/http/http_request_headers.h"
13 #include "net/http/http_response_headers.h"
14 #include "net/url_request/url_fetcher.h"
15 #include "net/url_request/url_request_context.h"
16 #include "net/url_request/url_request_context_getter.h"
18 BlobReader::BlobReader(Profile
* profile
,
19 const std::string
& blob_uuid
,
20 BlobReadCallback callback
)
21 : callback_(callback
) {
22 DCHECK_CURRENTLY_ON(content::BrowserThread::UI
);
24 if (StartsWithASCII(blob_uuid
, "blob:blobinternal", true)) {
25 // TODO(michaeln): remove support for deprecated blob urls
26 blob_url
= GURL(blob_uuid
);
28 blob_url
= GURL(std::string("blob:uuid/") + blob_uuid
);
30 DCHECK(blob_url
.is_valid());
31 fetcher_
.reset(net::URLFetcher::Create(
32 blob_url
, net::URLFetcher::GET
,
34 fetcher_
->SetRequestContext(profile
->GetRequestContext());
37 BlobReader::~BlobReader() { DCHECK_CURRENTLY_ON(content::BrowserThread::UI
); }
39 void BlobReader::SetByteRange(int64 offset
, int64 length
) {
40 DCHECK_CURRENTLY_ON(content::BrowserThread::UI
);
43 CHECK_LE(offset
, kint64max
- length
);
45 net::HttpRequestHeaders headers
;
47 net::HttpRequestHeaders::kRange
,
48 base::StringPrintf("bytes=%" PRId64
"-%" PRId64
, offset
,
49 offset
+ length
- 1));
50 fetcher_
->SetExtraRequestHeaders(headers
.ToString());
53 void BlobReader::Start() {
54 DCHECK_CURRENTLY_ON(content::BrowserThread::UI
);
58 // Overridden from net::URLFetcherDelegate.
59 void BlobReader::OnURLFetchComplete(const net::URLFetcher
* source
) {
60 DCHECK_CURRENTLY_ON(content::BrowserThread::UI
);
61 scoped_ptr
<std::string
> response(new std::string
);
62 int64 first
= 0, last
= 0, length
= 0;
63 source
->GetResponseAsString(response
.get());
64 source
->GetResponseHeaders()->GetContentRange(&first
, &last
, &length
);
65 callback_
.Run(response
.Pass(), length
);