diff --git a/atom/browser/net/atom_url_loader_factory.cc b/atom/browser/net/atom_url_loader_factory.cc index 2acfa03cf9..331b82914c 100644 --- a/atom/browser/net/atom_url_loader_factory.cc +++ b/atom/browser/net/atom_url_loader_factory.cc @@ -372,6 +372,10 @@ void AtomURLLoaderFactory::StartLoadingHttp( if (!dict.Get("method", &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 browser_context = AtomBrowserContext::From("", false); v8::Local value; @@ -393,7 +397,8 @@ void AtomURLLoaderFactory::StartLoadingHttp( new URLPipeLoader( url_loader_factory, std::move(request), std::move(loader), std::move(client), - static_cast(traffic_annotation)); + static_cast(traffic_annotation), + std::move(upload_data)); } // static diff --git a/atom/browser/net/url_pipe_loader.cc b/atom/browser/net/url_pipe_loader.cc index a75d796005..c3f0f3f367 100644 --- a/atom/browser/net/url_pipe_loader.cc +++ b/atom/browser/net/url_pipe_loader.cc @@ -15,7 +15,8 @@ URLPipeLoader::URLPipeLoader( std::unique_ptr request, network::mojom::URLLoaderRequest loader, network::mojom::URLLoaderClientPtr client, - const net::NetworkTrafficAnnotationTag& annotation) + const net::NetworkTrafficAnnotationTag& annotation, + base::DictionaryValue upload_data) : binding_(this, std::move(loader)), client_(std::move(client)), weak_factory_(this) { @@ -26,7 +27,7 @@ URLPipeLoader::URLPipeLoader( base::SequencedTaskRunnerHandle::Get()->PostTask( FROM_HERE, base::BindOnce(&URLPipeLoader::Start, weak_factory_.GetWeakPtr(), factory, - std::move(request), annotation)); + std::move(request), annotation, std::move(upload_data))); } URLPipeLoader::~URLPipeLoader() = default; @@ -34,10 +35,19 @@ URLPipeLoader::~URLPipeLoader() = default; void URLPipeLoader::Start( scoped_refptr factory, std::unique_ptr request, - const net::NetworkTrafficAnnotationTag& annotation) { + const net::NetworkTrafficAnnotationTag& annotation, + base::DictionaryValue upload_data) { loader_ = network::SimpleURLLoader::Create(std::move(request), annotation); loader_->SetOnResponseStartedCallback(base::Bind( &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); } diff --git a/atom/browser/net/url_pipe_loader.h b/atom/browser/net/url_pipe_loader.h index bf17783bc7..b41629b65d 100644 --- a/atom/browser/net/url_pipe_loader.h +++ b/atom/browser/net/url_pipe_loader.h @@ -35,14 +35,16 @@ class URLPipeLoader : public network::mojom::URLLoader, std::unique_ptr request, network::mojom::URLLoaderRequest loader, network::mojom::URLLoaderClientPtr client, - const net::NetworkTrafficAnnotationTag& annotation); + const net::NetworkTrafficAnnotationTag& annotation, + base::DictionaryValue upload_data); private: ~URLPipeLoader() override; void Start(scoped_refptr factory, std::unique_ptr request, - const net::NetworkTrafficAnnotationTag& annotation); + const net::NetworkTrafficAnnotationTag& annotation, + base::DictionaryValue upload_data); void NotifyComplete(int result); void OnResponseStarted(const GURL& final_url, const network::ResourceResponseHead& response_head); diff --git a/atom/common/native_mate_converters/net_converter.cc b/atom/common/native_mate_converters/net_converter.cc index 27859c6e83..aed3d9c102 100644 --- a/atom/common/native_mate_converters/net_converter.cc +++ b/atom/common/native_mate_converters/net_converter.cc @@ -10,6 +10,7 @@ #include #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/node_includes.h" #include "base/strings/string_number_conversions.h" @@ -237,7 +238,33 @@ v8::Local Converter::ToV8( for (net::HttpRequestHeaders::Iterator it(val.headers); it.GetNext();) headers.Set(it.name(), it.value()); 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 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(i), + upload_data.GetHandle()) + .Check(); + } + dict.Set("uploadData", arr); + } return dict.GetHandle(); }