@@ -3,12 +3,6 @@ use opentelemetry::propagation::Extractor;
33use std:: collections:: HashMap ;
44use std:: sync:: Arc ;
55
6- use limitador:: CheckResult ;
7- use tonic:: codegen:: http:: HeaderMap ;
8- use tonic:: { transport, transport:: Server , Request , Response , Status } ;
9- use tracing:: Span ;
10- use tracing_opentelemetry:: OpenTelemetrySpanExt ;
11-
126use crate :: envoy_rls:: server:: envoy:: config:: core:: v3:: HeaderValue ;
137use crate :: envoy_rls:: server:: envoy:: service:: ratelimit:: v3:: rate_limit_response:: Code ;
148use crate :: envoy_rls:: server:: envoy:: service:: ratelimit:: v3:: rate_limit_service_server:: {
@@ -19,6 +13,12 @@ use crate::envoy_rls::server::envoy::service::ratelimit::v3::{
1913} ;
2014use crate :: prometheus_metrics:: PrometheusMetrics ;
2115use crate :: Limiter ;
16+ use limitador:: limit:: Context ;
17+ use limitador:: CheckResult ;
18+ use tonic:: codegen:: http:: HeaderMap ;
19+ use tonic:: { transport, transport:: Server , Request , Response , Status } ;
20+ use tracing:: Span ;
21+ use tracing_opentelemetry:: OpenTelemetrySpanExt ;
2222
2323include ! ( "envoy_types.rs" ) ;
2424
@@ -72,7 +72,7 @@ impl RateLimitService for MyRateLimiter {
7272 ) -> Result < Response < RateLimitResponse > , Status > {
7373 debug ! ( "Request received: {:?}" , request) ;
7474
75- let mut values: HashMap < String , String > = HashMap :: new ( ) ;
75+ let mut values: Vec < HashMap < String , String > > = Vec :: default ( ) ;
7676 let ( metadata, _ext, req) = request. into_parts ( ) ;
7777 let namespace = req. domain ;
7878 let rl_headers = RateLimitRequestHeaders :: new ( metadata. into_headers ( ) ) ;
@@ -96,9 +96,11 @@ impl RateLimitService for MyRateLimiter {
9696 let namespace = namespace. into ( ) ;
9797
9898 for descriptor in & req. descriptors {
99+ let mut map = HashMap :: default ( ) ;
99100 for entry in & descriptor. entries {
100- values . insert ( entry. key . clone ( ) , entry. value . clone ( ) ) ;
101+ map . insert ( entry. key . clone ( ) , entry. value . clone ( ) ) ;
101102 }
103+ values. push ( map) ;
102104 }
103105
104106 // "hits_addend" is optional according to the spec, and should default
@@ -109,7 +111,8 @@ impl RateLimitService for MyRateLimiter {
109111 req. hits_addend
110112 } ;
111113
112- let ctx = values. into ( ) ;
114+ let mut ctx = Context :: default ( ) ;
115+ ctx. list_binding ( "descriptors" . to_string ( ) , values) ;
113116
114117 let rate_limited_resp = match & * self . limiter {
115118 Limiter :: Blocking ( limiter) => limiter. check_rate_limited_and_update (
@@ -255,8 +258,12 @@ mod tests {
255258 namespace,
256259 1 ,
257260 60 ,
258- vec ! [ "req_method == 'GET'" . try_into( ) . expect( "failed parsing!" ) ] ,
259- vec ! [ "app_id" . try_into( ) . expect( "failed parsing!" ) ] ,
261+ vec ! [ "descriptors[0]['req.method'] == 'GET'"
262+ . try_into( )
263+ . expect( "failed parsing!" ) ] ,
264+ vec ! [ "descriptors[0]['app.id']"
265+ . try_into( )
266+ . expect( "failed parsing!" ) ] ,
260267 ) ;
261268
262269 let limiter = RateLimiter :: new ( 10_000 ) ;
@@ -276,11 +283,11 @@ mod tests {
276283 descriptors : vec ! [ RateLimitDescriptor {
277284 entries: vec![
278285 Entry {
279- key: "req_method " . to_string( ) ,
286+ key: "req.method " . to_string( ) ,
280287 value: "GET" . to_string( ) ,
281288 } ,
282289 Entry {
283- key: "app_id " . to_string( ) ,
290+ key: "app.id " . to_string( ) ,
284291 value: "1" . to_string( ) ,
285292 } ,
286293 ] ,
@@ -337,7 +344,7 @@ mod tests {
337344 domain : "test_namespace" . to_string ( ) ,
338345 descriptors : vec ! [ RateLimitDescriptor {
339346 entries: vec![ Entry {
340- key: "req_method " . to_string( ) ,
347+ key: "req.method " . to_string( ) ,
341348 value: "GET" . to_string( ) ,
342349 } ] ,
343350 limit: None ,
@@ -371,7 +378,7 @@ mod tests {
371378 domain : "" . to_string ( ) ,
372379 descriptors : vec ! [ RateLimitDescriptor {
373380 entries: vec![ Entry {
374- key: "req_method " . to_string( ) ,
381+ key: "req.method " . to_string( ) ,
375382 value: "GET" . to_string( ) ,
376383 } ] ,
377384 limit: None ,
@@ -400,18 +407,18 @@ mod tests {
400407 namespace,
401408 10 ,
402409 60 ,
403- vec![ "x == '1'" . try_into( ) . expect( "failed parsing!" ) ] ,
404- vec![ "z" . try_into( ) . expect( "failed parsing!" ) ] ,
410+ vec![ "descriptors[0]. x == '1'" . try_into( ) . expect( "failed parsing!" ) ] ,
411+ vec![ "descriptors[0]. z" . try_into( ) . expect( "failed parsing!" ) ] ,
405412 ) ,
406413 Limit :: new(
407414 namespace,
408415 0 ,
409416 60 ,
410417 vec![
411- "x == '1'" . try_into( ) . expect( "failed parsing!" ) ,
412- "y == '2'" . try_into( ) . expect( "failed parsing!" ) ,
418+ "descriptors[0]. x == '1'" . try_into( ) . expect( "failed parsing!" ) ,
419+ "descriptors[1]. y == '2'" . try_into( ) . expect( "failed parsing!" ) ,
413420 ] ,
414- vec![ "z" . try_into( ) . expect( "failed parsing!" ) ] ,
421+ vec![ "descriptors[0]. z" . try_into( ) . expect( "failed parsing!" ) ] ,
415422 ) ,
416423 ]
417424 . into_iter ( )
@@ -480,8 +487,8 @@ mod tests {
480487 namespace,
481488 10 ,
482489 60 ,
483- vec ! [ "x == '1'" . try_into( ) . expect( "failed parsing!" ) ] ,
484- vec ! [ "y" . try_into( ) . expect( "failed parsing!" ) ] ,
490+ vec ! [ "descriptors[0]. x == '1'" . try_into( ) . expect( "failed parsing!" ) ] ,
491+ vec ! [ "descriptors[0]. y" . try_into( ) . expect( "failed parsing!" ) ] ,
485492 ) ;
486493
487494 let limiter = RateLimiter :: new ( 10_000 ) ;
@@ -555,8 +562,8 @@ mod tests {
555562 namespace,
556563 1 ,
557564 60 ,
558- vec ! [ "x == '1'" . try_into( ) . expect( "failed parsing!" ) ] ,
559- vec ! [ "y" . try_into( ) . expect( "failed parsing!" ) ] ,
565+ vec ! [ "descriptors[0]. x == '1'" . try_into( ) . expect( "failed parsing!" ) ] ,
566+ vec ! [ "descriptors[0]. y" . try_into( ) . expect( "failed parsing!" ) ] ,
560567 ) ;
561568
562569 let limiter = RateLimiter :: new ( 10_000 ) ;
0 commit comments