Welcome! Log In Create A New Profile

Advanced

Re: считать POST реквест в буффер

Valery Kholodkov
December 11, 2010 04:50PM
Проще, наверное, так:

static ngx_int_t
ngx_http_my_handler(ngx_http_request_t *r)
{
ngx_int_t rc;

r->request_body_in_single_buf = 1;

rc = ngx_http_read_client_request_body(r, ngx_http_my_body_handler);

if (rc >= NGX_HTTP_SPECIAL_RESPONSE) {
return rc;
}

return NGX_DONE;
}

Соответственно, тело запроса искать в r->request_body->buf.

magz пишет:
> Здравствуйте,
>
> подскажите пожалуйскта как правильно
> считать пост реквест в буффер.
> Я нашел модуль form_input там через функции
> NDK делается регистрируется handler так:
> value = cf->args->elts;
> filter.func = ngx_http_set_form_input;
> return ndk_set_var_multi_value_core (cf, value, &s, &filter)
>
> Далее делается вот так:
> cmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_core_module);
> h =
> ngx_array_push(&cmcf->phases[NGX_HTTP_SERVER_REWRITE_PHASE].handlers);
> *h = ngx_http_form_input_handler;
> h = ngx_array_push(&cmcf->phases[NGX_HTTP_REWRITE_PHASE].handlers);
> *h = ngx_http_form_input_handler;
>
> После этого крутимся внутри
> ngx_http_form_input_handler() c ngx_http_read_client_request_body()
> возвращая NGX_AGAIN и если читался весь POST
> то возвращаем NGX_DECLINED. ( Необходимо
> склеить пост в 1 буффер, если он был
> передан от браузера в несколько
> пакетов).
>
> Далее вызывается обрабочик который мы
> заререгистрировали выше ngx_http_set_form_input()
> в котором читаем запрос:
> Размер:
> len = 0;
> for (cl = r->request_body->bufs; cl != NULL; cl = cl->next) {
> len += cl->buf->last - cl->buf->pos;
> }
>
> Сам буфер:
> p = buf;
> for (cl = r->request_body->bufs; cl; cl = cl->next) {
> p = ngx_copy(p, cl->buf->pos, cl->buf->last - cl->buf->pos);
> p += cl->buf->last - cl->buf->pos;
> }
>
> Теперь у меня возникает проблемма как
> это сделать правильно. Как правильно
> зарегистривовать обработчик
> ngx_http_set_form_input()? Я посмотрел на другие
> модули. Они используют так называемые
> фильтры:
> ngx_http_next_body_filter = ngx_http_top_body_filter;
> ngx_http_top_body_filter = ngx_http_my_module_body_filter;
>
> Я попробовал так сделать, но в
> ngx_http_my_module_body_filter() получаю r->request_body ==
> NULL. Соответственно никаких буферов не
> видно.
>
> Как бы переписать:
> value = cf->args->elts;
> filter.func = ngx_http_set_form_input;
> return ndk_set_var_multi_value_core (cf, value, &s, &filter)
> что-бы обработчик вызывался без NDK?
>
> Или может есть где-нибудь красивый
> пример где можно полностью прочитать
> запрос от браузера?

--
Best regards,
Valery Kholodkov

_______________________________________________
nginx-ru mailing list
nginx-ru@nginx.org
http://nginx.org/mailman/listinfo/nginx-ru
Subject Author Posted

считать POST реквест в буффер

magz December 11, 2010 11:41AM

Re: считать POST реквест в буффер

Valery Kholodkov December 11, 2010 04:50PM

Re: считать POST реквест в буффер

magz December 11, 2010 05:55PM

Re: считать POST реквест в буффер

Valery Kholodkov December 11, 2010 06:20PM

Re: считать POST реквест в буффер

magz December 11, 2010 07:49PM

Re: считать POST реквест в буффер

Maxim Dounin December 11, 2010 06:36PM

Re: считать POST реквест в буффер

magz December 11, 2010 08:33PM



Sorry, only registered users may post in this forum.

Click here to login

Online Users

Guests: 161
Record Number of Users: 8 on April 13, 2023
Record Number of Guests: 421 on December 02, 2018
Powered by nginx      Powered by FreeBSD      PHP Powered      Powered by MariaDB      ipv6 ready