PrivateRookie / ws-tool

High perform & easy to use websocket client/server
Apache License 2.0
193 stars 23 forks source link

client send nul/zero byte array in 0.9 while 0.7 would not, it is a regression #40

Closed pymongo closed 12 months ago

pymongo commented 1 year ago

my server is axum 0.6, client is ws-tool, When I update from 0.7 to 0.9, axum ws server receiver wired nul/zero bytes array

&msg = "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
thread 'manage' panicked at ': Error("expected value", line: 1, column: 1)'
async fn kernel_ws_socket_handler(socket: axum::extract::ws::WebSocket, ctx: AppContext, kernel_info: KernelInfo) {
    let (mut ws_write, mut ws_read) = socket.split();
    loop {
        tokio::select! {
            msg_res_opt = ws_read.next() => {
                let msg_res = match msg_res_opt {
                    Some(msg_res) => msg_res,
                    None => {
                        tracing::warn!("EOF");
                        break;
                    }
                };
                let msg = match msg_res {
                    Ok(msg) => msg,
                    Err(err) => {
                        // e.g. Protocol(ResetWithoutClosingHandshake)
                        tracing::error!("kernel disconnect! {err}");
                        break;
                    }
                };
                let msg = match msg {
                    Message::Text(msg) => {
                        msg
                    },
                    Message::Ping(_) => {
                        if ws_write.send(Message::Pong(Vec::new())).await.is_err() {
                            tracing::error!("send pong back fail! break");
                            break;
                        }
                        continue;
                    }
                    Message::Close(_) => break,
                    _ => continue,
                };
                dbg!(msg.is_empty());
                dbg!(&msg);
                let msg = serde_json::from_str::<Message>(&msg).expect(&msg);
                // let msg = kernel_msg::Message::from_json(&msg.bytes().to_vec());
                rsp_tx.send(msg).unwrap();
            }
        }
    }

client:

 let socket=   ws_tool::ClientBuilder::new()
        .connect(url.parse().expect(&url), StringCodec::check_fn)
        .unwrap();
let (mut ws_r, mut ws_w) = socket.split();
//...
                        let rsp = serde_json::to_string(&rsp).unwrap();
                        if let Err(err) = ws_w.send(rsp) {
                            error!("{err}");
                        }

I rollback from 0.9 to 0.7 and works ok

pymongo commented 12 months ago

ws-tool 0.9 version has been yanked, so closed issue