mll-axum-utils 0.2.1

一个 Axum 的工具库
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)
    }
}