Re: не корректная обработка POST в IE

Maxim Dounin mdounin на mdounin.ru
Пн Янв 25 15:10:37 MSK 2010


Hello!

On Mon, Jan 25, 2010 at 01:16:00PM +0300, Alexandre Kalendarev wrote:

> 
> > 
> > > Сделал все по советам Валерия Холодкова,
> > > http://forum.nginx.org/read.php?21,26678,26955#msg-26955
> > > 
> > > все отлично работает, но вот POST от IE не обрабатывается
> > > в какую сторону копать?
> 
> судя по логам в IE не вызвался body_handler
> 
> 
> // хандленр фазы
> ngx_http_memcacheset_phase_handler( ngx_http_request_t *r ){
> ngx_init_t rc=NGX_OK;
> 
> 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

А зачем вы полезли на низкий уровень?  Тем более - если не 
понимаете как оно работает?

Делать так:

...
    rc = ngx_http_read_client_request_body(r, ngx_http_your_body_hander);

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

    return NGX_DONE;
}

И всю остальную обработку - в ngx_http_your_body_handler().

> 
> //боди хандлер
> ngx_http_memcacheset_body_handler( ngx_http_request_t *r ){
> 
> ngx_int_t rc;
> 
> rc = ngx_http_memcacheset_phase_handler(r);

Вау.  Из phase позвали body, из body позвали phase, ...  Где-то 
тут надо менять логику.

> 
> if (rc >= NGX_HTTP_SPECIAL_RESPONSE) {
> ngx_http_finalize_request(r, rc);
> }
> 
> ngx_http_finalize_request(r, 0);
> 
> }
> 
> 
> // контент хандлер
> ngx_http_memcacheset_handler( ngx_http_request_t *r ){

Переходим к следующему вопросу нашей программы.  Phase handler и 
content handler - вещи вообще говоря мало совместимые, по крайней 
мере если имеется ввиду CONTENT_PHASE.  Ибо content handler (aka 
clcf->handler) - он придуман специально для того, чтобы явно 
задавать обработчик для конкретного location'а (и игнорировать 
обработчики из content phase).

В определитесь что именно вам нужно, и сделайте один обработчик с 
вызовом ngx_http_read_client_request_body() как приведено выше.

> 
> .....
> 
> 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);
> 
> //****************************
> ///// IE возвращает NGX_AGAIN
> 
> }
> 
> как это обрабатывать?

См. выше.

Maxim Dounin



Подробная информация о списке рассылки nginx-ru