Enable return error for arbitray request job

This commit is contained in:
Cheng Zhao 2015-08-12 13:50:31 +08:00
parent ee51e37db7
commit 337460cdc2
2 changed files with 20 additions and 5 deletions

View file

@ -110,6 +110,18 @@ void AskForOptions(v8::Isolate* isolate,
handler.Run(request, wrapped_callback.ToLocalChecked());
}
bool IsErrorOptions(base::Value* value, int* error) {
if (value->IsType(base::Value::TYPE_DICTIONARY)) {
base::DictionaryValue* dict = static_cast<base::DictionaryValue*>(value);
if (dict->GetInteger("error", error))
return true;
} else if (value->IsType(base::Value::TYPE_INTEGER)) {
if (value->GetAsInteger(error))
return true;
}
return false;
}
} // namespace internal
} // namespace atom

View file

@ -29,6 +29,9 @@ void AskForOptions(v8::Isolate* isolate,
net::URLRequest* request,
const ResponseCallback& callback);
// Test whether the |options| means an error.
bool IsErrorOptions(base::Value* value, int* error);
} // namespace internal
template<typename RequestJob>
@ -63,13 +66,13 @@ class JsAsker : public RequestJob {
// Called when the JS handler has sent the response, we need to decide whether
// to start, or fail the job.
void OnResponse(bool success, scoped_ptr<base::Value> options) {
if (success && options) {
StartAsync(options.Pass());
void OnResponse(bool success, scoped_ptr<base::Value> value) {
int error = net::ERR_NOT_IMPLEMENTED;
if (success && value && !internal::IsErrorOptions(value.get(), &error)) {
StartAsync(value.Pass());
} else {
RequestJob::NotifyStartError(
net::URLRequestStatus(net::URLRequestStatus::FAILED,
net::ERR_NOT_IMPLEMENTED));
net::URLRequestStatus(net::URLRequestStatus::FAILED, error));
}
}