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服务器
每月64次下载
27KB
510 行
TOWER允许主机
项目状态及信息
许可证 | Crates版本 | 文档 |
---|---|---|
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