ПРОЕКТЫ 


  АРХИВ 


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]

Re[4]: обработка POST & NGX_AGAIN



Валерий,

что-то циклит,
что я сделал не так?

добавил 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@xxxxxxxxxxx>
To: nginx-ru@xxxxxxxxx
Date: Mon, 30 Nov 2009 11:06:34 +0000 (GMT)
Subject: Re: Re[2]: обработка POST & NGX_AGAIN

> 
> ----- Alexandre Kalendarev <akalend@xxxxxxx> 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@xxxxxxxxx
> http://nginx.org/mailman/listinfo/nginx-ru
> 

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


 




Copyright © Lexa Software, 1996-2009.