Patch-Source: https://github.com/masterzen/nginx-upload-progress-module/pull/57
--
From 594f1233c3c622ad51a2bde0c3289747af20e245 Mon Sep 17 00:00:00 2001
From: Allan Jude <allanjude@freebsd.org>
Date: Sat, 26 Nov 2022 20:28:10 +0000
Subject: [PATCH] Restore functionality of upload-progress for HTTP2

The upload-progress module was only getting notified of the first
block of uploaded data, because r->read_event_handler was being
reset by ngx_http_v2_read_request_body() and
ngx_http_v2_process_request_body()

The patch detects that situation, updates module_ctx to call the
new function, then reinserts itself as the read_event_handler so
we continue to be notified about uploaded data.

Introduced in nginx/nginx@67d160bf25e02ba6679bb6c3b9cbdfeb29b759de

Sponsored-by:	ScaleEngine Inc.
---
 ngx_http_uploadprogress_module.c | 10 ++++++++++
 1 file changed, 10 insertions(+)

diff --git a/ngx_http_uploadprogress_module.c b/ngx_http_uploadprogress_module.c
index 33bdaf7..f17ad92 100644
--- a/ngx_http_uploadprogress_module.c
+++ b/ngx_http_uploadprogress_module.c
@@ -489,6 +489,16 @@ static void ngx_http_uploadprogress_event_handler(ngx_http_request_t *r)
     module_ctx = ngx_http_get_module_ctx(r, ngx_http_uploadprogress_module);
     if (module_ctx != NULL ) {
         module_ctx->read_event_handler(r);
+        /*
+         * Both ngx_http_v2_read_request_body() and
+         * ngx_http_v2_process_request_body() modify read_event_handler,
+         * we respect the change, but re-interpose our function so we still get
+         * future events, otherwise we miss all upload progress.
+         */
+        if (r->read_event_handler != ngx_http_uploadprogress_event_handler) {
+            module_ctx->read_event_handler = r->read_event_handler;
+            r->read_event_handler = ngx_http_uploadprogress_event_handler;
+        }
     }
 
     /* at this stage, r is not anymore safe to use */