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))
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 =
AtomBrowserContext::From("", false);
v8::Local<v8::Value> value;
@ -393,7 +397,8 @@ void AtomURLLoaderFactory::StartLoadingHttp(
new URLPipeLoader(
url_loader_factory, std::move(request), std::move(loader),
std::move(client),
static_cast<net::NetworkTrafficAnnotationTag>(traffic_annotation));
static_cast<net::NetworkTrafficAnnotationTag>(traffic_annotation),
std::move(upload_data));
}
// static

View file

@ -15,7 +15,8 @@ URLPipeLoader::URLPipeLoader(
std::unique_ptr<network::ResourceRequest> 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<network::SharedURLLoaderFactory> factory,
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_->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);
}

View file

@ -35,14 +35,16 @@ class URLPipeLoader : public network::mojom::URLLoader,
std::unique_ptr<network::ResourceRequest> 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<network::SharedURLLoaderFactory> factory,
std::unique_ptr<network::ResourceRequest> 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);

View file

@ -10,6 +10,7 @@
#include <vector>
#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<v8::Value> Converter<network::ResourceRequest>::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<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();
}