Спасибо за разъяснения. Перепроверил, действительно только хэндлеры и внутренние функции в модулях возвращают NGX_DONE. С другой стороны ngx_output_chain ожидает что ctx->output_filter может вернуть NGX_DONE. И это весьма дизориентируетby eustas - Nginx Mailing List - Russian
1) common sense - иначе вышестоящий фильтр не узнает закончилась ли отправка 2) common practice - https://github.com/nginx/nginx/blob/master/src/http/modules/ngx_http_gzip_filter_module.c#L621 и ещё 10 модулей возвращают NGX_DONE 3) документация - "NGX_DONE — Operation complete or continued elsewhere. Alsoby eustas - Nginx Mailing List - Russian
TL;DR: Похоже что в изменении https://forum.nginx.org/read.php?29,276778,276778 не учтено, что ngx_http_upstream_cache_send может вернуть NGX_DONE не только как результат ngx_http_upstream_process_headers, но и как результат ngx_http_cache_send. В результате соединение висит открытым.by eustas - Nginx Mailing List - Russian
Hello. I'm working on a zero-copy brotli compression filter. With zero-copy I wrap compressor output into a buffer and send it to next filter in a chain. The problem is - it is not clear how to properly wait until this buffer is released. If I just continue asking the next filter to do its work, until buffer is released, it is possible to get into infinite loop (see https://github.com/by eustas - Nginx Mailing List - English