Welcome! Log In Create A New Profile

Advanced

Re: Проблемы с получением request body

Maxim Dounin
December 01, 2014 10:16AM
Hello!

On Mon, Dec 01, 2014 at 08:35:35AM -0500, tigran.bayburtsyan wrote:

> Привет.
> Я пишу модуль для Nginx в котором будут обрабатываются POST запросы.
> Нашел несколько opensource проектов в которых тоже обрабатываются запросы
> такого типа.
> Например https://github.com/calio/form-input-nginx-module .
> Сделал этот функционал , но оно работает только на локальной среде. Если
> пробую с какого то online сервера то ответ от Nginx пустой.
>
> Как я представляю в remote сервере request_body приходит гораздо медленнее
> чем на локале и где то возврашет ответ до исполнения хандлера
> ngx_http_read_client_request_body(r,toxic_post_body_handler).
> Покапал в интернете ничего нет по этой теме. Просмотрел коды у других
> модулей вроде у меня тоже так же.
>
> Вот мой код.

[...]

> static void toxic_post_body_handler(ngx_http_request_t *r)
> {
> toxic_ctx *ctx;
>
> ctx = ngx_http_get_module_ctx(r, ngx_http_toxic_module);
> ctx->done = 1;
> #if defined(nginx_version) && nginx_version >= 8011
> r->main->count--;
> #endif
> /* waiting_more_body my rewrite phase handler */
> if (ctx->waiting_more_body) {
> ctx->waiting_more_body = 0;
> ngx_http_core_run_phases(r->main); // Думаю проблема здесь но не
> представляю что делать
> }

А зачем вы вообще всё это делаете?

Вызов toxic_post_body_handler() происходит тогда и только тогда,
когда тело получено. Ничего уменьшать или звать тут не надо -
следует обработать тело, отправить ответ, после чего
финализировать запрос с помощью ngx_http_finalize_request().

[...]

> rc =
> ngx_http_read_client_request_body(r,toxic_post_body_handler);
> if (rc == NGX_ERROR || rc >= NGX_HTTP_SPECIAL_RESPONSE) {
> return rc;
> }
>
> if (rc == NGX_AGAIN) {
> ctx->waiting_more_body = 1;
> ngx_http_set_ctx(r, ctx, ngx_http_toxic_module);
> return NGX_DONE;
> }

Это неправильно. Если вы читаете тело, то в случае любого
положительного ответа от ngx_http_read_client_request_body()
следует возвращать из обраотчика NGX_DONE. А всю работу - делать
в обработчике тела, так:

rc = ngx_http_read_client_request_body(r, handler);

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

return NGX_DONE;

--
Maxim Dounin
http://nginx.org/

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

Re: Проблемы с получением request body

Maxim Dounin December 01, 2014 10:16AM

Re: Проблемы с получением request body

tigran.bayburtsyan December 03, 2014 08:15AM

Re: Проблемы с получением request body

Maxim Dounin December 03, 2014 09:42AM



Sorry, only registered users may post in this forum.

Click here to login

Online Users

Guests: 160
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