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

Valery Kholodkov valery+nginxru на grid.net.ru
Вс Дек 12 00:48:09 MSK 2010


Проще, наверное, так:

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