@@ -438,6 +438,8 @@ pub struct StacksHttpRequest {
438
438
preamble : HttpRequestPreamble ,
439
439
contents : HttpRequestContents ,
440
440
start_time : u128 ,
441
+ /// Cache result of `StacksHttp::find_response_handler` so we don't have to do the regex matching twice
442
+ response_handler_index : Option < usize > ,
441
443
}
442
444
443
445
impl StacksHttpRequest {
@@ -446,6 +448,7 @@ impl StacksHttpRequest {
446
448
preamble,
447
449
contents,
448
450
start_time : get_epoch_time_ms ( ) ,
451
+ response_handler_index : None ,
449
452
}
450
453
}
451
454
@@ -481,6 +484,7 @@ impl StacksHttpRequest {
481
484
preamble,
482
485
contents,
483
486
start_time : get_epoch_time_ms ( ) ,
487
+ response_handler_index : None ,
484
488
} )
485
489
}
486
490
@@ -912,9 +916,7 @@ impl StacksHttp {
912
916
if request_verb != verb {
913
917
continue ;
914
918
}
915
- let _captures = if let Some ( caps) = regex. captures ( request_path) {
916
- caps
917
- } else {
919
+ let Some ( _captures) = regex. captures ( request_path) else {
918
920
continue ;
919
921
} ;
920
922
@@ -985,9 +987,7 @@ impl StacksHttp {
985
987
if & preamble. verb != verb {
986
988
continue ;
987
989
}
988
- let captures = if let Some ( caps) = regex. captures ( & decoded_path) {
989
- caps
990
- } else {
990
+ let Some ( captures) = regex. captures ( & decoded_path) else {
991
991
continue ;
992
992
} ;
993
993
@@ -1085,21 +1085,18 @@ impl StacksHttp {
1085
1085
node : & mut StacksNodeState ,
1086
1086
) -> Result < ( HttpResponsePreamble , HttpResponseContents ) , NetError > {
1087
1087
let ( decoded_path, _) = decode_request_path ( & request. preamble ( ) . path_and_query_str ) ?;
1088
- let response_handler_index =
1089
- if let Some ( i) = self . find_response_handler ( & request. preamble ( ) . verb , & decoded_path) {
1090
- i
1091
- } else {
1092
- // method not found
1093
- return StacksHttpResponse :: new_error (
1094
- & request. preamble ,
1095
- & HttpNotFound :: new ( format ! (
1096
- "No such API endpoint '{} {}'" ,
1097
- & request. preamble( ) . verb,
1098
- & decoded_path
1099
- ) ) ,
1100
- )
1101
- . try_into_contents ( ) ;
1102
- } ;
1088
+ let Some ( response_handler_index) = request. response_handler_index . or_else ( || self . find_response_handler ( & request. preamble ( ) . verb , & decoded_path) ) else {
1089
+ // method not found
1090
+ return StacksHttpResponse :: new_error (
1091
+ & request. preamble ,
1092
+ & HttpNotFound :: new ( format ! (
1093
+ "No such API endpoint '{} {}'" ,
1094
+ & request. preamble( ) . verb,
1095
+ & decoded_path
1096
+ ) ) ,
1097
+ )
1098
+ . try_into_contents ( ) ;
1099
+ } ;
1103
1100
1104
1101
let ( _, _, request_handler) = self
1105
1102
. request_handlers
@@ -1246,15 +1243,17 @@ impl StacksHttp {
1246
1243
/// Get a unique `&str` identifier for each request type
1247
1244
/// This can only return a finite set of identifiers, which makes it safer to use for Prometheus metrics
1248
1245
/// For details see https://github.com/stacks-network/stacks-core/issues/4574
1249
- pub fn metrics_identifier ( & self , req : & StacksHttpRequest ) -> & str {
1246
+ pub fn metrics_identifier ( & self , req : & mut StacksHttpRequest ) -> & str {
1250
1247
let Ok ( ( decoded_path, _) ) = decode_request_path ( & req. request_path ( ) ) else {
1251
1248
return "<err-url-decode>" ;
1252
1249
} ;
1253
- let Some ( response_handler_index) =
1254
- self . find_response_handler ( & req. preamble ( ) . verb , & decoded_path)
1250
+
1251
+ let Some ( response_handler_index) = req. response_handler_index
1252
+ . or_else ( || self . find_response_handler ( & req. preamble ( ) . verb , & decoded_path) )
1255
1253
else {
1256
1254
return "<err-handler-not-found>" ;
1257
1255
} ;
1256
+ req. response_handler_index = Some ( response_handler_index) ;
1258
1257
1259
1258
let ( _, _, request_handler) = self
1260
1259
. request_handlers
0 commit comments