Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 1 // Copyright 2015 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. | |
| 4 | |
| 5 #include "mojo/fetcher/data_fetcher.h" | |
| 6 | |
| 7 #include "base/bind.h" | |
| 8 #include "base/files/file_path.h" | |
| 9 #include "base/location.h" | |
| 10 #include "base/logging.h" | |
| 11 #include "base/memory/scoped_ptr.h" | |
| 12 #include "base/thread_task_runner_handle.h" | |
| 13 #include "net/base/data_url.h" | |
| 14 #include "third_party/mojo/src/mojo/public/cpp/system/data_pipe.h" | |
| 15 | |
| 16 namespace mojo { | |
| 17 namespace fetcher { | |
| 18 | |
| 19 ScopedDataPipeConsumerHandle CreateConsumerHandleForString( | |
| 20 const std::string& data) { | |
| 21 uint32_t num_bytes = static_cast<uint32_t>(data.size()); | |
|
sky
2015/09/17 23:21:51
Might it be possible for the string to be bigger t
sadrul
2015/09/18 05:08:58
I suppose it could be. Perhaps we should check if
sky
2015/09/18 16:02:38
Fine by me.
| |
| 22 MojoCreateDataPipeOptions options; | |
| 23 options.struct_size = sizeof(MojoCreateDataPipeOptions); | |
| 24 options.flags = MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE; | |
| 25 options.element_num_bytes = 1; | |
| 26 options.capacity_num_bytes = num_bytes; | |
| 27 mojo::DataPipe data_pipe(options); | |
| 28 MojoResult result = | |
| 29 WriteDataRaw(data_pipe.producer_handle.get(), data.data(), &num_bytes, | |
| 30 MOJO_WRITE_DATA_FLAG_ALL_OR_NONE); | |
| 31 CHECK_EQ(MOJO_RESULT_OK, result); | |
| 32 return data_pipe.consumer_handle.Pass(); | |
| 33 } | |
| 34 | |
| 35 // static | |
| 36 void DataFetcher::Start(const GURL& url, const FetchCallback& loader_callback) { | |
| 37 // The object manages its own lifespan. | |
| 38 new DataFetcher(url, loader_callback); | |
| 39 } | |
| 40 | |
| 41 DataFetcher::DataFetcher(const GURL& url, const FetchCallback& loader_callback) | |
| 42 : Fetcher(loader_callback), url_(url) { | |
| 43 BuildAndDispatchResponse(); | |
| 44 } | |
| 45 | |
| 46 DataFetcher::~DataFetcher() {} | |
| 47 | |
| 48 void DataFetcher::BuildAndDispatchResponse() { | |
| 49 response_ = URLResponse::New(); | |
| 50 response_->url = url_.spec(); | |
| 51 | |
| 52 response_->status_code = 400; // Bad request | |
| 53 if (url_.SchemeIs(url::kDataScheme)) { | |
| 54 std::string mime_type, charset, data; | |
| 55 if (net::DataURL::Parse(url_, &mime_type, &charset, &data)) { | |
| 56 response_->status_code = 200; | |
| 57 response_->mime_type = mime_type; | |
| 58 response_->charset = charset; | |
| 59 if (!data.empty()) | |
| 60 response_->body = CreateConsumerHandleForString(data); | |
| 61 } | |
| 62 } | |
| 63 | |
| 64 base::ThreadTaskRunnerHandle::Get()->PostTask( | |
| 65 FROM_HERE, base::Bind(loader_callback_, | |
| 66 base::Passed(make_scoped_ptr<Fetcher>(this)))); | |
| 67 } | |
| 68 | |
| 69 const GURL& DataFetcher::GetURL() const { | |
| 70 return url_; | |
| 71 } | |
| 72 | |
| 73 GURL DataFetcher::GetRedirectURL() const { | |
| 74 return GURL::EmptyGURL(); | |
| 75 } | |
| 76 | |
| 77 GURL DataFetcher::GetRedirectReferer() const { | |
| 78 return GURL::EmptyGURL(); | |
| 79 } | |
| 80 | |
| 81 URLResponsePtr DataFetcher::AsURLResponse(base::TaskRunner* task_runner, | |
| 82 uint32_t skip) { | |
| 83 DCHECK(response_); | |
| 84 return response_.Pass(); | |
| 85 } | |
| 86 | |
| 87 void DataFetcher::AsPath( | |
| 88 base::TaskRunner* task_runner, | |
| 89 base::Callback<void(const base::FilePath&, bool)> callback) { | |
| 90 NOTIMPLEMENTED(); | |
| 91 base::ThreadTaskRunnerHandle::Get()->PostTask( | |
| 92 FROM_HERE, base::Bind(callback, base::FilePath(), false)); | |
| 93 } | |
| 94 | |
| 95 std::string DataFetcher::MimeType() { | |
| 96 DCHECK(response_); | |
| 97 return response_->mime_type; | |
| 98 } | |
| 99 | |
| 100 bool DataFetcher::HasMojoMagic() { | |
| 101 return false; | |
| 102 } | |
| 103 | |
| 104 bool DataFetcher::PeekFirstLine(std::string* line) { | |
| 105 // This is only called for 'mojo magic' (i.e. detecting shebang'ed | |
| 106 // content-handler. Since HasMojoMagic() returns false above, this should | |
| 107 // never be reached. | |
| 108 NOTREACHED(); | |
| 109 return false; | |
| 110 } | |
| 111 | |
| 112 } // namespace fetcher | |
| 113 } // namespace mojo | |
| OLD | NEW |