Browse Source

feat: add getUploadProgress API to the net API (#13985)

trop[bot] 6 years ago
parent
commit
63402f3e52

+ 13 - 0
atom/browser/api/atom_api_url_request.cc

@@ -123,6 +123,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<v8::Object> wrapper) {
   InitWith(isolate, wrapper);
 }
@@ -181,6 +193,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

+ 1 - 0
atom/browser/api/atom_api_url_request.h

@@ -111,6 +111,7 @@ class URLRequest : public mate::EventEmitter<URLRequest> {
   void OnResponseData(scoped_refptr<const net::IOBufferWithSize> 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<v8::Object> wrapper);

+ 12 - 0
atom/browser/net/atom_url_request.cc

@@ -502,4 +502,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

+ 1 - 0
atom/browser/net/atom_url_request.h

@@ -43,6 +43,7 @@ class AtomURLRequest : public base::RefCountedThreadSafe<AtomURLRequest>,
   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

+ 14 - 0
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.

+ 4 - 0
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) {