@@ -52,56 +52,44 @@ impl Context for TcpContext<'_> {
5252 }
5353 fn eval_part ( & self , op : & Operator ) -> StringType {
5454 match op {
55- Operator :: UpstreamHost | Operator :: UpstreamRemoteAddress => match self . upstream_peer_addr {
56- Some ( addr) => StringType :: Smol ( addr. to_smolstr ( ) ) ,
57- None => StringType :: None ,
55+ Operator :: UpstreamHost | Operator :: UpstreamRemoteAddress => {
56+ self . upstream_peer_addr . map_or ( StringType :: None , |addr| StringType :: Smol ( addr. to_smolstr ( ) ) )
5857 } ,
59- Operator :: UpstreamRemoteAddressWithoutPort => match self . upstream_peer_addr {
60- None => StringType :: None ,
61- Some ( addr) => StringType :: Smol ( addr. ip ( ) . to_smolstr ( ) ) ,
58+ Operator :: UpstreamRemoteAddressWithoutPort => {
59+ self . upstream_peer_addr . map_or ( StringType :: None , |addr| StringType :: Smol ( addr. ip ( ) . to_smolstr ( ) ) )
6260 } ,
63- Operator :: UpstreamRemotePort => match self . upstream_peer_addr {
64- None => StringType :: None ,
65- Some ( addr) => StringType :: Smol ( addr. port ( ) . to_smolstr ( ) ) ,
61+ Operator :: UpstreamRemotePort => {
62+ self . upstream_peer_addr . map_or ( StringType :: None , |addr| StringType :: Smol ( addr. port ( ) . to_smolstr ( ) ) )
6663 } ,
67- Operator :: UpstreamLocalAddress => match self . upstream_local_addr {
68- Some ( addr) => StringType :: Smol ( addr. to_smolstr ( ) ) ,
69- None => StringType :: None ,
64+ Operator :: UpstreamLocalAddress => {
65+ self . upstream_local_addr . map_or ( StringType :: None , |addr| StringType :: Smol ( addr. to_smolstr ( ) ) )
7066 } ,
71- Operator :: UpstreamLocalAddressWithoutPort => match self . upstream_local_addr {
72- Some ( addr) => StringType :: Smol ( addr. ip ( ) . to_smolstr ( ) ) ,
73- None => StringType :: None ,
67+ Operator :: UpstreamLocalAddressWithoutPort => {
68+ self . upstream_local_addr . map_or ( StringType :: None , |addr| StringType :: Smol ( addr. ip ( ) . to_smolstr ( ) ) )
7469 } ,
75- Operator :: UpstreamLocalPort => match self . upstream_local_addr {
76- Some ( addr) => StringType :: Smol ( addr. port ( ) . to_smolstr ( ) ) ,
77- None => StringType :: None ,
70+ Operator :: UpstreamLocalPort => {
71+ self . upstream_local_addr . map_or ( StringType :: None , |addr| StringType :: Smol ( addr. port ( ) . to_smolstr ( ) ) )
7872 } ,
79- Operator :: DownstreamLocalAddress => match self . downstream_local_addr {
80- Some ( addr) => StringType :: Smol ( addr. to_smolstr ( ) ) ,
81- None => StringType :: None ,
73+ Operator :: DownstreamLocalAddress => {
74+ self . downstream_local_addr . map_or ( StringType :: None , |addr| StringType :: Smol ( addr. to_smolstr ( ) ) )
8275 } ,
83- Operator :: DownstreamLocalAddressWithoutPort => match self . downstream_local_addr {
84- Some ( addr) => StringType :: Smol ( addr. ip ( ) . to_smolstr ( ) ) ,
85- None => StringType :: None ,
76+ Operator :: DownstreamLocalAddressWithoutPort => {
77+ self . downstream_local_addr . map_or ( StringType :: None , |addr| StringType :: Smol ( addr. ip ( ) . to_smolstr ( ) ) )
8678 } ,
87- Operator :: DownstreamLocalPort => match self . downstream_local_addr {
88- Some ( addr) => StringType :: Smol ( addr. port ( ) . to_smolstr ( ) ) ,
89- None => StringType :: None ,
79+ Operator :: DownstreamLocalPort => {
80+ self . downstream_local_addr . map_or ( StringType :: None , |addr| StringType :: Smol ( addr. port ( ) . to_smolstr ( ) ) )
9081 } ,
9182
92- Operator :: DownstreamRemoteAddress => match self . downstream_peer_addr {
93- Some ( addr) => StringType :: Smol ( addr. to_smolstr ( ) ) ,
94- None => StringType :: None ,
83+ Operator :: DownstreamRemoteAddress => {
84+ self . downstream_peer_addr . map_or ( StringType :: None , |addr| StringType :: Smol ( addr. to_smolstr ( ) ) )
9585 } ,
9686
97- Operator :: DownstreamRemoteAddressWithoutPort => match self . downstream_peer_addr {
98- Some ( addr) => StringType :: Smol ( addr. ip ( ) . to_smolstr ( ) ) ,
99- None => StringType :: None ,
87+ Operator :: DownstreamRemoteAddressWithoutPort => {
88+ self . downstream_peer_addr . map_or ( StringType :: None , |addr| StringType :: Smol ( addr. ip ( ) . to_smolstr ( ) ) )
10089 } ,
10190
102- Operator :: DownstreamRemotePort => match self . downstream_peer_addr {
103- Some ( addr) => StringType :: Smol ( addr. port ( ) . to_smolstr ( ) ) ,
104- None => StringType :: None ,
91+ Operator :: DownstreamRemotePort => {
92+ self . downstream_peer_addr . map_or ( StringType :: None , |addr| StringType :: Smol ( addr. port ( ) . to_smolstr ( ) ) )
10593 } ,
10694
10795 Operator :: UpstreamCluster | Operator :: UpstreamClusterRaw => {
@@ -142,8 +130,9 @@ fn hash_connection(local: Option<&SocketAddr>, peer: Option<&SocketAddr>, protoc
142130
143131#[ derive( Clone , Debug ) ]
144132pub struct UpstreamContext < ' a > {
145- pub authority : & ' a Authority ,
146- pub cluster_name : & ' a str ,
133+ pub authority : Option < & ' a Authority > ,
134+ pub cluster_name : Option < & ' a str > ,
135+ pub route_name : & ' a str ,
147136}
148137
149138impl Context for UpstreamContext < ' _ > {
@@ -152,10 +141,13 @@ impl Context for UpstreamContext<'_> {
152141 }
153142 fn eval_part ( & self , op : & Operator ) -> StringType {
154143 match op {
155- Operator :: UpstreamHost => StringType :: Smol ( SmolStr :: new ( self . authority . as_str ( ) ) ) ,
144+ Operator :: UpstreamHost => {
145+ self . authority . map_or ( StringType :: None , |name| StringType :: Smol ( SmolStr :: new ( name) ) )
146+ } ,
156147 Operator :: UpstreamCluster | Operator :: UpstreamClusterRaw => {
157- StringType :: Smol ( SmolStr :: new ( self . cluster_name ) )
148+ self . cluster_name . map_or ( StringType :: None , |cluster_name| StringType :: Smol ( SmolStr :: new ( cluster_name) ) )
158149 } ,
150+ Operator :: RouteName => StringType :: Smol ( SmolStr :: new ( self . route_name ) ) ,
159151 _ => StringType :: None ,
160152 }
161153 }
@@ -184,6 +176,7 @@ pub struct InitHttpContext<'a, T> {
184176 pub downstream_request : & ' a Request < T > ,
185177 pub request_head_size : usize ,
186178 pub trace_id : Option < u128 > ,
179+ pub server_name : Option < & ' a str > ,
187180}
188181
189182impl < T > Context for InitHttpContext < ' _ , T > {
@@ -197,6 +190,7 @@ impl<T> Context for InitHttpContext<'_, T> {
197190 request : self . downstream_request ,
198191 trace_id : self . trace_id ,
199192 request_head_size : self . request_head_size ,
193+ server_name : self . server_name ,
200194 }
201195 . eval_part ( op) ,
202196 }
@@ -259,6 +253,9 @@ pub struct FinishContext {
259253 pub bytes_received : u64 ,
260254 pub bytes_sent : u64 ,
261255 pub response_flags : ResponseFlags ,
256+ pub upstream_failure : Option < & ' static str > ,
257+ pub response_code_details : Option < & ' static str > ,
258+ pub connection_termination_details : Option < & ' static str > ,
262259}
263260
264261impl Context for FinishContext {
@@ -281,6 +278,15 @@ impl Context for FinishContext {
281278 let mut buffer = itoa:: Buffer :: new ( ) ;
282279 StringType :: Smol ( SmolStr :: new ( buffer. format ( self . bytes_sent ) ) )
283280 } ,
281+ Operator :: UpstreamTransportFailureReason => {
282+ self . upstream_failure . map_or ( StringType :: None , |msg| StringType :: Smol ( SmolStr :: new_static ( msg) ) )
283+ } ,
284+ Operator :: ResponseCodeDetails => {
285+ self . response_code_details . map_or ( StringType :: None , |msg| StringType :: Smol ( SmolStr :: new_static ( msg) ) )
286+ } ,
287+ Operator :: ConnectionTerminationDetails => self
288+ . connection_termination_details
289+ . map_or ( StringType :: None , |msg| StringType :: Smol ( SmolStr :: new_static ( msg) ) ) ,
284290 _ => StringType :: None ,
285291 }
286292 }
@@ -290,6 +296,7 @@ pub struct DownstreamContext<'a, T> {
290296 pub request : & ' a Request < T > ,
291297 pub request_head_size : usize ,
292298 pub trace_id : Option < u128 > ,
299+ pub server_name : Option < & ' a str > ,
293300}
294301
295302pub struct DownstreamResponse < ' a , T > {
@@ -336,21 +343,18 @@ impl<T> Context for DownstreamContext<'_, T> {
336343 StringType :: None
337344 }
338345 } ,
339- Operator :: Request ( h) => {
340- let hv = self . request . headers ( ) . get ( h. 0 . as_str ( ) ) ;
341- match hv {
342- Some ( hv) => StringType :: Bytes ( hv. as_bytes ( ) . into ( ) ) ,
343- None => StringType :: None ,
344- }
345- } ,
346- Operator :: TraceId => {
347- if let Some ( trace_id) = self . trace_id {
348- StringType :: Smol ( format_smolstr ! ( "{:032x}" , trace_id) )
349- } else {
350- StringType :: None
351- }
352- } ,
346+ Operator :: Request ( h) => self
347+ . request
348+ . headers ( )
349+ . get ( h. 0 . as_str ( ) )
350+ . map_or ( StringType :: None , |hv| StringType :: Bytes ( hv. as_bytes ( ) . into ( ) ) ) ,
351+ Operator :: TraceId => self
352+ . trace_id
353+ . map_or ( StringType :: None , |trace_id| StringType :: Smol ( format_smolstr ! ( "{:032x}" , trace_id) ) ) ,
353354 Operator :: Protocol => StringType :: Smol ( SmolStr :: new_static ( self . request . version ( ) . to_static_str ( ) ) ) ,
355+ Operator :: RequestedServerName => {
356+ self . server_name . map_or ( StringType :: None , |sni| StringType :: Smol ( SmolStr :: new ( sni) ) )
357+ } ,
354358 _ => StringType :: None ,
355359 }
356360 }
@@ -394,13 +398,11 @@ impl<T> Context for DownstreamResponse<'_, T> {
394398 Operator :: ResponseStatus | Operator :: ResponseCode => {
395399 StringType :: Smol ( SmolStr :: new_inline ( self . response . status ( ) . as_str ( ) ) )
396400 } ,
397- Operator :: Response ( header_name) => {
398- let hv = self . response . headers ( ) . get ( header_name. 0 . as_str ( ) ) ;
399- match hv {
400- Some ( hv) => StringType :: Bytes ( hv. as_bytes ( ) . into ( ) ) ,
401- None => StringType :: None ,
402- }
403- } ,
401+ Operator :: Response ( header_name) => self
402+ . response
403+ . headers ( )
404+ . get ( header_name. 0 . as_str ( ) )
405+ . map_or ( StringType :: None , |hv| StringType :: Bytes ( hv. as_bytes ( ) . into ( ) ) ) ,
404406 _ => StringType :: None ,
405407 }
406408 }
0 commit comments