mirror of
https://github.com/chatmail/core.git
synced 2026-04-17 21:46:35 +03:00
api!: make dc_jsonrpc_blocking_call accept JSON-RPC request
This commit is contained in:
@@ -5755,12 +5755,11 @@ char* dc_jsonrpc_next_response(dc_jsonrpc_instance_t* jsonrpc_instance);
|
|||||||
*
|
*
|
||||||
* @memberof dc_jsonrpc_instance_t
|
* @memberof dc_jsonrpc_instance_t
|
||||||
* @param jsonrpc_instance jsonrpc instance as returned from dc_jsonrpc_init().
|
* @param jsonrpc_instance jsonrpc instance as returned from dc_jsonrpc_init().
|
||||||
* @param method JSON-RPC method name, e.g. `check_email_validity`.
|
* @param input JSON-RPC request.
|
||||||
* @param params JSON-RPC method parameters, e.g. `["alice@example.org"]`.
|
|
||||||
* @return JSON-RPC response as string, must be freed using dc_str_unref() after usage.
|
* @return JSON-RPC response as string, must be freed using dc_str_unref() after usage.
|
||||||
* On error, NULL is returned.
|
* If there is no response, NULL is returned.
|
||||||
*/
|
*/
|
||||||
char* dc_jsonrpc_blocking_call(dc_jsonrpc_instance_t* jsonrpc_instance, const char *method, const char *params);
|
char* dc_jsonrpc_blocking_call(dc_jsonrpc_instance_t* jsonrpc_instance, const char *input);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @class dc_event_emitter_t
|
* @class dc_event_emitter_t
|
||||||
|
|||||||
@@ -5010,7 +5010,7 @@ pub unsafe extern "C" fn dc_accounts_get_event_emitter(
|
|||||||
#[cfg(feature = "jsonrpc")]
|
#[cfg(feature = "jsonrpc")]
|
||||||
mod jsonrpc {
|
mod jsonrpc {
|
||||||
use deltachat_jsonrpc::api::CommandApi;
|
use deltachat_jsonrpc::api::CommandApi;
|
||||||
use deltachat_jsonrpc::yerpc::{OutReceiver, RpcClient, RpcServer, RpcSession};
|
use deltachat_jsonrpc::yerpc::{OutReceiver, RpcClient, RpcSession};
|
||||||
|
|
||||||
use super::*;
|
use super::*;
|
||||||
|
|
||||||
@@ -5086,25 +5086,24 @@ mod jsonrpc {
|
|||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe extern "C" fn dc_jsonrpc_blocking_call(
|
pub unsafe extern "C" fn dc_jsonrpc_blocking_call(
|
||||||
jsonrpc_instance: *mut dc_jsonrpc_instance_t,
|
jsonrpc_instance: *mut dc_jsonrpc_instance_t,
|
||||||
method: *const libc::c_char,
|
input: *const libc::c_char,
|
||||||
params: *const libc::c_char,
|
|
||||||
) -> *mut libc::c_char {
|
) -> *mut libc::c_char {
|
||||||
if jsonrpc_instance.is_null() {
|
if jsonrpc_instance.is_null() {
|
||||||
eprintln!("ignoring careless call to dc_jsonrpc_blocking_call()");
|
eprintln!("ignoring careless call to dc_jsonrpc_blocking_call()");
|
||||||
return ptr::null_mut();
|
return ptr::null_mut();
|
||||||
}
|
}
|
||||||
let api = &*jsonrpc_instance;
|
let api = &*jsonrpc_instance;
|
||||||
let method = to_string_lossy(method);
|
let input = to_string_lossy(input);
|
||||||
let params = to_string_lossy(params);
|
let res = block_on(api.handle.process_incoming(&input));
|
||||||
let params: Option<yerpc::Params> = match serde_json::from_str(¶ms) {
|
|
||||||
Ok(params) => Some(params),
|
|
||||||
Err(_) => None,
|
|
||||||
};
|
|
||||||
let params = params.map(yerpc::Params::into_value).unwrap_or_default();
|
|
||||||
let res = block_on(api.handle.server().handle_request(method, params));
|
|
||||||
match res {
|
match res {
|
||||||
Ok(res) => res.to_string().strdup(),
|
Some(message) => {
|
||||||
Err(_) => ptr::null_mut(),
|
if let Ok(message) = serde_json::to_string(&message) {
|
||||||
|
message.strdup()
|
||||||
|
} else {
|
||||||
|
ptr::null_mut()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
None => ptr::null_mut(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
import json
|
||||||
from queue import Queue
|
from queue import Queue
|
||||||
|
|
||||||
import deltachat as dc
|
import deltachat as dc
|
||||||
@@ -226,10 +227,26 @@ def test_jsonrpc_blocking_call(tmp_path):
|
|||||||
lib.dc_accounts_unref,
|
lib.dc_accounts_unref,
|
||||||
)
|
)
|
||||||
jsonrpc = ffi.gc(lib.dc_jsonrpc_init(accounts), lib.dc_jsonrpc_unref)
|
jsonrpc = ffi.gc(lib.dc_jsonrpc_init(accounts), lib.dc_jsonrpc_unref)
|
||||||
res = from_optional_dc_charpointer(
|
res = json.loads(
|
||||||
lib.dc_jsonrpc_blocking_call(jsonrpc, b"check_email_validity", b'["alice@example.org"]'),
|
from_optional_dc_charpointer(
|
||||||
|
lib.dc_jsonrpc_blocking_call(
|
||||||
|
jsonrpc,
|
||||||
|
json.dumps(
|
||||||
|
{"jsonrpc": "2.0", "method": "check_email_validity", "params": ["alice@example.org"], "id": "123"},
|
||||||
|
).encode("utf-8"),
|
||||||
|
),
|
||||||
|
),
|
||||||
)
|
)
|
||||||
assert res == "true"
|
assert res == {"jsonrpc": "2.0", "id": "123", "result": True}
|
||||||
|
|
||||||
res = from_optional_dc_charpointer(lib.dc_jsonrpc_blocking_call(jsonrpc, b"check_email_validity", b'["alice"]'))
|
res = json.loads(
|
||||||
assert res == "false"
|
from_optional_dc_charpointer(
|
||||||
|
lib.dc_jsonrpc_blocking_call(
|
||||||
|
jsonrpc,
|
||||||
|
json.dumps(
|
||||||
|
{"jsonrpc": "2.0", "method": "check_email_validity", "params": ["alice"], "id": "456"},
|
||||||
|
).encode("utf-8"),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
assert res == {"jsonrpc": "2.0", "id": "456", "result": False}
|
||||||
|
|||||||
Reference in New Issue
Block a user