< 返回版块

lithbitren 发表于 2021-01-06 11:42

Tags:actix

像Golang的主流框架基本都通过conn, _, _ = Context....Hijack()取出连接对象,然后conn.Close()关闭,4开头和5开头的状态码信息也不返回,Rust里的web框架怎么实现呢?

评论区

写评论
作者 lithbitren 2022-10-11 18:10

能再详细点吗大佬,tcpstream是要split后才能shutdown吗,好像没找到直接shutdown的api啊,shutdown以后链接的生命周期会立即结束吗?还有在一般中间件或句柄里怎么获得tcpstream,on_connect在框架里的执行顺序是怎样的?

--
👇
elsejj: actix-web 的话,可以看看这个机制 https://github.com/actix/actix-web/pull/1754

按照官方的示例

fn get_conn_info(connection: &dyn Any, data: &mut Extensions) {
    if let Some(sock) = connection.downcast_ref::<TcpStream>() {
        data.insert(ConnectionInfo {
            bind: sock.local_addr().unwrap(),
            peer: sock.peer_addr().unwrap(),
            ttl: sock.ttl().ok(),
        });
    } else {
        unreachable!("connection should only be plaintext since no TLS is set up");
    }
}

#[actix_web::main]
async fn main() -> io::Result<()> {
    env_logger::init_from_env(env_logger::Env::new().default_filter_or("info"));

    let bind = ("127.0.0.1", 8080);
    log::info!("staring server at http://{}:{}", &bind.0, &bind.1);

    HttpServer::new(|| App::new().default_service(web::to(route_whoami)))
        .on_connect(get_conn_info)
        .bind(bind)?
        .workers(1)
        .run()
        .await
}

get_conn_info 可以得到一个 TcpStream ,它有 shutdown 方法

elsejj 2022-10-10 10:51

actix-web 的话,可以看看这个机制 https://github.com/actix/actix-web/pull/1754

按照官方的示例

fn get_conn_info(connection: &dyn Any, data: &mut Extensions) {
    if let Some(sock) = connection.downcast_ref::<TcpStream>() {
        data.insert(ConnectionInfo {
            bind: sock.local_addr().unwrap(),
            peer: sock.peer_addr().unwrap(),
            ttl: sock.ttl().ok(),
        });
    } else {
        unreachable!("connection should only be plaintext since no TLS is set up");
    }
}

#[actix_web::main]
async fn main() -> io::Result<()> {
    env_logger::init_from_env(env_logger::Env::new().default_filter_or("info"));

    let bind = ("127.0.0.1", 8080);
    log::info!("staring server at http://{}:{}", &bind.0, &bind.1);

    HttpServer::new(|| App::new().default_service(web::to(route_whoami)))
        .on_connect(get_conn_info)
        .bind(bind)?
        .workers(1)
        .run()
        .await
}

get_conn_info 可以得到一个 TcpStream ,它有 shutdown 方法

作者 lithbitren 2022-10-03 12:45

2022/10,现在有人可以回答这个问题了吗?

初衷是拿到请求头判断恶意以后断开链接,连状态码都不返回,也不读取载荷,避免带宽恶意消耗。进一步来说,实现高性能即时动态ip黑名单,最好是tcpconnect获得ip后就直接断掉链接,连请求头都不放进缓存。不过后者在web框架里似乎没有先例,nginx等反向代理也达不到即时的效果,自己用tokio再撸一层反向代理又感觉太丑陋了。

github.com/shanliu/lsys 2021-01-15 19:46

Drop

作者 lithbitren 2021-01-07 11:54

这个是客户端的,而且似乎也是改请求头而已。

--
👇
gwy15: https://docs.rs/actix-web/3.3.2/actix_web/client/struct.ClientRequest.html#method.force_close

作者 lithbitren 2021-01-07 11:53

对就是直接断开tcp连接,force_close似乎只是在请求头提示关闭连接吧?不过这种api似乎在各个框架里都比较隐秘,python的web框架里我也没找到

--
👇
fakeshadow: 你想要的应该是直接drop或者shutdown Tcp/UnixStream. actix-web并不暴露api让你直接操作这些stream. 你可以使用ResponseBuilder::force_close来强制关闭连接

gwy15 2021-01-07 10:35

https://docs.rs/actix-web/3.3.2/actix_web/client/struct.ClientRequest.html#method.force_close

fakeshadow 2021-01-06 16:12

你想要的应该是直接drop或者shutdown Tcp/UnixStream. actix-web并不暴露api让你直接操作这些stream. 你可以使用ResponseBuilder::force_close来强制关闭连接

93996817 2021-01-06 14:03

生命周期结束自动关闭 想控制关闭 就 加 括号 {.....}

1 共 9 条评论, 1 页