Спасибо за ваш ответ, ряд вопросов прояснились.
Но вот осуществить возврать в хэндлер при пропуске, в новой итерации воркера,
при выходе из post_handler без финализации [и перемещения позиции буфера] - не получается.
(разумеется это не касается запросов влезающих в один буфер или единоразово(блокирующе) читающих цепочку)
Лог выглядет так:
[debug] 6364#0: *1 rbsample 0.0 ngx_http_rbsample_handler! //входим в ngx_http_rbsample_handler
...
[debug] 6364#0: *1 RBSAMPLE 1. put/post!!!!
...удается считать первый буфер из ngx_http_rbsample_debug
...ngx_http_rbsample_debug говорит что нужно пропустить итерацию
...выходим из воркера без финализации, без изменений позиции буфера
[debug] 6364#0: *1 rbsample 0.1 after ngx_http_rbsample_handler! 0 //выходим в ngx_http_rbsample_handler
[debug] 6364#0: *1 http finalize request: -4, "/md?" a:1, c:2
[debug] 6365#0: *4 http request count:2 blk:0
И соединение на клиенте повисает в открытом виде
Код:
static void
ngx_http_rbsample_post_handler(ngx_http_request_t *r)
{
/**********************************************************
....
cl = r->request_body->bufs; потом cl подтягивается из ctx
**********************************************************/
ngx_log_debug(NGX_LOG_DEBUG_EVENT, r->connection->log, 0, "RBSAMPLE 1. put/post!!!!");
buf = cl->buf;
len = buf->last - buf->pos;
ngx_http_rbsample_debug(r, buf->pos, len);//to debug log RBSAMPLE 2.
/**********************************************************
некоторый код, которым ngx_http_rbsample_debug умеет говорить,
что нужно подождать, сохранение cl в сtx и return;
**********************************************************/
if(!r->request_body->rest && cl->next==0) {
ngx_log_debug(NGX_LOG_DEBUG_EVENT, r->connection->log, 0, "RBSAMPLE 4. put/post finalize!!!!");
ngx_http_finalize_request(r, 0);
}
buf->pos = buf->last;
if(cl->next){
/**********************************************************
код для передвижения по буферам и сохранения позиции в ctx,
для того чтобы к ней вернуться на следующей итерации воркера
**********************************************************/
ngx_log_debug1(NGX_LOG_DEBUG_EVENT, r->connection->log, 0, "RBSAMPLE 3 CHANGE POS len: %i", len);
}
return;
}
static ngx_int_t
ngx_http_rbsample_handler(ngx_http_request_t *r)
{
ngx_int_t rc;
ngx_log_debug(NGX_LOG_DEBUG_EVENT, r->connection->log, 0, "rbsample 0.0 ngx_http_rbsample_handler!");
if(r->method == NGX_HTTP_PUT || r->method == NGX_HTTP_POST) {
rc = ngx_http_read_client_request_body(r, ngx_http_rbsample_post_handler);
if (rc >= NGX_HTTP_SPECIAL_RESPONSE) {
return rc;
}
ngx_log_debug1(NGX_LOG_DEBUG_EVENT, r->connection->log, 0, "rbsample 0.1 after ngx_http_rbsample_handler! %i", rc);
return NGX_DONE; //пробывал и NGX_AGAIN
}
return ngx_http_rbsample_other_handler(r);
}