@@ -178,6 +178,36 @@ impl NativeHttp1RouteProxy {
178178 . unwrap_or ( NativeRateLimitDecision :: Allow )
179179 }
180180
181+ pub ( crate ) fn check_vhost_rate_limit (
182+ & self ,
183+ client_ip : Option < IpAddr > ,
184+ ) -> NativeRateLimitDecision {
185+ self . rate_limit . check ( client_ip)
186+ }
187+
188+ pub ( crate ) fn check_route_rate_limits (
189+ & self ,
190+ first : Option < & NativeHttp1RouteProxyRoute > ,
191+ second : Option < & NativeHttp1RouteProxyRoute > ,
192+ client_ip : Option < IpAddr > ,
193+ ) -> NativeRateLimitDecision {
194+ let mut delay = None ;
195+ for route in unique_route_pair ( first, second) {
196+ match route. rate_limit . check ( client_ip) {
197+ NativeRateLimitDecision :: Allow => { }
198+ NativeRateLimitDecision :: Delay ( route_delay) => {
199+ delay = Some (
200+ delay. map_or ( route_delay, |current : Duration | current. max ( route_delay) ) ,
201+ ) ;
202+ }
203+ decision => return decision,
204+ }
205+ }
206+ delay
207+ . map ( NativeRateLimitDecision :: Delay )
208+ . unwrap_or ( NativeRateLimitDecision :: Allow )
209+ }
210+
181211 pub ( crate ) async fn acquire_concurrency_permits (
182212 & self ,
183213 route : Option < & NativeHttp1RouteProxyRoute > ,
@@ -193,6 +223,37 @@ impl NativeHttp1RouteProxy {
193223 }
194224 Ok ( permits)
195225 }
226+
227+ pub ( crate ) async fn acquire_vhost_concurrency_permit (
228+ & self ,
229+ ) -> Result < Option < NativeConcurrencyPermit > , u16 > {
230+ self . concurrency . acquire ( ) . await
231+ }
232+
233+ pub ( crate ) async fn acquire_route_concurrency_permits (
234+ & self ,
235+ first : Option < & NativeHttp1RouteProxyRoute > ,
236+ second : Option < & NativeHttp1RouteProxyRoute > ,
237+ ) -> Result < Vec < NativeConcurrencyPermit > , u16 > {
238+ let mut permits = Vec :: with_capacity ( 2 ) ;
239+ for route in unique_route_pair ( first, second) {
240+ if let Some ( permit) = route. concurrency . acquire ( ) . await ? {
241+ permits. push ( permit) ;
242+ }
243+ }
244+ Ok ( permits)
245+ }
246+ }
247+
248+ fn unique_route_pair < ' a > (
249+ first : Option < & ' a NativeHttp1RouteProxyRoute > ,
250+ second : Option < & ' a NativeHttp1RouteProxyRoute > ,
251+ ) -> impl Iterator < Item = & ' a NativeHttp1RouteProxyRoute > {
252+ first. into_iter ( ) . chain (
253+ second
254+ . into_iter ( )
255+ . filter ( move |route| first. is_none_or ( |first| !std:: ptr:: eq ( first, * route) ) ) ,
256+ )
196257}
197258
198259impl NativeHttp1RouteProxyRoute {
0 commit comments