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