Re: PUT и POST module handler

rba nginx-forum на nginx.us
Пн Окт 19 07:19:48 UTC 2015


Спасибо за ваш ответ, ряд вопросов прояснились.
Но вот осуществить возврать в хэндлер при пропуске, в новой итерации
воркера,
при выходе из 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