hive_router_plan_executor/headers/
plan.rs

1use ahash::HashMap;
2use hive_router_internal::expressions::vrl::compiler::Program as VrlProgram;
3use http::{HeaderName, HeaderValue};
4use regex_automata::meta::Regex;
5
6#[derive(Clone)]
7pub struct HeaderRulesPlan {
8    pub request: RequestHeaderRules,
9    pub response: ResponseHeaderRules,
10}
11
12type SubgraphName = String;
13
14#[derive(Clone, Default)]
15pub struct RequestHeaderRules {
16    pub global: Vec<RequestHeaderRule>,
17    pub by_subgraph: HashMap<SubgraphName, Vec<RequestHeaderRule>>,
18}
19
20#[derive(Clone, Default)]
21pub struct ResponseHeaderRules {
22    pub global: Vec<ResponseHeaderRule>,
23    pub by_subgraph: HashMap<SubgraphName, Vec<ResponseHeaderRule>>,
24}
25
26#[derive(Clone)]
27pub enum RequestHeaderRule {
28    PropagateNamed(RequestPropagateNamed),
29    PropagateRegex(RequestPropagateRegex),
30    InsertStatic(RequestInsertStatic),
31    InsertExpression(RequestInsertExpression),
32    RemoveNamed(RequestRemoveNamed),
33    RemoveRegex(RequestRemoveRegex),
34}
35
36#[derive(Clone)]
37pub struct RequestPropagateNamed {
38    pub names: Vec<HeaderName>,
39    pub default: Option<HeaderValue>,
40    pub rename: Option<HeaderName>,
41}
42
43#[derive(Clone)]
44pub struct RequestPropagateRegex {
45    pub include: Option<Regex>,
46    pub exclude: Option<Regex>,
47}
48
49#[derive(Clone)]
50pub struct RequestInsertStatic {
51    pub name: HeaderName,
52    pub value: HeaderValue,
53}
54
55#[derive(Clone)]
56pub struct ResponseInsertStatic {
57    pub name: HeaderName,
58    pub value: HeaderValue,
59    pub strategy: HeaderAggregationStrategy,
60}
61
62#[derive(Clone)]
63pub struct RequestInsertExpression {
64    pub name: HeaderName,
65    pub expression: Box<VrlProgram>,
66}
67
68#[derive(Clone)]
69pub struct ResponseInsertExpression {
70    pub name: HeaderName,
71    pub expression: Box<VrlProgram>,
72    pub strategy: HeaderAggregationStrategy,
73}
74
75#[derive(Clone)]
76pub struct RequestRemoveNamed {
77    pub names: Vec<HeaderName>,
78}
79
80#[derive(Clone)]
81pub struct ResponseRemoveNamed {
82    pub names: Vec<HeaderName>,
83}
84
85#[derive(Clone)]
86pub struct RequestRemoveRegex {
87    pub regex: Regex,
88}
89
90#[derive(Clone)]
91pub struct ResponseRemoveRegex {
92    pub regex: Regex,
93}
94
95#[derive(Clone)]
96pub enum ResponseHeaderRule {
97    PropagateNamed(ResponsePropagateNamed),
98    PropagateRegex(ResponsePropagateRegex),
99    InsertStatic(ResponseInsertStatic),
100    InsertExpression(ResponseInsertExpression),
101    RemoveNamed(ResponseRemoveNamed),
102    RemoveRegex(ResponseRemoveRegex),
103}
104
105#[derive(Clone)]
106pub struct ResponsePropagateNamed {
107    pub names: Vec<HeaderName>,
108    pub rename: Option<HeaderName>,
109    pub default: Option<HeaderValue>,
110    pub strategy: HeaderAggregationStrategy,
111}
112
113#[derive(Clone)]
114pub struct ResponsePropagateRegex {
115    pub include: Option<Regex>,
116    pub exclude: Option<Regex>,
117    pub strategy: HeaderAggregationStrategy,
118}
119
120#[derive(Clone, Copy)]
121pub enum HeaderAggregationStrategy {
122    First,
123    Last,
124    Append,
125}
126
127type AggregatedHeader = (HeaderAggregationStrategy, Vec<HeaderValue>);
128
129#[derive(Default)]
130pub struct ResponseHeaderAggregator {
131    pub entries: HashMap<HeaderName, AggregatedHeader>,
132}