Welcome! Log In Create A New Profile

Advanced

Re: PUT и POST module handler

rba
October 19, 2015 03:19AM
Спасибо за ваш ответ, ряд вопросов прояснились.
Но вот осуществить возврать в хэндлер при пропуске, в новой итерации воркера,
при выходе из 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);
}
Subject Author Posted

PUT и POST module handler

rba October 13, 2015 02:13AM

Re: PUT и POST module handler

rba October 14, 2015 03:34AM

Re: PUT и POST module handler

rba October 14, 2015 04:55AM

Re: PUT и POST module handler

Maxim Dounin October 14, 2015 09:00AM

Re: PUT и POST module handler

rba October 19, 2015 03:19AM

Re: PUT и POST module handler

Maxim Dounin October 19, 2015 11:14AM

Re: PUT и POST module handler

rba December 29, 2015 02:57AM



Sorry, only registered users may post in this forum.

Click here to login

Online Users

Guests: 152
Record Number of Users: 6 on February 13, 2018
Record Number of Guests: 421 on December 02, 2018
Powered by nginx      Powered by FreeBSD      PHP Powered      Powered by MariaDB      ipv6 ready