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))
|
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
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue