nextcloud / server

☁️ Nextcloud server, a safe home for all your data
https://nextcloud.com
GNU Affero General Public License v3.0
27.31k stars 4.06k forks source link

[Bug]: FIX for WebDav MacOS failed uploads with php-fpm and big files (-36 error) #48878

Open gonzalo opened 1 week ago

gonzalo commented 1 week ago

⚠️ This issue respects the following points: ⚠️

Bug description

There are know problems with MacOS+WebDav+Apache+php-fpm https://docs.nextcloud.com/server/latest/user_manual/en/files/access_webdav.html#accessing-files-using-macos

If you use MacOS finder client to connect via WebDavto your nextcloud instance and php-fpm running, you will soon find that transfer crashes, giving you a -36 error. This comes from a problem with Content-Length sent to backend.

For dealing with this .htaccess file has this code

# Clients like xDavv5 on Android, or Cyberduck, use chunked requests.
# When FastCGI or FPM is used with apache, requests arrive to Nextcloud without any content.
# This leads to the creation of empty files.
# The following directive will force the problematic requests to be buffered before being forwarded to Nextcloud.
# This way, the "Transfer-Encoding" header is removed, the "Content-Length" header is set, and the request content is proxied to Nextcloud.
# Here are more information about the issue:
#  - https://docs.cyberduck.io/mountainduck/issues/fastcgi/
#  - https://docs.nextcloud.com/server/latest/admin_manual/issues/general_troubleshooting.html#troubleshooting-webdav
<IfModule mod_setenvif.c>
  SetEnvIf Transfer-Encoding "chunked" proxy-sendcl=1
</IfModule>

However this doesn't work with Macos Webdav Darwin client beacuse the header has a capital letter -> "Chunked" (checked by logs) So you can fix it making condition case insensitive

<IfModule mod_setenvif.c>
  SetEnvIf Transfer-Encoding "(?i)chunked" proxy-sendcl=1
</IfModule>

NOTE: apache will upload the file to their tmp folder before passing it to php. Take care of this in case you have restrictions on that folder.

Steps to reproduce

  1. Create a webdav connection with finder. The backend with apache and php-fpm
  2. Try to upload a file of a few MB (will fail)
  3. Modify the .htaccess as I mentioned
  4. Try again (will success)

Expected behavior

To be able to upload big files to nextclcoud via webdav in macos

Nextcloud Server version

28

Operating system

Debian/Ubuntu

PHP engine version

PHP 8.2

Web server

Apache (supported)

Database engine version

MariaDB

Is this bug present after an update or on a fresh install?

None

Are you using the Nextcloud Server Encryption module?

None

What user-backends are you using?

Configuration report

not relevant

List of activated Apps

not relevant

Nextcloud Signing status

not relevant

Nextcloud Logs

not relevant

Additional info

php8.2-fpm

solracsf commented 1 week ago

Cc @szaimen

szaimen commented 1 week ago

cc @artonge

joshtrichards commented 1 week ago

Makes sense. Good catch! Up to submitting as a PR? I wonder if there's any real difference between adjusting the regexp versus using SetEnvIfNoCase?

gonzalo commented 1 week ago

Interesting never heard about it but it seems exactly for that

The SetEnvIfNoCase is semantically identical to the SetEnvIf directive, and differs only in that the regular expression matching is performed in a case-insensitive manner. For example:
    SetEnvIfNoCase Host Example\.Org site=example
This will cause the site environment variable to be set to "example" if the HTTP request header field Host: was included and contained Example.Org, example.org, or any other combination.

Will try it tomorrow morning and confirm it to you. Cleaner is better!

gonzalo commented 1 week ago

Just tested on my test and prd environments SetEnvIfNoCase does the same stuff, so I suggest to use in .htaccess (currently in my vhost file, to avoid been overridden by an update).

<IfModule mod_setenvif.c>
  SetEnvIfNoCase Transfer-Encoding "chunked" proxy-sendcl=1
</IfModule>