@@ -21,10 +21,10 @@ use ldk_node::Node;
2121use ldk_server_protos:: endpoints:: {
2222 BOLT11_RECEIVE_PATH , BOLT11_SEND_PATH , BOLT12_RECEIVE_PATH , BOLT12_SEND_PATH ,
2323 CLOSE_CHANNEL_PATH , CONNECT_PEER_PATH , DISCONNECT_PEER_PATH , EXPORT_PATHFINDING_SCORES_PATH ,
24- FORCE_CLOSE_CHANNEL_PATH , GET_BALANCES_PATH , GET_NODE_INFO_PATH , GET_PAYMENT_DETAILS_PATH ,
25- GRAPH_GET_CHANNEL_PATH , GRAPH_GET_NODE_PATH , GRAPH_LIST_CHANNELS_PATH , GRAPH_LIST_NODES_PATH ,
26- LIST_CHANNELS_PATH , LIST_FORWARDED_PAYMENTS_PATH , LIST_PAYMENTS_PATH ,
27- LIST_PEERS_PATH , ONCHAIN_RECEIVE_PATH ,
24+ FORCE_CLOSE_CHANNEL_PATH , GET_BALANCES_PATH , GET_METRICS_PATH , GET_NODE_INFO_PATH ,
25+ GET_PAYMENT_DETAILS_PATH , GRAPH_GET_CHANNEL_PATH , GRAPH_GET_NODE_PATH ,
26+ GRAPH_LIST_CHANNELS_PATH , GRAPH_LIST_NODES_PATH , LIST_CHANNELS_PATH ,
27+ LIST_FORWARDED_PAYMENTS_PATH , LIST_PAYMENTS_PATH , LIST_PEERS_PATH , ONCHAIN_RECEIVE_PATH ,
2828 ONCHAIN_SEND_PATH , OPEN_CHANNEL_PATH , SIGN_MESSAGE_PATH , SPLICE_IN_PATH , SPLICE_OUT_PATH ,
2929 SPONTANEOUS_SEND_PATH , UPDATE_CHANNEL_CONFIG_PATH , VERIFY_SIGNATURE_PATH ,
3030} ;
@@ -72,13 +72,13 @@ pub struct NodeService {
7272 node : Arc < Node > ,
7373 paginated_kv_store : Arc < dyn PaginatedKVStore > ,
7474 api_key : String ,
75- metrics : Arc < Metrics > ,
75+ metrics : Option < Arc < Metrics > > ,
7676}
7777
7878impl NodeService {
7979 pub ( crate ) fn new (
8080 node : Arc < Node > , paginated_kv_store : Arc < dyn PaginatedKVStore > , api_key : String ,
81- metrics : Arc < Metrics > ,
81+ metrics : Option < Arc < Metrics > > ,
8282 ) -> Self {
8383 Self { node, paginated_kv_store, api_key, metrics }
8484 }
@@ -165,14 +165,26 @@ impl Service<Request<Incoming>> for NodeService {
165165
166166 fn call ( & self , req : Request < Incoming > ) -> Self :: Future {
167167 // Handle metrics endpoint separately to bypass auth and return plain text
168- if req. uri ( ) . path ( ) . len ( ) > 1 && & req. uri ( ) . path ( ) [ 1 ..] == GET_METRICS_PATH {
169- let metrics = Arc :: clone ( & self . metrics ) ;
170- return Box :: pin ( async move {
171- Ok ( Response :: builder ( )
172- . header ( "Content-Type" , "text/plain" )
173- . body ( Full :: new ( Bytes :: from ( metrics. gather_metrics ( ) ) ) )
174- . unwrap ( ) )
175- } ) ;
168+ if req. method ( ) == hyper:: Method :: GET
169+ && req. uri ( ) . path ( ) . len ( ) > 1
170+ && & req. uri ( ) . path ( ) [ 1 ..] == GET_METRICS_PATH
171+ {
172+ if let Some ( metrics) = & self . metrics {
173+ let metrics = Arc :: clone ( metrics) ;
174+ return Box :: pin ( async move {
175+ Ok ( Response :: builder ( )
176+ . header ( "Content-Type" , "text/plain" )
177+ . body ( Full :: new ( Bytes :: from ( metrics. gather_metrics ( ) ) ) )
178+ . unwrap ( ) )
179+ } ) ;
180+ } else {
181+ return Box :: pin ( async move {
182+ Ok ( Response :: builder ( )
183+ . status ( StatusCode :: NOT_FOUND )
184+ . body ( Full :: new ( Bytes :: from ( "Not Found" ) ) )
185+ . unwrap ( ) )
186+ } ) ;
187+ }
176188 }
177189
178190 // Extract auth params from headers (validation happens after body is read)
0 commit comments