中间件
2024/12/30大约 1 分钟hyperlanewebrustconfigmiddleware
提示
hyperlane 框架支持请求中间件和响应中间件, 支持多次注册,会按照注册顺序进行执行,如果任何阶段返回了 Status::Reject,则后续注册的逻辑将不会执行。
请求中间件
原生写法
struct RequestMiddleware;
impl ServerHook for RequestMiddleware {
async fn new(stream: &mut Stream, _: &mut Context) -> Self {
Self
}
async fn handle(self, stream: &mut Stream, ctx: &mut Context) -> Status {
ctx.get_mut_response()
.set_version(HttpVersion::Http1_1)
.set_status_code(200)
.set_header(SERVER, HYPERLANE)
.set_header(CONNECTION, KEEP_ALIVE)
.set_header(CONTENT_TYPE, TEXT_PLAIN)
.set_header(ACCESS_CONTROL_ALLOW_ORIGIN, WILDCARD_ANY);
Status::Continue
}
}
let mut server: Server = Server::default();
server.request_middleware::<RequestMiddleware>();属性宏写法
use hyperlane::*;
use hyperlane_macros::*;
#[request_middleware]
struct RequestMiddleware;
impl ServerHook for RequestMiddleware {
async fn new(stream: &mut Stream, _: &mut Context) -> Self {
Self
}
#[epilogue_macros(
response_status_code(200),
response_version(HttpVersion::Http1_1),
response_header(SERVER => HYPERLANE)
)]
async fn handle(self, stream: &mut Stream, ctx: &mut Context) -> Status {
Status::Continue
}
}指定执行顺序
提示
如果不指定 order 参数,钩子的优先级高于指定了 order 的钩子。
#[request_middleware(1)]
struct RequestMiddleware1;
#[request_middleware(2)]
struct RequestMiddleware2;响应中间件
原生写法
struct ResponseMiddleware;
impl ServerHook for ResponseMiddleware {
async fn new(_: &mut Stream, _: &mut Context) -> Self {
Self
}
async fn handle(self, stream: &mut Stream, ctx: &mut Context) -> Status {
if ctx.get_request().is_ws_upgrade_type() {
return Status::Continue;
}
let data: Vec<u8> = ctx.get_mut_response().build();
if stream.try_send(data).await.is_err() {
stream.set_closed(true);
return Status::Reject;
}
Status::Continue
}
}
let mut server: Server = Server::default();
server.response_middleware::<ResponseMiddleware>();属性宏写法
use hyperlane::*;
use hyperlane_macros::*;
#[response_middleware]
struct ResponseMiddleware;
impl ServerHook for ResponseMiddleware {
async fn new(_: &mut Stream, _: &mut Context) -> Self {
Self
}
async fn handle(self, stream: &mut Stream, ctx: &mut Context) -> Status {
Status::Continue
}
}指定执行顺序
提示
如果不指定 order 参数,钩子的优先级高于指定了 order 的钩子。
#[response_middleware(1)]
struct ResponseMiddleware1;
#[response_middleware(2)]
struct ResponseMiddleware2;