fix RPC server to handle exceptions in requests and return them as son values
This commit is contained in:
parent
6e016b3e69
commit
49f65cd4da
|
@ -212,6 +212,23 @@ function makeRequest(url, data) {
|
|||
return JSON.parse(responseText);
|
||||
}
|
||||
|
||||
//returns an object from rpc serialized json value
|
||||
function deserialize_json_value(value) {
|
||||
let result = {};
|
||||
for (let index = 0; index < value.keys.length; index++) {
|
||||
var propName = value.keys[index];
|
||||
var propValue = value.values[index];
|
||||
if (propValue.type && propValue.type == 'dict') {
|
||||
result[propName] = deserialize_json_value(propValue);
|
||||
}
|
||||
else {
|
||||
result[propName] = propValue.value;
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
function sendRequest(command, data, host = sessionHost) {
|
||||
if (!host) {
|
||||
throw new Error('Must first create RPC session with a valid host');
|
||||
|
@ -226,9 +243,13 @@ function sendRequest(command, data, host = sessionHost) {
|
|||
let error = response && response.error;
|
||||
|
||||
// Remove the type prefix from the error message (e.g. "Error: ").
|
||||
if (error) {
|
||||
if (error && error.replace) {
|
||||
error = error.replace(/^[a-z]+: /i, '');
|
||||
}
|
||||
else if (error.type && error.type == 'dict') {
|
||||
let responseError = deserialize_json_value(error);
|
||||
throw responseError;
|
||||
}
|
||||
|
||||
throw new Error(error || `Invalid response for "${command}"`);
|
||||
}
|
||||
|
|
17
src/rpc.cpp
17
src/rpc.cpp
|
@ -360,8 +360,25 @@ json RPCServer::perform_request(std::string name, const json &args) {
|
|||
assert(action);
|
||||
|
||||
m_worker.add_task([=] {
|
||||
try {
|
||||
return action(args);
|
||||
}
|
||||
catch (jsc::Exception ex) {
|
||||
json exceptionAsJson = nullptr;
|
||||
try {
|
||||
exceptionAsJson = serialize_json_value(ex);
|
||||
}
|
||||
catch (...) {
|
||||
exceptionAsJson = {{"error", "An exception occured while processing the request. Could not serialize the exception as JSON"}};
|
||||
}
|
||||
|
||||
return (json){{"error", exceptionAsJson}};
|
||||
}
|
||||
catch (std::exception &exception) {
|
||||
return (json){{"error", exception.what()}};
|
||||
}
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
try {
|
||||
|
|
Loading…
Reference in New Issue