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