Как вернуть HTTP 403 из входного фильтра веб-сервера apache?

Я написал модуль apache 2.x, который пытается сканировать тела запросов и условно возвращать 403 Forbidden, если определенные шаблоны совпадают.

Моя первая попытка использовала ap_hook_handler перехватить запрос, отсканировать его и затем вернуть DECLINED реальный обработчик может взять на себя (или 403, если условия были выполнены).

Проблема с этим подходом, когда я читаю тело запроса POST (используя ap_get_client_block и друзья), он, по-видимому, потребляет тело, поэтому, если запрос был обработан mod_proxy, тело исчезнет.

Я думаю, что правильный способ сканирования тела будет использовать входной фильтр, кроме входного фильтра может только вернуть APR_SUCCESS или потерпеть неудачу. Все коды возврата, кроме APR_SUCCESS, переводятся в HTTP 400 Bad Request,

Я думаю, что, может быть, я смогу сохранить флаг в примечаниях к запросу, если входной фильтр хочет отклонить запрос, но я не уверен, какой позже перехватить это.

1 ответ

Оказалось, довольно легко - просто бросить ведро с ошибками в бригаду:

apr_bucket_brigade *brigade = apr_brigade_create(f->r->pool, f->r->connection->bucket_alloc);
apr_bucket *bucket = ap_bucket_error_create(403, NULL, f->r->pool,
        f->r->connection->bucket_alloc);
APR_BRIGADE_INSERT_TAIL(brigade, bucket);
bucket = apr_bucket_eos_create(f->r->connection->bucket_alloc);
APR_BRIGADE_INSERT_TAIL(brigade, bucket);
ap_pass_brigade(f->next, brigade);
Другие вопросы по тегам