Skip to content

Commit 8941898

Browse files
committed
Wired proper descriptor wiring into context
Signed-off-by: Alex Snaps <[email protected]>
1 parent 7cc4ff4 commit 8941898

File tree

11 files changed

+82
-57
lines changed

11 files changed

+82
-57
lines changed

limitador-server/examples/envoy.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,8 @@ static_resources:
2828
rate_limits:
2929
- stage: 0
3030
actions:
31-
- {request_headers: {header_name: "userid", descriptor_key: "user_id"}}
32-
- { request_headers: { header_name: ":method", descriptor_key: "req_method" } }
31+
- { request_headers: { header_name: "userid", descriptor_key: "user_id" } }
32+
- { request_headers: { header_name: ":method", descriptor_key: "descriptors[0]['method']" } }
3333
http_filters:
3434
- name: envoy.filters.http.ratelimit
3535
typed_config:

limitador-server/examples/limits.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,6 @@
1010
max_value: 5
1111
seconds: 60
1212
conditions:
13-
- "req_method == 'POST'"
13+
- "descriptors[0]['req.method'] == 'POST'"
1414
variables:
1515
- user_id

limitador-server/sandbox/README.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -99,11 +99,11 @@ bin/grpcurl -plaintext -d @ 127.0.0.1:18081 envoy.service.ratelimit.v3.RateLimit
9999
{
100100
"entries": [
101101
{
102-
"key": "req_method",
102+
"key": "req.method",
103103
"value": "POST"
104104
},
105105
{
106-
"key": "req_path",
106+
"key": "req.path",
107107
"value": "/"
108108
}
109109
]
@@ -125,11 +125,11 @@ while :; do bin/grpcurl -plaintext -d @ 127.0.0.1:18081 envoy.service.ratelimit.
125125
{
126126
"entries": [
127127
{
128-
"key": "req_method",
128+
"key": "req.method",
129129
"value": "POST"
130130
},
131131
{
132-
"key": "req_path",
132+
"key": "req.path",
133133
"value": "/"
134134
}
135135
]

limitador-server/sandbox/envoy.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,10 @@ static_resources:
2727
- actions:
2828
- request_headers:
2929
header_name: :method
30-
descriptor_key: req_method
30+
descriptor_key: req.method
3131
- request_headers:
3232
header_name: :path
33-
descriptor_key: req_path
33+
descriptor_key: req.path
3434
http_filters:
3535
- name: envoy.filters.http.ratelimit
3636
typed_config:

limitador-server/sandbox/envoy2.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,10 @@ static_resources:
2727
- actions:
2828
- request_headers:
2929
header_name: :method
30-
descriptor_key: req_method
30+
descriptor_key: req.method
3131
- request_headers:
3232
header_name: :path
33-
descriptor_key: req_path
33+
descriptor_key: req.path
3434
http_filters:
3535
- name: envoy.filters.http.ratelimit
3636
typed_config:

limitador-server/sandbox/envoy3.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,10 @@ static_resources:
2727
- actions:
2828
- request_headers:
2929
header_name: :method
30-
descriptor_key: req_method
30+
descriptor_key: req.method
3131
- request_headers:
3232
header_name: :path
33-
descriptor_key: req_path
33+
descriptor_key: req.path
3434
http_filters:
3535
- name: envoy.filters.http.ratelimit
3636
typed_config:

limitador-server/sandbox/limits.yaml

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,20 +3,20 @@
33
max_value: 10
44
seconds: 60
55
conditions:
6-
- "req_method == 'GET'"
7-
- "req_path != '/json'"
6+
- "descriptors[0]['req.method'] == 'GET'"
7+
- "descriptors[0]['req.path'] != '/json'"
88
variables: []
99
- namespace: test_namespace
1010
max_value: 5
1111
seconds: 60
1212
conditions:
13-
- "req_method == 'POST'"
14-
- "req_path != '/json'"
13+
- "descriptors[0]['req.method'] == 'POST'"
14+
- "descriptors[0]['req.path'] != '/json'"
1515
variables: []
1616
- namespace: test_namespace
1717
max_value: 50000
1818
seconds: 10
1919
conditions:
20-
- "req_method == 'GET'"
21-
- "req_path == '/json'"
20+
- "descriptors[0]['req.method'] == 'GET'"
21+
- "descriptors[0]['req.path'] == '/json'"
2222
variables: []

limitador-server/sandbox/load-test.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,11 @@
55
{
66
"entries": [
77
{
8-
"key": "req_method",
8+
"key": "req.method",
99
"value": "GET"
1010
},
1111
{
12-
"key": "req_path",
12+
"key": "req.path",
1313
"value": "/json"
1414
}
1515
]

limitador-server/sandbox/redis-otel/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ bin/grpcurl -plaintext -d @ 127.0.0.1:18081 envoy.service.ratelimit.v3.RateLimit
2424
{
2525
"entries": [
2626
{
27-
"key": "req_method",
27+
"key": "req.method",
2828
"value": "POST"
2929
}
3030
]

limitador-server/src/envoy_rls/server.rs

Lines changed: 41 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,6 @@ use opentelemetry::propagation::Extractor;
33
use std::collections::HashMap;
44
use 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-
126
use crate::envoy_rls::server::envoy::config::core::v3::HeaderValue;
137
use crate::envoy_rls::server::envoy::service::ratelimit::v3::rate_limit_response::Code;
148
use 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
};
2014
use crate::prometheus_metrics::PrometheusMetrics;
2115
use 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

2323
include!("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,24 @@ 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'"
411+
.try_into()
412+
.expect("failed parsing!")],
413+
vec!["descriptors[0].z".try_into().expect("failed parsing!")],
405414
),
406415
Limit::new(
407416
namespace,
408417
0,
409418
60,
410419
vec![
411-
"x == '1'".try_into().expect("failed parsing!"),
412-
"y == '2'".try_into().expect("failed parsing!"),
420+
"descriptors[0].x == '1'"
421+
.try_into()
422+
.expect("failed parsing!"),
423+
"descriptors[1].y == '2'"
424+
.try_into()
425+
.expect("failed parsing!"),
413426
],
414-
vec!["z".try_into().expect("failed parsing!")],
427+
vec!["descriptors[0].z".try_into().expect("failed parsing!")],
415428
),
416429
]
417430
.into_iter()
@@ -480,8 +493,10 @@ mod tests {
480493
namespace,
481494
10,
482495
60,
483-
vec!["x == '1'".try_into().expect("failed parsing!")],
484-
vec!["y".try_into().expect("failed parsing!")],
496+
vec!["descriptors[0].x == '1'"
497+
.try_into()
498+
.expect("failed parsing!")],
499+
vec!["descriptors[0].y".try_into().expect("failed parsing!")],
485500
);
486501

487502
let limiter = RateLimiter::new(10_000);
@@ -555,8 +570,10 @@ mod tests {
555570
namespace,
556571
1,
557572
60,
558-
vec!["x == '1'".try_into().expect("failed parsing!")],
559-
vec!["y".try_into().expect("failed parsing!")],
573+
vec!["descriptors[0].x == '1'"
574+
.try_into()
575+
.expect("failed parsing!")],
576+
vec!["descriptors[0].y".try_into().expect("failed parsing!")],
560577
);
561578

562579
let limiter = RateLimiter::new(10_000);

0 commit comments

Comments
 (0)