ПРОЕКТЫ 


  АРХИВ 


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: не читает тело запроса ц еликом (recv not ready)



Hello!

On Wed, Mar 24, 2010 at 09:57:33AM -0400, ak wrote:

> Задача:
> написать простейший модуль, который перехватывает сообщение из тела POST 
> запроса и отправляет в другую систему.

[...]

> static ngx_int_t ngx_http_qpidapi_handler(ngx_http_request_t *r) {
> ...//переменные
> 
>       ngx_log_error(NGX_LOG_ERR,r->connection->log,NGX_EISDIR,"run 
> handler!!!");
>       rc = ngx_http_read_client_request_body(r, 
> ngx_http_qpidapi_body_handler);
>       if(rc==NGX_AGAIN) {
>               
> ngx_log_error(NGX_LOG_ERR,r->connection->log,NGX_EISDIR,"NGX_AGAIN!!!");
>               return NGX_AGAIN;
>       }

Кто вам сказал что NGX_AGAIN надо как-то обрабатывать?

>       ngx_log_error(NGX_LOG_ERR,r->connection->log,NGX_EISDIR,"after 
> handler!!!");
> 
>       if (rc >= NGX_HTTP_SPECIAL_RESPONSE) {
>               return rc;
>       }
>       
>       //set status SUCCESS
> ...
> }

Вот тут не должно быть никаких "set SUCCESS" и многоточий.  
Смотрите в ngx_http_proxy_module.c, там простой и понятный пример 
как работать с чтением body.

Код должен быть примерно такой:

static ngx_int_t
ngx_http_your_content_handler(ngx_http_request_t *r)
{
    ...

    rc = ngx_http_read_client_request_body(r, ngx_http_your_body_handler);

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

    return NGX_DONE;
}

Когда будет прочитано тело запроса - nginx вызовет 
ngx_http_your_body_handler, именно в нём следует продолжать всю 
дальнейшую работу.

[...]

> Иногда данный тело данного запроса успешно считывается, иногда 
> возникают ошибки. Объясните что неправильно сделал, или что 
> может так влиять на работу модуля?

Если повезло и тело прочиталось сразу - оно у вас "спешно 
считывается", если сразу не прочиталось - видимо и возникает 
ошибка.

> Знаю, что запрос неправилен с точки зрения ХТТП - нехотелось 
> возиться с boundary. может ли это повлиять на работу?

Нет. Протокол HTTP никак не регламентирует содержимое передаваемых 
сообщений, главное чтобы длина сообщения была правильно указана.

[...]

Maxim DOunin

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


 




Copyright © Lexa Software, 1996-2009.