7个版本 (破坏性)

0.6.1 2024年3月14日
0.6.0 2024年2月4日
0.5.0 2024年1月31日
0.4.0 2024年1月2日
0.1.0 2023年8月7日

#248 in HTTP服务器

Download history 2/week @ 2024-04-14 3/week @ 2024-06-30 61/week @ 2024-07-28

每月64次下载

MIT许可证

27KB
510

TOWER允许主机

项目状态及信息

许可证 Crates版本 文档
License: MIT Crate Docs

Tower服务,限制只从主机请求数据

作为依赖项添加

编辑Cargo.toml文件以将tower_allowed_hosts添加为依赖项

[dependencies]
tower_allowed_hosts = "0.6.1"

使用方法

要使用非正则表达式的主机,可以使用

let tower_layer = tower_allowed_hosts::AllowedHostLayer::default().extend(&["127.0.0.1".to_string()]);

如果您需要使用基于通配符的主机匹配,则需要为crate启用wildcard功能,然后可以使用

let tower_layer = tower_allowed_hosts::AllowedHostLayer::default().extend_wildcard(&["127.0.0.*".to_string()]);

如果您需要使用基于正则表达式的主机匹配,则需要为crate启用regex功能,然后可以使用

let tower_layer = tower_allowed_hosts::AllowedHostLayer::default().extend_regex(&[regex::Regex::new("^127.0.0.1$")?]);

在创建层之后,您可以在支持tower作为组件的库中使用该层

例如,要在axum中使用tower允许主机,还需要添加HandleErrorLayer,以便正确处理错误

use axum::{
    error_handling::HandleErrorLayer,
    http::StatusCode,
    Router
};
use tower::ServiceBuilder;
use tower_allowed_hosts::AllowedHostLayer;

fn router() -> Router {
    let handle_error_layer = HandleErrorLayer::new(handle_box_error);

    let allowed_hosts_layer = AllowedHostLayer::default()
        .extend_wildcard(&["127.0.0.*".to_string()]);

     let layer = ServiceBuilder::new()
        .layer(handle_error_layer)
        .layer(allowed_hosts_layer);

    Router::new().layer(layer)
}

async fn handle_box_error(err: tower::BoxError) -> (StatusCode, String) {
    if err.is::<tower_allowed_hosts::error::Error>() {
        return (StatusCode::BAD_REQUEST, err.to_string());
    }
    return (StatusCode::INTERNAL_SERVER_ERROR, "".to_string())
}

还有扩展在解析允许主机和允许主机后添加,可以使用tower_allowed_hosts::Host结构体扩展

依赖关系

~1.6–2.8MB
~50K SLoC