diff --git a/rpc/src/server.rs b/rpc/src/server.rs index 6d943211d5..07a4c20eed 100644 --- a/rpc/src/server.rs +++ b/rpc/src/server.rs @@ -1,11 +1,13 @@ use crate::IoHandler; -use axum::routing::post; +use axum::response::IntoResponse; +use axum::routing::{get, post}; use axum::{Extension, Router}; use ckb_app_config::RpcConfig; use ckb_async_runtime::Handle; use ckb_error::AnyError; use ckb_logger::info; +use axum::http::StatusCode; use ckb_stop_handler::{new_tokio_exit_rx, CancellationToken}; use futures_util::{SinkExt, TryStreamExt}; use jsonrpc_core::MetaIoHandler; @@ -90,14 +92,22 @@ impl RpcServer { .with_pipeline_size(4); // HTTP and WS server. - let method_router = - post(handle_jsonrpc::>).get(handle_jsonrpc_ws::>); + let post_router = post(handle_jsonrpc::>); + let get_router = if enable_websocket { + get(handle_jsonrpc_ws::>) + } else { + get(get_error_handler) + }; + let method_router = post_router.merge(get_router); + let mut app = Router::new() .route("/", method_router.clone()) .route("/*path", method_router) + .route("/ping", get(ping_handler)) .layer(Extension(Arc::clone(rpc))) .layer(CorsLayer::permissive()) - .layer(TimeoutLayer::new(Duration::from_secs(30))); + .layer(TimeoutLayer::new(Duration::from_secs(30))) + .layer(Extension(stream_config.clone())); if enable_websocket { let ws_config: StreamServerConfig = @@ -179,3 +189,16 @@ impl RpcServer { Ok(tcp_address) } } + +/// used for compatible with old health endpoint +async fn ping_handler() -> impl IntoResponse { + "pong" +} + +/// used for compatible with old PRC error responce for GET +async fn get_error_handler() -> impl IntoResponse { + ( + StatusCode::METHOD_NOT_ALLOWED, + "Used HTTP Method is not allowed. POST or OPTIONS is required", + ) +}