feat: migrate protocol module to NetworkService (Part 12) (#18726)

* Support "uploadData" in "request" argument

* Support "uploadData" option in http handler

* Fix building on win32
This commit is contained in:
Cheng Zhao 2019-06-12 08:37:06 +09:00 committed by GitHub
parent e5d1e7b4da
commit 0e3ab7c128
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 51 additions and 7 deletions

View file

@ -372,6 +372,10 @@ void AtomURLLoaderFactory::StartLoadingHttp(
if (!dict.Get("method", &request->method)) if (!dict.Get("method", &request->method))
request->method = original_request.method; request->method = original_request.method;
base::DictionaryValue upload_data;
if (request->method != "GET" && request->method != "HEAD")
dict.Get("uploadData", &upload_data);
scoped_refptr<AtomBrowserContext> browser_context = scoped_refptr<AtomBrowserContext> browser_context =
AtomBrowserContext::From("", false); AtomBrowserContext::From("", false);
v8::Local<v8::Value> value; v8::Local<v8::Value> value;
@ -393,7 +397,8 @@ void AtomURLLoaderFactory::StartLoadingHttp(
new URLPipeLoader( new URLPipeLoader(
url_loader_factory, std::move(request), std::move(loader), url_loader_factory, std::move(request), std::move(loader),
std::move(client), std::move(client),
static_cast<net::NetworkTrafficAnnotationTag>(traffic_annotation)); static_cast<net::NetworkTrafficAnnotationTag>(traffic_annotation),
std::move(upload_data));
} }
// static // static

View file

@ -15,7 +15,8 @@ URLPipeLoader::URLPipeLoader(
std::unique_ptr<network::ResourceRequest> request, std::unique_ptr<network::ResourceRequest> request,
network::mojom::URLLoaderRequest loader, network::mojom::URLLoaderRequest loader,
network::mojom::URLLoaderClientPtr client, network::mojom::URLLoaderClientPtr client,
const net::NetworkTrafficAnnotationTag& annotation) const net::NetworkTrafficAnnotationTag& annotation,
base::DictionaryValue upload_data)
: binding_(this, std::move(loader)), : binding_(this, std::move(loader)),
client_(std::move(client)), client_(std::move(client)),
weak_factory_(this) { weak_factory_(this) {
@ -26,7 +27,7 @@ URLPipeLoader::URLPipeLoader(
base::SequencedTaskRunnerHandle::Get()->PostTask( base::SequencedTaskRunnerHandle::Get()->PostTask(
FROM_HERE, FROM_HERE,
base::BindOnce(&URLPipeLoader::Start, weak_factory_.GetWeakPtr(), factory, base::BindOnce(&URLPipeLoader::Start, weak_factory_.GetWeakPtr(), factory,
std::move(request), annotation)); std::move(request), annotation, std::move(upload_data)));
} }
URLPipeLoader::~URLPipeLoader() = default; URLPipeLoader::~URLPipeLoader() = default;
@ -34,10 +35,19 @@ URLPipeLoader::~URLPipeLoader() = default;
void URLPipeLoader::Start( void URLPipeLoader::Start(
scoped_refptr<network::SharedURLLoaderFactory> factory, scoped_refptr<network::SharedURLLoaderFactory> factory,
std::unique_ptr<network::ResourceRequest> request, std::unique_ptr<network::ResourceRequest> request,
const net::NetworkTrafficAnnotationTag& annotation) { const net::NetworkTrafficAnnotationTag& annotation,
base::DictionaryValue upload_data) {
loader_ = network::SimpleURLLoader::Create(std::move(request), annotation); loader_ = network::SimpleURLLoader::Create(std::move(request), annotation);
loader_->SetOnResponseStartedCallback(base::Bind( loader_->SetOnResponseStartedCallback(base::Bind(
&URLPipeLoader::OnResponseStarted, weak_factory_.GetWeakPtr())); &URLPipeLoader::OnResponseStarted, weak_factory_.GetWeakPtr()));
// TODO(zcbenz): The old protocol API only supports string as upload data,
// we should seek to support more types in future.
std::string content_type, data;
if (upload_data.GetString("contentType", &content_type) &&
upload_data.GetString("data", &data))
loader_->AttachStringForUpload(data, content_type);
loader_->DownloadAsStream(factory.get(), this); loader_->DownloadAsStream(factory.get(), this);
} }

View file

@ -35,14 +35,16 @@ class URLPipeLoader : public network::mojom::URLLoader,
std::unique_ptr<network::ResourceRequest> request, std::unique_ptr<network::ResourceRequest> request,
network::mojom::URLLoaderRequest loader, network::mojom::URLLoaderRequest loader,
network::mojom::URLLoaderClientPtr client, network::mojom::URLLoaderClientPtr client,
const net::NetworkTrafficAnnotationTag& annotation); const net::NetworkTrafficAnnotationTag& annotation,
base::DictionaryValue upload_data);
private: private:
~URLPipeLoader() override; ~URLPipeLoader() override;
void Start(scoped_refptr<network::SharedURLLoaderFactory> factory, void Start(scoped_refptr<network::SharedURLLoaderFactory> factory,
std::unique_ptr<network::ResourceRequest> request, std::unique_ptr<network::ResourceRequest> request,
const net::NetworkTrafficAnnotationTag& annotation); const net::NetworkTrafficAnnotationTag& annotation,
base::DictionaryValue upload_data);
void NotifyComplete(int result); void NotifyComplete(int result);
void OnResponseStarted(const GURL& final_url, void OnResponseStarted(const GURL& final_url,
const network::ResourceResponseHead& response_head); const network::ResourceResponseHead& response_head);

View file

@ -10,6 +10,7 @@
#include <vector> #include <vector>
#include "atom/common/native_mate_converters/gurl_converter.h" #include "atom/common/native_mate_converters/gurl_converter.h"
#include "atom/common/native_mate_converters/string16_converter.h"
#include "atom/common/native_mate_converters/value_converter.h" #include "atom/common/native_mate_converters/value_converter.h"
#include "atom/common/node_includes.h" #include "atom/common/node_includes.h"
#include "base/strings/string_number_conversions.h" #include "base/strings/string_number_conversions.h"
@ -237,7 +238,33 @@ v8::Local<v8::Value> Converter<network::ResourceRequest>::ToV8(
for (net::HttpRequestHeaders::Iterator it(val.headers); it.GetNext();) for (net::HttpRequestHeaders::Iterator it(val.headers); it.GetNext();)
headers.Set(it.name(), it.value()); headers.Set(it.name(), it.value());
dict.Set("headers", headers); dict.Set("headers", headers);
// FIXME(zcbenz): Figure out how to support uploadData. if (val.request_body) {
const auto& elements = *val.request_body->elements();
v8::Local<v8::Array> arr = v8::Array::New(isolate, elements.size());
for (size_t i = 0; i < elements.size(); ++i) {
const auto& element = elements[i];
mate::Dictionary upload_data(isolate, v8::Object::New(isolate));
switch (element.type()) {
case network::mojom::DataElementType::kFile:
upload_data.Set("file", element.path().value());
break;
case network::mojom::DataElementType::kBytes:
upload_data.Set("bytes", node::Buffer::Copy(isolate, element.bytes(),
element.length())
.ToLocalChecked());
break;
case network::mojom::DataElementType::kBlob:
upload_data.Set("blobUUID", element.blob_uuid());
break;
default:
NOTREACHED() << "Found unsupported data element";
}
arr->Set(isolate->GetCurrentContext(), static_cast<uint32_t>(i),
upload_data.GetHandle())
.Check();
}
dict.Set("uploadData", arr);
}
return dict.GetHandle(); return dict.GetHandle();
} }