Re[4]: обработка POST & NGX_AGAIN
Alexandre Kalendarev
akalend на mail.ru
Пн Ноя 30 16:01:42 MSK 2009
Валерий,
что-то циклит,
что я сделал не так?
добавил body_phase_handler:
// хандленр фазы
ngx_http_memcacheset_phase_handler( ngx_http_request_t *r ){
ngx_init_t rc;
if(r->request_body == NULL) {
rc = ngx_http_read_client_request_body(r, ngx_http_body_handler);
#***** /// точно еще раз вызываем хандлер тела???
if (rc >= NGX_HTTP_SPECIAL_RESPONSE) {
return rc;
}
return NGX_DONE;
}
if(r->request_body->rest) {
return NGX_DONE;
}
return rc;
} // end phase handler
// контент хандлер
ngx_http_memcacheset_handler( ngx_http_request_t *r ){
....
r->request_body_in_file_only = 0;
r->request_body_in_single_buf=1;
rc = ngx_http_read_client_request_body( r, ngx_http_memcacheset_body_handler);
иногда rc=NGX_AGAIN
}
ngx_http_memcacheset_body_handler( ngx_http_request_t *r ){
ngx_int_t rc;
rc = ngx_http_memcacheset_phase_handler(r);
if (rc >= NGX_HTTP_SPECIAL_RESPONSE) {
ngx_http_finalize_request(r, rc);
}
}
-----Original Message-----
From: Valery Kholodkov <valery+nginxru at grid.net.ru>
To: nginx-ru at nginx.org
Date: Mon, 30 Nov 2009 11:06:34 +0000 (GMT)
Subject: Re: Re[2]: обработка POST & NGX_AGAIN
>
> ----- Alexandre Kalendarev <akalend at mail.ru> wrote:
> > Валерий,
> >
> > а какой выход?
> > как дождаться чтоб принять оставшуюся часть
> >
> > да, судя по логам:
> > r->request_body->buf->start=r->request_body->buf->pos =r->request_body->buf->last
>
> Зависит от хэндлера.
>
> В content-хэндлерах так:
>
> rc = ngx_http_read_client_request_body(r, <хэндлер тела>);
>
> if (rc >= NGX_HTTP_SPECIAL_RESPONSE) {
> return rc;
> }
>
> return NGX_DONE;
>
> В хэндлерах фаз так:
>
> if(r->request_body == NULL) {
> rc = ngx_http_read_client_request_body(r, <хэндлер тела>);
>
> if (rc >= NGX_HTTP_SPECIAL_RESPONSE) {
> return rc;
> }
>
> return NGX_DONE;
> }
>
> // Всё ещё принимаем тело?
> if(r->request_body->rest) {
> return NGX_DONE;
> }
>
> [.. в этом месте тело полностью принято ..]
>
> Хэндлер тела должен завершить запрос или возобновить хэндлер фазы, иначе запрос зависнет. Приблизительно так:
>
> static /* или нет static */ void
> хэндлер_тела(ngx_http_request_t *r)
> {
> ngx_int_t rc;
>
> [.. в этом месте тело полностью принято ..]
>
> rc = вызвать_хэндлер_фазы(r);
>
> if (rc >= NGX_HTTP_SPECIAL_RESPONSE) {
> ngx_http_finalize_request(r, rc);
> }
> }
>
> --
> Regards,
> Valery Kholodkov
>
> _______________________________________________
> nginx-ru mailing list
> nginx-ru at nginx.org
> http://nginx.org/mailman/listinfo/nginx-ru
>
Подробная информация о списке рассылки nginx-ru