Спасибо за ваш ответ, ряд вопросов прояснились. Но вот осуществить возврать в хэндлер при пропуске, в новой итерации воркера, при выходе из 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); } Posted at Nginx Forum: https://forum.nginx.org/read.php?21,262136,262307#msg-262307 _______________________________________________ nginx-ru mailing list nginx-ru@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-ru