use std::{
collections::HashSet,
net::{IpAddr, SocketAddr},
};
use axum::{
body::Body,
extract::ConnectInfo,
http::Request,
response::{IntoResponse, Response},
};
use super::Intercept;
use crate::res::Res;
#[derive(Clone)]
pub struct Blacklist {
pub ips: HashSet<IpAddr>,
}
impl Intercept for Blacklist {
fn before(&self, req: Request<Body>) -> Result<Request<Body>, Response> {
if let Some(info) = req.extensions().get::<ConnectInfo<SocketAddr>>() {
if self.ips.contains(&info.0.ip()) {
return Err(Res::<()>::error("黑名单用户禁止访问").into_response());
}
}
Ok(req)
}
}