From 81eab9887be50ed653ea1d7819890363e4fa4b72 Mon Sep 17 00:00:00 2001 From: "ali.ibrahim" Date: Mon, 19 Sep 2016 15:06:13 +0200 Subject: [PATCH] Adding URLResponse to emit response events, implementing status code. --- atom/browser/api/atom_api_menu.cc | 3 +- atom/browser/api/atom_api_url_request.cc | 78 +++++++++++++++++++----- atom/browser/api/atom_api_url_request.h | 22 +++++-- atom/browser/net/atom_url_request.cc | 59 +++++++++++++++--- atom/browser/net/atom_url_request.h | 13 +++- lib/browser/api/net.js | 42 +++++++++++++ 6 files changed, 185 insertions(+), 32 deletions(-) diff --git a/atom/browser/api/atom_api_menu.cc b/atom/browser/api/atom_api_menu.cc index 627ce601f54..0de2dffc774 100644 --- a/atom/browser/api/atom_api_menu.cc +++ b/atom/browser/api/atom_api_menu.cc @@ -191,7 +191,8 @@ using atom::api::Menu; void Initialize(v8::Local exports, v8::Local unused, v8::Local context, void* priv) { v8::Isolate* isolate = context->GetIsolate(); - Menu::SetConstructor(isolate, base::Bind(&Menu::New)); + Menu::thehub + SetConstructor(isolate, base::Bind(&Menu::New)); mate::Dictionary dict(isolate, exports); dict.Set("Menu", Menu::GetConstructor(isolate)->GetFunction()); diff --git a/atom/browser/api/atom_api_url_request.cc b/atom/browser/api/atom_api_url_request.cc index 44b4581ef45..f31c07cbba3 100644 --- a/atom/browser/api/atom_api_url_request.cc +++ b/atom/browser/api/atom_api_url_request.cc @@ -39,16 +39,7 @@ mate::WrappableBase* URLRequest::New(mate::Arguments* args) { auto browser_context = session->browser_context(); - //auto url_request_context_getter = browser_context->url_request_context_getter(); - // auto url_request_context = url_request_context_getter->GetURLRequestContext(); - //auto net_url_request = url_request_context->CreateRequest(GURL(url), - // net::RequestPriority::DEFAULT_PRIORITY, - // nullptr); - // net_url_request->set_method(method); - - // auto atom_url_request = new URLRequest(args->isolate(), args->GetThis(), net_url_request.release()); - auto api_url_request = new URLRequest(args->isolate(), args->GetThis()); auto weak_ptr = api_url_request->weak_ptr_factory_.GetWeakPtr(); auto atom_url_request = AtomURLRequest::create(browser_context, url, weak_ptr); @@ -67,20 +58,75 @@ void URLRequest::BuildPrototype(v8::Isolate* isolate, v8::Local prototype) { prototype->SetClassName(mate::StringToV8(isolate, "URLRequest")); mate::ObjectTemplateBuilder(isolate, prototype->PrototypeTemplate()) - .MakeDestroyable() - .SetMethod("start", &URLRequest::start); + // Request API + .MakeDestroyable() + .SetMethod("write", &URLRequest::Write) + .SetMethod("end", &URLRequest::End) + .SetMethod("abort", &URLRequest::Abort) + .SetMethod("setHeader", &URLRequest::SetHeader) + .SetMethod("getHeader", &URLRequest::GetHeader) + .SetMethod("removaHeader", &URLRequest::RemoveHeader) + // Response APi + .SetProperty("statusCode", &URLRequest::StatusCode) + .SetProperty("statusMessage", &URLRequest::StatusMessage) + .SetProperty("responseHeaders", &URLRequest::ResponseHeaders) + .SetProperty("responseHttpVersion", &URLRequest::ResponseHttpVersion); } -void URLRequest::start() { +void URLRequest::Write() { + atom_url_request_->Write(); +} + +void URLRequest::End() { pin(); - atom_url_request_->Start(); + atom_url_request_->End(); } -void URLRequest::stop() { - +void URLRequest::Abort() { + atom_url_request_->Abort(); } + +void URLRequest::SetHeader() { + atom_url_request_->SetHeader(); +} +void URLRequest::GetHeader() { + atom_url_request_->GetHeader(); +} +void URLRequest::RemoveHeader() { + atom_url_request_->RemoveHeader(); +} + + void URLRequest::OnResponseStarted() { - Emit("response-started"); + v8::Local _emitResponse; + + auto wrapper = GetWrapper(); + if (mate::Dictionary(isolate(), wrapper).Get("_emitResponse", &_emitResponse)) + _emitResponse->Call(wrapper, 0, nullptr); +} + +void URLRequest::OnResponseData() { + Emit("data"); +} + +void URLRequest::OnResponseEnd() { + Emit("end"); +} + +int URLRequest::StatusCode() { + return atom_url_request_->StatusCode(); +} + +void URLRequest::StatusMessage() { + return atom_url_request_->StatusMessage(); +} + +void URLRequest::ResponseHeaders() { + return atom_url_request_->ResponseHeaders(); +} + +void URLRequest::ResponseHttpVersion() { + return atom_url_request_->ResponseHttpVersion(); } void URLRequest::pin() { diff --git a/atom/browser/api/atom_api_url_request.h b/atom/browser/api/atom_api_url_request.h index 474b13a7489..172cc51e475 100644 --- a/atom/browser/api/atom_api_url_request.h +++ b/atom/browser/api/atom_api_url_request.h @@ -22,17 +22,31 @@ class URLRequest : public mate::EventEmitter { static void BuildPrototype(v8::Isolate* isolate, v8::Local prototype); - void start(); - void stop(); - void OnResponseStarted(); protected: URLRequest(v8::Isolate* isolate, v8::Local wrapper); ~URLRequest() override; +private: + void Write(); + void End(); + void Abort(); + void SetHeader(); + void GetHeader(); + void RemoveHeader(); + + friend class AtomURLRequest; + void OnResponseStarted(); + void OnResponseData(); + void OnResponseEnd(); + + int StatusCode(); + void StatusMessage(); + void ResponseHeaders(); + void ResponseHttpVersion(); + - private: void pin(); void unpin(); diff --git a/atom/browser/net/atom_url_request.cc b/atom/browser/net/atom_url_request.cc index 50aee486534..1770d01ca64 100644 --- a/atom/browser/net/atom_url_request.cc +++ b/atom/browser/net/atom_url_request.cc @@ -23,32 +23,71 @@ scoped_refptr AtomURLRequest::create( const std::string& url, base::WeakPtr delegate) { + DCHECK(browser_context); + DCHECK(!url.empty()); - auto url_request_context_getter = browser_context->url_request_context_getter(); - auto url_request_context = url_request_context_getter->GetURLRequestContext(); + auto request_context_getter = browser_context->url_request_context_getter(); - auto net_url_request = url_request_context->CreateRequest(GURL(url), - net::RequestPriority::DEFAULT_PRIORITY, - nullptr); - // net_url_request->set_method(method); + DCHECK(request_context_getter); + + auto context = request_context_getter->GetURLRequestContext(); + + DCHECK(context); scoped_refptr atom_url_request = new AtomURLRequest(delegate); - net_url_request->set_delegate(atom_url_request.get()); - - atom_url_request->url_request_ = std::move(net_url_request); + atom_url_request->url_request_ = context->CreateRequest(GURL(url), + net::RequestPriority::DEFAULT_PRIORITY, + atom_url_request.get()); return atom_url_request; } -void AtomURLRequest::Start() { +void AtomURLRequest::Write() { +} + +void AtomURLRequest::End() { // post to io thread content::BrowserThread::PostTask( content::BrowserThread::IO, FROM_HERE, base::Bind(&AtomURLRequest::StartOnIOThread, this)); } +void AtomURLRequest::Abort() { +} + +void AtomURLRequest::SetHeader() { + +} + +void AtomURLRequest::GetHeader() { + +} + +void AtomURLRequest::RemoveHeader() { + +} + + + + + + +int AtomURLRequest::StatusCode() { + return url_request_->GetResponseCode(); +} + +void AtomURLRequest::StatusMessage() { +} +void AtomURLRequest::ResponseHeaders() { +} + +void AtomURLRequest::ResponseHttpVersion() { +} + + + void AtomURLRequest::StartOnIOThread() { url_request_->Start(); } diff --git a/atom/browser/net/atom_url_request.h b/atom/browser/net/atom_url_request.h index e581008eb49..d9a45885e6a 100644 --- a/atom/browser/net/atom_url_request.h +++ b/atom/browser/net/atom_url_request.h @@ -25,9 +25,20 @@ public: const std::string& url, base::WeakPtr delegate); - void Start(); void set_method(const std::string& method); + void Write(); + void End(); + void Abort(); + void SetHeader(); + void GetHeader(); + void RemoveHeader(); + + int StatusCode(); + void StatusMessage(); + void ResponseHeaders(); + void ResponseHttpVersion(); + protected: // Overrides of net::URLRequest::Delegate virtual void OnResponseStarted(net::URLRequest* request) override; diff --git a/lib/browser/api/net.js b/lib/browser/api/net.js index c443a8ee9ed..517c13badaf 100644 --- a/lib/browser/api/net.js +++ b/lib/browser/api/net.js @@ -8,5 +8,47 @@ const {URLRequest} = net Object.setPrototypeOf(Net.prototype, EventEmitter.prototype) Object.setPrototypeOf(URLRequest.prototype, EventEmitter.prototype) +class URLResponse extends EventEmitter { + constructor(request) { + super(); + this.request = request; + } + + get statusCode() { + return this.request.statusCode; + } + + get statusMessage() { + return this.request.statusMessage; + } + + get headers() { + return this.request.responseHeaders; + } + + get httpVersion() { + return this.request.responseHttpVersion; + } + + + +} + +Net.prototype.request = function(options, callback) { + let request = new URLRequest(options) + + if (callback) { + request.once('response', callback) + } + + + return request +} + +URLRequest.prototype._emitResponse = function() { + this.response = new URLResponse(this); + this.emit('response', this.response); +} + module.exports = net \ No newline at end of file