﻿id	summary	reporter	owner	description	type	status	priority	milestone	component	version	resolution	keywords	cc	uname	nginx_version
2267	Upload large files with Firefox via http2	jeffrson@…		"I use nginx (1.21.3) inside docker container (nginx:alpine) as reverse proxy. Proxied server is NodeJS Express server, upload uses multer.

For the virtual server I have http2 active:
```
listen 443 ssl http2;
listen [::]:443 ssl http2;
```

The client uploads with XMLHttpRequest. Proxying switches to Http 1.1 because I need Websockets as well.

Pages are delivered fine, small files (a few MB) will be transferred successfully with Chrome, Edge, Firefox. Larger files (some 100MB, used a file of about 900MB for final testing) however are only uploaded with Chrome or Edge (so I know that client_max_body_size a.s.o. is sufficient), *not* transferred with Firefox though.

Firefox calls the XMLHttpRequest's onerror after about 67s. But as I can see in the client's network traffic as well as in nginx debug log, there's continued data flow (client sends, nginx receives). It takes the same time, that the upload lasts on Chrome/Edge. Then nginx reports 499 error.

For Chrome as well as Firefox there are lots of such messages throughout the debug log:
2021/10/28 20:12:18 [debug] 33#33: *1 http2 read handler
2021/10/28 20:12:18 [debug] 33#33: *1 SSL_read: -1
2021/10/28 20:12:18 [debug] 33#33: *1 SSL_get_error: 2

Now, when I disable http2 in my server's conf, the 980MB file is successfully transferred with any of the three browsers. Furthermore, it takes only 2/3 of the time with active http2.

BTW, when upload is tried with Firefox (http2 enabled), nginx does not even call into the proxied server. Debug output of Express server shows nothing but loading of the actual page.

"	defect	closed	major		nginx-core		worksforme		jeffrson@…	Linux 1baf4930be32 5.10.0-8-amd64 #1 SMP Debian 5.10.46-4 (2021-08-03) x86_64 Linux	"nginx version: nginx/1.21.3
built by gcc 10.3.1 20210424 (Alpine 10.3.1_git20210424)
built with OpenSSL 1.1.1k  25 Mar 2021 (running with OpenSSL 1.1.1l  24 Aug 2021)
TLS SNI support enabled
configure arguments: --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --with-perl_modules_path=/usr/lib/perl5/vendor_perl --user=nginx --group=nginx --with-compat --with-file-aio --with-threads --with-http_addition_module --with-http_auth_request_module --with-http_dav_module --with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_mp4_module --with-http_random_index_module --with-http_realip_module --with-http_secure_link_module --with-http_slice_module --with-http_ssl_module --with-http_stub_status_module --with-http_sub_module --with-http_v2_module --with-mail --with-mail_ssl_module --with-stream --with-stream_realip_module --with-stream_ssl_module --with-stream_ssl_preread_module --with-cc-opt='-Os -fomit-frame-pointer -g' --with-ld-opt=-Wl,--as-needed,-O1,--sort-common
"
