ПРОЕКТЫ 


  АРХИВ 


Apache-Talk @lexa.ru 

Inet-Admins @info.east.ru 

Filmscanners @halftone.co.uk 

Security-alerts @yandex-team.ru 

nginx-ru @sysoev.ru 


  СТАТЬИ 


  ПЕРСОНАЛЬНОЕ 


  ПРОГРАММЫ 



ПИШИТЕ
ПИСЬМА












     АРХИВ :: nginx-ru
Nginx-ru mailing list archive (nginx-ru@sysoev.ru)

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

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


  • To: nginx-ru@xxxxxxxxx
  • Subject: считать POST реквест в буффе р
  • From: "magz" <nginx-forum@xxxxxxxx>
  • Date: Sat, 11 Dec 2010 11:41:16 -0500
  • Dkim-signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=mickey.jlkhosting.com; s=x; h=Sender:From:Message-ID:Content-Transfer-Encoding:Content-Type:Subject:To:Date; bh=O+KKmpnHjTZyPdVS3X2ZhlcYub3lNQd9AKldHyUMtFk=; b=tuBO8BisCnwlFEqSdRmw4fPnKWjJehAFfai4Jx2DvnBod6u9soKofYsM18/Q1ylGKCAJtA8NrwYMdeOJvOlVBXrrAm6LjBMb+lkA4qNWb3kKb5X1lTJZobBQF8E//d9Z;

Здравствуйте,

подскажите пожалуйскта как правильно
считать пост реквест в буффер.
Я нашел модуль 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?

Или может есть где-нибудь красивый
пример где можно полностью прочитать
запрос от браузера?

Спасибо,
Максим.

Posted at Nginx Forum: 
http://forum.nginx.org/read.php?21,157784,157784#msg-157784


_______________________________________________
nginx-ru mailing list
nginx-ru@xxxxxxxxx
http://nginx.org/mailman/listinfo/nginx-ru


 




Copyright © Lexa Software, 1996-2009.