hive_router_plan_executor/headers/
plan.rs1use 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}