mirror of
https://github.com/telemt/telemt.git
synced 2026-11-01 21:31:58 +03:00
48 lines
1.4 KiB
Rust
48 lines
1.4 KiB
Rust
use std::net::IpAddr;
|
|
use std::time::Instant;
|
|
|
|
use super::state::{ManagerState, allow_rate};
|
|
use super::{ProfileKey, WebProcessRuntime};
|
|
use crate::config::WebRuntimeProfile;
|
|
use crate::web::telemetry::WebRejectionReason;
|
|
|
|
/// Applies process, address, profile, and rate ceilings to one initial session.
|
|
pub(super) fn admit_initial(
|
|
runtime: &WebProcessRuntime,
|
|
state: &mut ManagerState,
|
|
now: Instant,
|
|
client_ip: IpAddr,
|
|
profile_key: ProfileKey,
|
|
profile: &WebRuntimeProfile,
|
|
) -> bool {
|
|
if state.sessions.len() >= runtime.limits.max_sessions_global
|
|
|| state.sessions_per_ip.get(&client_ip).copied().unwrap_or(0)
|
|
>= runtime.limits.max_sessions_per_ip
|
|
|| state
|
|
.sessions_per_profile
|
|
.get(&profile_key)
|
|
.copied()
|
|
.unwrap_or(0)
|
|
>= profile.shared.max_sessions
|
|
{
|
|
runtime.record_limit_hit();
|
|
runtime
|
|
.telemetry
|
|
.record_rejection(WebRejectionReason::SessionCapacity);
|
|
return false;
|
|
}
|
|
if !allow_rate(
|
|
&mut state.session_rate,
|
|
now,
|
|
runtime.limits.new_sessions_per_minute,
|
|
runtime.limits.new_sessions_burst,
|
|
) {
|
|
runtime.record_limit_hit();
|
|
runtime
|
|
.telemetry
|
|
.record_rejection(WebRejectionReason::SessionRate);
|
|
return false;
|
|
}
|
|
true
|
|
}
|