15
15
// along with this program. If not, see <http://www.gnu.org/licenses/>.
16
16
17
17
use clarity:: vm:: clarity:: ClarityConnection ;
18
- use clarity:: vm:: representations:: {
19
- MARF_KEY_FOR_QUAD_REGEX_STRING , MARF_KEY_FOR_TRIP_REGEX_STRING ,
20
- } ;
18
+ use clarity:: vm:: representations:: CONTRACT_PRINCIPAL_REGEX_STRING ;
19
+ use lazy_static:: lazy_static;
21
20
use regex:: { Captures , Regex } ;
22
21
use stacks_common:: types:: net:: PeerHost ;
23
22
use stacks_common:: util:: hash:: to_hex;
@@ -32,8 +31,19 @@ use crate::net::httpcore::{
32
31
} ;
33
32
use crate :: net:: { Error as NetError , StacksNodeState , TipRequest } ;
34
33
34
+ lazy_static ! {
35
+ static ref CLARITY_NAME_NO_BOUNDARIES_REGEX_STRING : String =
36
+ "[a-zA-Z]([a-zA-Z0-9]|[-_!?+<>=/*])*|[-+=/*]|[<>]=?" . into( ) ;
37
+ static ref MARF_KEY_FOR_TRIP_REGEX_STRING : String = format!(
38
+ r"vm::{}::\d+::({})" ,
39
+ * CONTRACT_PRINCIPAL_REGEX_STRING , * CLARITY_NAME_NO_BOUNDARIES_REGEX_STRING ,
40
+ ) ;
41
+ static ref MARF_KEY_FOR_QUAD_REGEX_STRING : String =
42
+ format!( r"{}::[0-9a-fA-F]+" , * MARF_KEY_FOR_TRIP_REGEX_STRING , ) ;
43
+ }
44
+
35
45
#[ derive( Debug , Clone , PartialEq , Serialize , Deserialize ) ]
36
- pub struct ClarityMarfValueResponse {
46
+ pub struct ClarityMarfResponse {
37
47
pub data : String ,
38
48
#[ serde( rename = "proof" ) ]
39
49
#[ serde( default ) ]
@@ -42,10 +52,10 @@ pub struct ClarityMarfValueResponse {
42
52
}
43
53
44
54
#[ derive( Clone ) ]
45
- pub struct RPCGetClarityMarfValueRequestHandler {
55
+ pub struct RPCGetClarityMarfRequestHandler {
46
56
pub clarity_marf_key : Option < String > ,
47
57
}
48
- impl RPCGetClarityMarfValueRequestHandler {
58
+ impl RPCGetClarityMarfRequestHandler {
49
59
pub fn new ( ) -> Self {
50
60
Self {
51
61
clarity_marf_key : None ,
@@ -54,21 +64,21 @@ impl RPCGetClarityMarfValueRequestHandler {
54
64
}
55
65
56
66
/// Decode the HTTP request
57
- impl HttpRequest for RPCGetClarityMarfValueRequestHandler {
67
+ impl HttpRequest for RPCGetClarityMarfRequestHandler {
58
68
fn verb ( & self ) -> & ' static str {
59
69
"GET"
60
70
}
61
71
62
72
fn path_regex ( & self ) -> Regex {
63
73
Regex :: new ( & format ! (
64
- r"^/v2/clarity_marf_value /(?P<clarity_marf_key>(vm-epoch::epoch-version)|({})|({}))$" ,
74
+ r"^/v2/clarity/marf /(?P<clarity_marf_key>(vm-epoch::epoch-version)|({})|({}))$" ,
65
75
* MARF_KEY_FOR_TRIP_REGEX_STRING , * MARF_KEY_FOR_QUAD_REGEX_STRING
66
76
) )
67
77
. unwrap ( )
68
78
}
69
79
70
80
fn metrics_identifier ( & self ) -> & str {
71
- "/v2/clarity_marf_value /:clarity_marf_key"
81
+ "/v2/clarity/marf /:clarity_marf_key"
72
82
}
73
83
74
84
/// Try to decode this request.
@@ -86,7 +96,11 @@ impl HttpRequest for RPCGetClarityMarfValueRequestHandler {
86
96
) ) ;
87
97
}
88
98
89
- let marf_key = request:: get_clarity_key ( captures, "clarity_marf_key" ) ?;
99
+ let marf_key = if let Some ( key_str) = captures. name ( "clarity_marf_key" ) {
100
+ key_str. as_str ( ) . to_string ( )
101
+ } else {
102
+ return Err ( Error :: Http ( 404 , "Missing `clarity_marf_key`" . to_string ( ) ) ) ;
103
+ } ;
90
104
91
105
self . clarity_marf_key = Some ( marf_key) ;
92
106
@@ -96,7 +110,7 @@ impl HttpRequest for RPCGetClarityMarfValueRequestHandler {
96
110
}
97
111
98
112
/// Handle the HTTP request
99
- impl RPCRequestHandler for RPCGetClarityMarfValueRequestHandler {
113
+ impl RPCRequestHandler for RPCGetClarityMarfRequestHandler {
100
114
/// Reset internal state
101
115
fn restart ( & mut self ) {
102
116
self . clarity_marf_key = None ;
@@ -143,7 +157,7 @@ impl RPCRequestHandler for RPCGetClarityMarfValueRequestHandler {
143
157
} ;
144
158
145
159
let data = format ! ( "0x{}" , value_hex) ;
146
- Some ( ClarityMarfValueResponse { data, marf_proof } )
160
+ Some ( ClarityMarfResponse { data, marf_proof } )
147
161
} )
148
162
} ,
149
163
)
@@ -177,19 +191,19 @@ impl RPCRequestHandler for RPCGetClarityMarfValueRequestHandler {
177
191
}
178
192
179
193
/// Decode the HTTP response
180
- impl HttpResponse for RPCGetClarityMarfValueRequestHandler {
194
+ impl HttpResponse for RPCGetClarityMarfRequestHandler {
181
195
fn try_parse_response (
182
196
& self ,
183
197
preamble : & HttpResponsePreamble ,
184
198
body : & [ u8 ] ,
185
199
) -> Result < HttpResponsePayload , Error > {
186
- let marf_value: ClarityMarfValueResponse = parse_json ( preamble, body) ?;
200
+ let marf_value: ClarityMarfResponse = parse_json ( preamble, body) ?;
187
201
Ok ( HttpResponsePayload :: try_from_json ( marf_value) ?)
188
202
}
189
203
}
190
204
191
205
impl StacksHttpRequest {
192
- pub fn new_getclaritymarfvalue (
206
+ pub fn new_getclaritymarf (
193
207
host : PeerHost ,
194
208
clarity_marf_key : String ,
195
209
tip_req : TipRequest ,
@@ -198,7 +212,7 @@ impl StacksHttpRequest {
198
212
StacksHttpRequest :: new_for_peer (
199
213
host,
200
214
"GET" . into ( ) ,
201
- format ! ( "/v2/clarity_marf_value /{}" , & clarity_marf_key) ,
215
+ format ! ( "/v2/clarity/marf /{}" , & clarity_marf_key) ,
202
216
HttpRequestContents :: new ( )
203
217
. for_tip ( tip_req)
204
218
. query_arg ( "proof" . into ( ) , if with_proof { "1" } else { "0" } . into ( ) ) ,
@@ -208,10 +222,10 @@ impl StacksHttpRequest {
208
222
}
209
223
210
224
impl StacksHttpResponse {
211
- pub fn decode_clarity_marf_value_response ( self ) -> Result < ClarityMarfValueResponse , NetError > {
225
+ pub fn decode_clarity_marf_response ( self ) -> Result < ClarityMarfResponse , NetError > {
212
226
let contents = self . get_http_payload_ok ( ) ?;
213
227
let contents_json: serde_json:: Value = contents. try_into ( ) ?;
214
- let resp: ClarityMarfValueResponse = serde_json:: from_value ( contents_json)
228
+ let resp: ClarityMarfResponse = serde_json:: from_value ( contents_json)
215
229
. map_err ( |_e| NetError :: DeserializeError ( "Failed to load from JSON" . to_string ( ) ) ) ?;
216
230
Ok ( resp)
217
231
}
0 commit comments