Re: не читает тело запроса целиком (recv not ready)
Maxim Dounin
mdounin на mdounin.ru
Ср Мар 24 17:39:15 MSK 2010
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