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:
parent
e5d1e7b4da
commit
0e3ab7c128
4 changed files with 51 additions and 7 deletions
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue