Adding URLResponse to emit response events, implementing status code.

This commit is contained in:
ali.ibrahim 2016-09-19 15:06:13 +02:00
parent 7521aeea09
commit 81eab9887b
6 changed files with 185 additions and 32 deletions

View file

@ -191,7 +191,8 @@ using atom::api::Menu;
void Initialize(v8::Local<v8::Object> exports, v8::Local<v8::Value> unused, void Initialize(v8::Local<v8::Object> exports, v8::Local<v8::Value> unused,
v8::Local<v8::Context> context, void* priv) { v8::Local<v8::Context> context, void* priv) {
v8::Isolate* isolate = context->GetIsolate(); 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); mate::Dictionary dict(isolate, exports);
dict.Set("Menu", Menu::GetConstructor(isolate)->GetFunction()); dict.Set("Menu", Menu::GetConstructor(isolate)->GetFunction());

View file

@ -39,16 +39,7 @@ mate::WrappableBase* URLRequest::New(mate::Arguments* args) {
auto browser_context = session->browser_context(); 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 api_url_request = new URLRequest(args->isolate(), args->GetThis());
auto weak_ptr = api_url_request->weak_ptr_factory_.GetWeakPtr(); auto weak_ptr = api_url_request->weak_ptr_factory_.GetWeakPtr();
auto atom_url_request = AtomURLRequest::create(browser_context, url, weak_ptr); auto atom_url_request = AtomURLRequest::create(browser_context, url, weak_ptr);
@ -67,20 +58,75 @@ void URLRequest::BuildPrototype(v8::Isolate* isolate,
v8::Local<v8::FunctionTemplate> prototype) { v8::Local<v8::FunctionTemplate> prototype) {
prototype->SetClassName(mate::StringToV8(isolate, "URLRequest")); prototype->SetClassName(mate::StringToV8(isolate, "URLRequest"));
mate::ObjectTemplateBuilder(isolate, prototype->PrototypeTemplate()) mate::ObjectTemplateBuilder(isolate, prototype->PrototypeTemplate())
.MakeDestroyable() // Request API
.SetMethod("start", &URLRequest::start); .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(); 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() { void URLRequest::OnResponseStarted() {
Emit("response-started"); v8::Local<v8::Function> _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() { void URLRequest::pin() {

View file

@ -22,17 +22,31 @@ class URLRequest : public mate::EventEmitter<URLRequest> {
static void BuildPrototype(v8::Isolate* isolate, static void BuildPrototype(v8::Isolate* isolate,
v8::Local<v8::FunctionTemplate> prototype); v8::Local<v8::FunctionTemplate> prototype);
void start();
void stop();
void OnResponseStarted();
protected: protected:
URLRequest(v8::Isolate* isolate, URLRequest(v8::Isolate* isolate,
v8::Local<v8::Object> wrapper); v8::Local<v8::Object> wrapper);
~URLRequest() override; ~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 pin();
void unpin(); void unpin();

View file

@ -23,32 +23,71 @@ scoped_refptr<AtomURLRequest> AtomURLRequest::create(
const std::string& url, const std::string& url,
base::WeakPtr<api::URLRequest> delegate) { base::WeakPtr<api::URLRequest> delegate) {
DCHECK(browser_context);
DCHECK(!url.empty());
auto url_request_context_getter = browser_context->url_request_context_getter(); auto 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), DCHECK(request_context_getter);
net::RequestPriority::DEFAULT_PRIORITY,
nullptr); auto context = request_context_getter->GetURLRequestContext();
// net_url_request->set_method(method);
DCHECK(context);
scoped_refptr<AtomURLRequest> atom_url_request = new AtomURLRequest(delegate); scoped_refptr<AtomURLRequest> atom_url_request = new AtomURLRequest(delegate);
net_url_request->set_delegate(atom_url_request.get()); atom_url_request->url_request_ = context->CreateRequest(GURL(url),
net::RequestPriority::DEFAULT_PRIORITY,
atom_url_request->url_request_ = std::move(net_url_request); atom_url_request.get());
return atom_url_request; return atom_url_request;
} }
void AtomURLRequest::Start() { void AtomURLRequest::Write() {
}
void AtomURLRequest::End() {
// post to io thread // post to io thread
content::BrowserThread::PostTask( content::BrowserThread::PostTask(
content::BrowserThread::IO, FROM_HERE, content::BrowserThread::IO, FROM_HERE,
base::Bind(&AtomURLRequest::StartOnIOThread, this)); 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() { void AtomURLRequest::StartOnIOThread() {
url_request_->Start(); url_request_->Start();
} }

View file

@ -25,9 +25,20 @@ public:
const std::string& url, const std::string& url,
base::WeakPtr<api::URLRequest> delegate); base::WeakPtr<api::URLRequest> delegate);
void Start();
void set_method(const std::string& method); 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: protected:
// Overrides of net::URLRequest::Delegate // Overrides of net::URLRequest::Delegate
virtual void OnResponseStarted(net::URLRequest* request) override; virtual void OnResponseStarted(net::URLRequest* request) override;

View file

@ -8,5 +8,47 @@ const {URLRequest} = net
Object.setPrototypeOf(Net.prototype, EventEmitter.prototype) Object.setPrototypeOf(Net.prototype, EventEmitter.prototype)
Object.setPrototypeOf(URLRequest.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 module.exports = net