From 4b3011f3e88a186cc34bde023c403e297be1c4e9 Mon Sep 17 00:00:00 2001 From: Samuel Attard Date: Sat, 28 Jul 2018 00:15:48 +1000 Subject: [PATCH] feat: add getUploadProgress API to the net API (#13783) --- atom/browser/api/atom_api_url_request.cc | 13 +++++++++++++ atom/browser/api/atom_api_url_request.h | 1 + atom/browser/net/atom_url_request.cc | 12 ++++++++++++ atom/browser/net/atom_url_request.h | 1 + docs/api/client-request.md | 14 ++++++++++++++ lib/browser/api/net.js | 4 ++++ 6 files changed, 45 insertions(+) diff --git a/atom/browser/api/atom_api_url_request.cc b/atom/browser/api/atom_api_url_request.cc index 51c7969e31f4..9f18d97d2656 100644 --- a/atom/browser/api/atom_api_url_request.cc +++ b/atom/browser/api/atom_api_url_request.cc @@ -125,6 +125,18 @@ bool URLRequest::ResponseState::Failed() const { return IsFlagSet(ResponseStateFlags::kFailed); } +mate::Dictionary URLRequest::GetUploadProgress(v8::Isolate* isolate) { + mate::Dictionary progress = mate::Dictionary::CreateEmpty(isolate); + + if (atom_request_) { + progress.Set("active", true); + atom_request_->GetUploadProgress(&progress); + } else { + progress.Set("active", false); + } + return progress; +} + URLRequest::URLRequest(v8::Isolate* isolate, v8::Local wrapper) { InitWith(isolate, wrapper); } @@ -183,6 +195,7 @@ void URLRequest::BuildPrototype(v8::Isolate* isolate, .SetMethod("setChunkedUpload", &URLRequest::SetChunkedUpload) .SetMethod("followRedirect", &URLRequest::FollowRedirect) .SetMethod("_setLoadFlags", &URLRequest::SetLoadFlags) + .SetMethod("getUploadProgress", &URLRequest::GetUploadProgress) .SetProperty("notStarted", &URLRequest::NotStarted) .SetProperty("finished", &URLRequest::Finished) // Response APi diff --git a/atom/browser/api/atom_api_url_request.h b/atom/browser/api/atom_api_url_request.h index 3b5e667d7590..4a5a2b65160b 100644 --- a/atom/browser/api/atom_api_url_request.h +++ b/atom/browser/api/atom_api_url_request.h @@ -112,6 +112,7 @@ class URLRequest : public mate::EventEmitter { void OnResponseData(scoped_refptr data); void OnResponseCompleted(); void OnError(const std::string& error, bool isRequestError); + mate::Dictionary GetUploadProgress(v8::Isolate* isolate); protected: explicit URLRequest(v8::Isolate* isolate, v8::Local wrapper); diff --git a/atom/browser/net/atom_url_request.cc b/atom/browser/net/atom_url_request.cc index 1aac780d8821..8c0fbc4987bd 100644 --- a/atom/browser/net/atom_url_request.cc +++ b/atom/browser/net/atom_url_request.cc @@ -504,4 +504,16 @@ void AtomURLRequest::InformDelegateErrorOccured(const std::string& error, delegate_->OnError(error, isRequestError); } +void AtomURLRequest::GetUploadProgress(mate::Dictionary* progress) const { + net::UploadProgress upload_progress; + if (request_) { + progress->Set("started", true); + upload_progress = request_->GetUploadProgress(); + } else { + progress->Set("started", false); + } + progress->Set("current", upload_progress.position()); + progress->Set("total", upload_progress.size()); +} + } // namespace atom diff --git a/atom/browser/net/atom_url_request.h b/atom/browser/net/atom_url_request.h index 2b03ad7bc37c..fde7b161385f 100644 --- a/atom/browser/net/atom_url_request.h +++ b/atom/browser/net/atom_url_request.h @@ -43,6 +43,7 @@ class AtomURLRequest : public base::RefCountedThreadSafe, void PassLoginInformation(const base::string16& username, const base::string16& password) const; void SetLoadFlags(int flags) const; + void GetUploadProgress(mate::Dictionary* progress) const; protected: // Overrides of net::URLRequest::Delegate diff --git a/docs/api/client-request.md b/docs/api/client-request.md index 5cd9562b654a..586c17e37ac1 100644 --- a/docs/api/client-request.md +++ b/docs/api/client-request.md @@ -215,3 +215,17 @@ response object,it will emit the `aborted` event. #### `request.followRedirect()` Continues any deferred redirection request when the redirection mode is `manual`. + +#### `request.getUploadProgress()` + +Returns `Object`: + +* `active` Boolean - Whether the request is currently active. If this is false +no other properties will be set +* `started` Boolean - Whether the upload has started. If this is false both +`current` and `total` will be set to 0. +* `current` Integer - The number of bytes that have been uploaded so far +* `total` Integer - The number of bytes that will be uploaded this request + +You can use this method in conjunction with `POST` requests to get the progress +of a file upload or other data transfer. diff --git a/lib/browser/api/net.js b/lib/browser/api/net.js index 54ef99d407ff..3f2d470a2703 100644 --- a/lib/browser/api/net.js +++ b/lib/browser/api/net.js @@ -352,6 +352,10 @@ class ClientRequest extends EventEmitter { abort () { this.urlRequest.cancel() } + + getUploadProgress () { + return this.urlRequest.getUploadProgress() + } } function writeAfterEndNT (self, error, callback) {