-
-
Save koivunej/8eeb6cf7cd5cfcae3696eb458a10297e to your computer and use it in GitHub Desktop.
jsonrpsee tokio::task::JoinError handling reproducer
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
[package] | |
name = "jsonrpsee_todo" | |
version = "0.1.0" | |
edition = "2021" | |
[dependencies] | |
jsonrpsee = { version = "0.13", features = ["full"] } | |
tokio = { version = "1", features = ["full"] } | |
serde_json = "*" | |
hyper = "*" | |
reqwest = {version = "*", features = ["json"] } |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
use std::error::Error; | |
#[tokio::main] | |
async fn main() { | |
let server = jsonrpsee::http_server::HttpServerBuilder::default() | |
.build("127.0.0.1:0") | |
.await | |
.expect("should had started the server"); | |
let local_addr = server | |
.local_addr() | |
.expect("should have the real listening address"); | |
println!("bound at {}", local_addr); | |
let mut module = jsonrpsee::RpcModule::new(()); | |
module | |
.register_blocking_method( | |
"todo", | |
|_params, _ctx| -> Result<serde_json::Value, jsonrpsee::core::Error> { | |
todo!("this causes a joinerror"); | |
}, | |
) | |
.expect("blocking method should register fine"); | |
let server_handle = server.start(module).expect("should start to serve"); | |
tokio::time::sleep(std::time::Duration::from_secs(1)).await; | |
println!("--- server should now be ready, didn't see other way than to sleep for it"); | |
let client = reqwest::Client::new(); | |
let err = client | |
.post(format!("http://{}", local_addr)) | |
.json(&serde_json::json! {{ | |
"jsonrpc": "2.0", | |
"id": "1", | |
"method": "todo", | |
}}) | |
.fetch_mode_no_cors() | |
.send() | |
.await | |
.expect_err("request should fail"); | |
println!("--- request made"); | |
server_handle.stop().expect("should stop ok"); | |
tokio::time::sleep(std::time::Duration::from_secs(1)).await; | |
println!("--- assumed server stopped"); | |
match err.source() { | |
Some(inner) if err.is_request() => { | |
if let Some(inner) = inner.downcast_ref::<hyper::Error>() { | |
assert!(inner.is_incomplete_message()); | |
println!("got expected {inner:?}"); | |
return; | |
} | |
} | |
_ => {} | |
} | |
todo!("unexpected inner error in {err:#?}"); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Expected output:
which is same as: