Закрыть соединение без отправки ответа на Actix-web

Я пытаюсь найти способ не отвечать на нежелательный запрос (приравниваемый к ddos), закрывая соединение, не сообщая об этом клиенту. Таким образом, стек соединений TIME-WAIT устройства-эмиттера будет расти до тех пор, пока новые соединения больше не будут возможны, в то время как на моей стороне все в порядке.

Я просмотрел руководство actix.rs и документацию docs.rs, но не нашел способа закрыть соединение без ответа, всегда требуется тело. На самом деле у меня есть эта функция как запись по умолчанию:

async fn defaultentry(req: HttpRequest) -> impl Responder {
    HttpResponse::build(StatusCode::from_u16(503).unwrap())
        .force_close()
        .finish()
}
#[actix_web::main]
async fn main() -> std::io::Result<()> {
    HttpServer::new(move || {
        App::new()
            .default_service(
                web::get().to(defaultentry)
            )
    })
    .bind(("0.0.0.0", 8080))?
    .run()
    .await
}
[JS за 1 час] - 9. Асинхронный
[JS за 1 час] - 9. Асинхронный
JavaScript является однопоточным, то есть он может обрабатывать только одну задачу за раз. Для обработки длительных задач, таких как сетевые запросы,...
Топ-10 компаний-разработчиков PHP
Топ-10 компаний-разработчиков PHP
Если вы ищете надежных разработчиков PHP рядом с вами, вот список лучших компаний по разработке PHP.
Скраппинг поиска Apple App Store с помощью Python
Скраппинг поиска Apple App Store с помощью Python
📌Примечание: В этой статье я покажу вам, как скрапировать поиск Apple App Store и получить точно такой же результат, как на Apple iMac, потому что...
Редкие достижения на Github ✨
Редкие достижения на Github ✨
Редкая коллекция доступна в профиле на GitHub ✨
Подъем в javascript
Подъем в javascript
Hoisting - это поведение в JavaScript, при котором переменные и объявления функций автоматически "перемещаются" в верхнюю часть соответствующих...
Улучшение генерации файлов Angular
Улучшение генерации файлов Angular
Angular - это фреймворк. Вы можете создать практически любое приложение без использования сторонних библиотек.
1
0
53
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете вызвать регистрацию обработчика on_connect на HttpServer, чтобы отключите соединение. Насколько я знаю, нет способа сделать это из обработчика.

#[actix_web::main]
async fn main() -> std::io::Result<()> {
    HttpServer::new(move || {
        App::new()
            .default_service(
                web::get().to(defaultentry)
            )
    })
    .on_connect(|c, _| {
        if true { // whatever you're looking for
            c.downcast_ref::<TcpStream>().unwrap().shutdown(Shutdown::Both).unwrap();
        }
    })
    .bind(("0.0.0.0", 8080))?
    .run()
    .await
}

Спасибо, я был далек от хорошей практики. Для последующего использования TcpStream больше не имеет метода .shutdown(), вместо этого используйте <UnixDatagram> (1.22.0 при написании этой строки). c.downcast_ref::<UnixDatagram>().unwrap().shutdown(Shutdown:‌​:Both).unwrap();

Agathe_DVY 21.11.2022 18:10

Хм? Любопытно, я использую ржавчину 1.65, и в ней std::net::TcpStream есть .shutdown().

cafce25 21.11.2022 18:43

Плохо, я использовал структуру TcpStream Actix-web. Вы правы, это хорошо работает с std::net::TcpStream.

Agathe_DVY 22.11.2022 00:42

Другие вопросы по теме