Android Beta APP Could not connect to WebDAV server

edited 9 days ago
I have encountered the same issue as well. Please provide the following logs for assistance in troubleshooting:

Windows version 10.0-beta.7+982c00aaf is working properly.
The relevant server logs are captured as follows:

x.x.x.x | - | 01/Jul/2026:23:26:07 +0800 | "webdav.host" | "OPTIONS /dav/zotero/ HTTP/1.1" | 200 | 0 | "-" | "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:140.0) Gecko/20100101 Firefox/140.0 Zotero/10.0-beta.7+982c00aaf" "x.x.x.x"
x.x.x.x | - | 01/Jul/2026:23:26:07 +0800 | "webdav.host" | "PROPFIND /dav/zotero/ HTTP/1.1" | 401 | 0 | "-" | "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:140.0) Gecko/20100101 Firefox/140.0 Zotero/10.0-beta.7+982c00aaf" "x.x.x.x"
x.x.x.x | webdav_username | 01/Jul/2026:23:26:08 +0800 | "webdav.host" | "PROPFIND /dav/zotero/ HTTP/1.1" | 207 | 190 | "-" | "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:140.0) Gecko/20100101 Firefox/140.0 Firefox/140.0 Zotero/10.0-beta.7+982c00aaf" "x.x.x.x"
x.x.x.x | webdav_username | 01/Jul/2026:23:26:09 +0800 | "webdav.host" | "GET /dav/zotero/nonexistent.prop HTTP/1.1" | 404 | 9 | "-" | "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:140.0) Gecko/20100101 Firefox/140.0 Zotero/10.0-beta.7+982c00aaf" "x.x.x.x"
x.x.x.x | webdav_username | 01/Jul/2026:23:26:10 +0800 | "webdav.host" | "PUT /dav/zotero/zotero-test-file.prop HTTP/1.1" | 201 | 31 | "-" | "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:140.0) Gecko/20100101 Firefox/140.0 Zotero/10.0-beta.7+982c00aaf" "x.x.x.x"
x.x.x.x | webdav_username | 01/Jul/2026:23:26:10 +0800 | "webdav.host" | "GET /dav/zotero/zotero-test-file.prop HTTP/1.1" | 200 | 25 | "-" | "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:140.0) Gecko/20100101 Firefox/140.0 Zotero/10.0-beta.7+982c00aaf" "x.x.x.x"
x.x.x.x | webdav_username | 01/Jul/2026:23:26:11 +0800 | "webdav.host" | "DELETE /dav/zotero/zotero-test-file.prop HTTP/1.1" | 204 | 0 | "-" | "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:140.0) Gecko/20100101 Firefox/140.0 Zotero/10.0-beta.7+982c00aaf" "x.x.x.x"
The Android version of Zotero-Beta, Version 1.0.0-247 and 1.0.0-255, is not available.
The server only shows the following log entry.
There are no errors on the server backend.
But it said `Could not connect to WebDAV server` in the APP.

x.x.x.x | - | 01/Jul/2026:18:36:26 +0800 | "webdav.host" | "OPTIONS /dav/zotero/ HTTP/1.1" | 200 | 0 | "-" | "Zotero/1.0.0-247 (Android 36)" "x.x.x.x"
x.x.x.x | - | 01/Jul/2026:23:26:37 +0800 | "webdav.host" | "OPTIONS /dav/zotero/ HTTP/1.1" | 200 | 0 | "-" | "Zotero/1.0.0-255 (Android 36)" "x.x.x.x"
The log captured in Android debug mode is as follows:

(+0000001):[ERROR] WebDavController: checkServerfailed:null
(+0000001):[DEBUG] cf-ray: xxxxxxx-LAX
(+0000000):[DEBUG] server: cloudflare
(+0000000):[DEBUG] report-to:{"group":"cf-nel","max_age":604800,"endpoints":[{"ur!":"https://a.nel.cloudflare.com/report/v4?s=xxxxxxxx"}]}
(+0000000):[DEBUG] cf-cache-status: DYNAMIC
(+0000001):[DEBUG] strict-transport-security:max-age=15768000;
(+0000000):[DEBUG] set-cookie:sl-session=xxxxxxxx;SameSite=None; Secure; Path=/; Max-Age=86400;HttpOnly
(+0000000):[DEBUG] vary: Accept-Encoding
(+0000000):[DEBUG] ms-author-via: DAV
(+0000001):[DEBUG] dav:1, 2
(+0000000):[DEBUG] cache-control: private,no-cache
(+0000000):[DEBUG] allow: OPTIONS, LOCK,PUTMKCOL
(+0000000):[DEBUG] nel:{"report_to":"cf-nel","success_fraction':0.0,"max_age":604800}
(+0000001):[DEBUG] date: Wed, 01 Jul 2026 15:31:11GMT
(+0001792):[DEBUG]<-- 200 https://webdav.host/dav/zotero/(1791ms)
(+0000000):[DEBUG]--> END OPTIONS
(+0000000):[DEBUG] User-Agent: Zotero/1.0.0-255(Android36)
(+0000863):[DEBUG]-> OPTIONS https://webdav.host/dav/zotero/
(+1083566):[INFO] WebDavController: checkServer

Additionally, I found that both versions 240 and 246 were still functioning properly on May 27, 2026, at 01:14:18 +0800. No other operations were performed during that time.
  • dstillman Zotero Team
    Can you provide a Debug ID from the app for a Verify Server attempt that produces an error? We always want a Debug ID rather than raw output.
  • dstillman Zotero Team
    The Android version of Zotero-Beta, Version 1.0.0-247 and 1.0.0-255, is not available.
    I'm not sure what you mean by this.
  • dstillman Zotero Team
    edited 11 days ago
    But that looks like your WebDAV server is fronted by Cloudflare. You should test with a direct connection to your server. We absolutely can't guarantee that a Cloudflare-proxied WebDAV server would work, since Cloudflare has all sorts of complicated bot protection.
  • Okay, but I can only retrieve the version 255.
    Both of my devices are using this version right now.

    Debug ID: D722221758
  • I have tested both direct connections and localhost, and neither of them works, on Android.
  • dstillman Zotero Team
    Then we'd want to see a Debug ID for a direct connection.
  • dstillman Zotero Team
    edited 11 days ago
    In particular, this server — or at least the Cloudflare-fronted version of it — isn't advertising support for PROPFIND, which is a basic requirement for WebDAV support. The app isn't reporting the true error properly, but the server response here is broken.
  • No, It is supported.
    You can see that the PC logs I provided show that PROPFIND returns a 401 status code, but the synchronization is working fine.
    Other software also works just fine.
    I am re-deploying the environment on localhost; please wait a moment.
  • edited 9 days ago
    Without Cloudflare distribution. Debug ID: D1987271945

    This is also a PROPFIND request with the HTTP 207 that was just sent out by the PC.

    x.x.x.x | Username | 02/Jul/2026:00:32:41 +0800 | "webdav.host" | "PROPFIND /dav/zotero/ HTTP/1.1" | 207 | 35432 | "-" | "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:140.0) Gecko/20100101 Firefox/140.0 Zotero/10.0-beta.7+982c00aaf" "x.x.x.x"
  • dstillman Zotero Team
    edited 11 days ago
    server: cloudflare
    That's still Cloudflare.
  • It's just the DNS resolution that is handled by Cloudflare;
    Cloudflare is not being used for routing.
  • dstillman Zotero Team
    edited 11 days ago
    No, it's returning server: cloudflare and other Cloudflare headers. It's literally a Cloudflare server responding to the HTTP request.
  • edited 11 days ago
    The IP address I obtained using `nslookup` is the directed address of my server.
    Perhaps it will take some time to synchronize the DNS broadcasts.?
  • dstillman Zotero Team
    edited 11 days ago
    If you're going to post here, you're going to have to trust that we know what we're talking about. You provided a debug log that shows Cloudflare servers responding to the app's HTTP request. Perhaps a DNS record is still cached somewhere in the Android network stack — you'll need to figure that out. But we cannot help you until you provide debug output for a direct connection to your WebDAV server.

    Re: your edit: it would be a TTL (time-to-live) on the DNS record — there's no "broadcast" — but yes, essentially.
  • Okay, wait a moment. I'll check my network connection.
  • edited 11 days ago
    New Debug ID: D944720143
    There should be the directed address no problems now.

    You're right, it's the TTL. This is the new Debug log package.
    This time, there should be no Cloudflare relay involved. >-<
  • dstillman Zotero Team
    OK, so the server response is invalid:
    content-length: 0
    content-encoding: gzip
    An empty body can't be a valid gzip stream.

    Some clients (apparently the desktop app) could ignore that, and we can make the Android app do so, but if the server is under your control, you should try to fix that.
  • edited 11 days ago
    Yes, I have seen the backend request logs.
    However, accessing the subpaths under webdav requires authentication.
    Otherwise, it returns a null value.
    You can try to directly access the root directory of that site using A segment of routine UA .
    I have now unzipped the WAF.
  • dstillman Zotero Team
    edited 11 days ago
    Not sure what you're saying here. I explained the problem with your server above. An OPTIONS response body is empty, and the server is claiming that it's gzipped. That's a contradiction.
  • Okay, I think I understand now. I have turned off the gzip package, but it still doesn’t seem to work correctly?
  • dstillman Zotero Team
    No, still not fixed. Still returning content-encoding: gzip.
  • edited 9 days ago
    Hello, I conducted more tests regarding this issue.
    The test results show that if I use the following command:

    curl -X OPTIONS -u 'username:password' -H 'User-Agent: MyClient/1.0' 'https://your-webdav-server.com/path/' -v
    It includes the username and password, returns the following response:

    < allow: OPTIONS, DELETE, MOVE, COPY, PROPFIND, LOCK, UNLOCK, PROPPATCH>`
    However, if the `-u 'username:password'
    section is omitted, the response is:

    < allow: OPTIONS, LOCK, PUT, MKCOL>
    I believe this is the cause of the authentication failure on the Android side.
    And this seems to have nothing different with whether the gzip package is enabled or not.
  • dstillman Zotero Team
    No, the problem is what I said above.
  • edited 9 days ago
    This has nothing to do with gzip.
    I executed the following command and obtained the following output:

    └─$ curl -v --compressed -X PROPFIND -u '<EMAIL>:<PASSWORD>' -H 'User-Agent: MyClient/1.0' 'https://<WEBDAV_DOMAIN>/dav/zotero/'

    * Host <WEBDAV_DOMAIN>:443 was resolved.
    * IPv6: <IPv6>, <IPv6>
    * IPv4: <IPv4>, <IPv4>
    * Trying <IPv4>:443...
    * Trying [<IPv6>]:443...
    * Immediate connect fail for <IPv6>: Network is unreachable
    * Trying [<IPv6>]:443...
    * Immediate connect fail for <IPv6>: Network is unreachable
    * Connected to <WEBDAV_DOMAIN> (<IPv4>) port 443
    * ALPN: curl offers h2,http/1.1
    * TLSv1.3 (OUT), TLS handshake, Client hello (1):
    * CAfile: /etc/ssl/certs/ca-certificates.crt
    * CApath: /etc/ssl/certs
    * TLSv1.3 (IN), TLS handshake, Server hello (2):
    * TLSv1.2 (IN), TLS handshake, Certificate (11):
    * TLSv1.2 (IN), TLS handshake, Server key exchange (12):
    * TLSv1.2 (IN), TLS handshake, Server finished (14):
    * TLSv1.2 (OUT), TLS handshake, Client key exchange (16):
    * TLSv1.2 (OUT), TLS change cipher, Change cipher spec (1):
    * TLSv1.2 (OUT), TLS handshake, Finished (20):
    * TLSv1.2 (IN), TLS handshake, Finished (20):
    * SSL connection using TLSv1.2 / ECDHE-ECDSA-CHACHA20-POLY1305 / X25519 / id-ecPublicKey
    * ALPN: server accepted h2
    * Server certificate:
    * subject: CN=<ROOT_DOMAIN>
    * start date: May 20 23:00:43 2026 GMT
    * expire date: Aug 18 23:58:12 2026 GMT
    * subjectAltName: host "<WEBDAV_DOMAIN>" matched cert's "*<ROOT_DOMAIN>"
    * issuer: C=US; O=Google Trust Services; CN=WE1
    * SSL certificate verify ok.
    * Certificate level 0: Public key type EC/prime256v1 (256/128 Bits/secBits), signed using ecdsa-with-SHA256
    * Certificate level 1: Public key type EC/prime256v1 (256/128 Bits/secBits), signed using ecdsa-with-SHA384
    * Certificate level 2: Public key type EC/secp384r1 (384/192 Bits/secBits), signed using ecdsa-with-SHA384
    * using HTTP/2
    * Server auth using Basic with user '<EMAIL>'
    * [HTTP/2] [1] OPENED stream for https://<WEBDAV_DOMAIN>/dav/zotero/
    * [HTTP/2] [1] [:method: PROPFIND]
    * [HTTP/2] [1] [:scheme: https]
    * [HTTP/2] [1] [:authority: <WEBDAV_DOMAIN>]
    * [HTTP/2] [1] [:path: /dav/zotero/]
    * [HTTP/2] [1] [authorization: Basic <BASE64_CREDENTIALS>]
    * [HTTP/2] [1] [accept: */*]
    * [HTTP/2] [1] [accept-encoding: deflate, gzip, br, zstd]
    * [HTTP/2] [1] [user-agent: MyClient/1.0]
    > PROPFIND /dav/zotero/ HTTP/2
    > Host: <WEBDAV_DOMAIN>
    > Authorization: Basic <BASE64_CREDENTIALS>
    > Accept: */*
    > Accept-Encoding: deflate, gzip, br, zstd
    > User-Agent: MyClient/1.0
    >
    < HTTP/2 207
    < date: Fri, 03 Jul 2026 01:08:07 GMT
    < content-type: text/xml; charset=utf-8
    < nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
    < cache-control: private, no-cache
    < content-encoding: gzip
    < vary: Accept-Encoding
    < set-cookie: sl-session=<SESSION>; SameSite=None; Secure; Path=/; Max-Age=86400; HttpOnly
    < strict-transport-security: max-age=15768000;
    < cf-cache-status: DYNAMIC
    < report-to: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://<CF_REPORT_DOMAIN>/report/v4?s=..."}]}
    < server: cloudflare
    < cf-ray: <CF_RAY>
    <
    <?xml version="1.0" encoding="UTF-8"?><D:multistatus xmlns:D="DAV:"><D:response><D:href>/dav/zotero/</D:href><D:propstat><D:prop><D:quota-used-bytes><QUOTA></D:quota-used-bytes><D:resourcetype><D:collection xmlns:D="DAV:"/></D:resourcetype><D:displayname><DIR_NAME></D:displayname><D:supportedlock><D:lockentry xmlns:D="DAV:">
    ...
    ...

    The content has been desensitized.
    The file content of the server can be obtained correctly.
    Or is it that the Android version does not support gzip?
  • dstillman Zotero Team
    edited 9 days ago
    That’s not an OPTIONS request. Again, I explained the exact problem with your server above — it's falsely claiming that an empty response body is gzip-compressed. If you don’t understand what that means or can’t fix it, use a different WebDAV server. We cannot help you further here.
  • I don't understand what you're talking about.
    At first, you said it was because the server was using Cloudflare, and then you said the server didn't support PROPFIND.
    But I've already proven both of those points for you.
    As for the return length being 0 even though gzip is claimed to be used, that doesn't make sense;
    there's no data to compress in the first place, so it doesn't really matter. Or do you think the ideal content-length returned by OPTIONS shouldn't be 0?

    The comparison of my OPTIONS tests above shows that the methods obtained after authentication are completely inconsistent.
    Additionally, all the programs that use WEBDAV are working properly except for Zotero Android.

    Here is the comparison of the results for the OPTIONS request.

    curl -v --compressed -X OPTIONS -u '[USER@EMAIL.COM]:[PASSWORD]' -H 'User-Agent: MyClient/1.0' 'https://[WEBDAV_DOMAIN]/dav/[APP_DIR_1]/'

    * Host [WEBDAV_DOMAIN]:443 was resolved.
    * IPv6: [SERVER_IPv6_1], [SERVER_IPv6_2]
    * IPv4: [SERVER_IPv4_1], [SERVER_IPv4_2]
    * Trying [SERVER_IPv4_1]:443...
    * Trying [[SERVER_IPv6_1]]:443...
    * Immediate connect fail for [SERVER_IPv6_1]: Network is unreachable
    * Trying [[SERVER_IPv6_2]]:443...
    * Immediate connect fail for [SERVER_IPv6_2]: Network is unreachable
    * Connected to [WEBDAV_DOMAIN] ([SERVER_IPv4_1]) port 443
    * ALPN: curl offers h2,http/1.1
    * TLSv1.3 (OUT), TLS handshake, Client hello (1):
    * CAfile: /etc/ssl/certs/ca-certificates.crt
    * CApath: /etc/ssl/certs
    * TLSv1.3 (IN), TLS handshake, Server hello (2):
    * TLSv1.2 (IN), TLS handshake, Certificate (11):
    * TLSv1.2 (IN), TLS handshake, Server key exchange (12):
    * TLSv1.2 (IN), TLS handshake, Server finished (14):
    * TLSv1.2 (OUT), TLS handshake, Client key exchange (16):
    * TLSv1.2 (OUT), TLS change cipher, Change cipher spec (1):
    * TLSv1.2 (OUT), TLS handshake, Finished (20):
    * TLSv1.2 (IN), TLS handshake, Finished (20):
    * SSL connection using TLSv1.2 / ECDHE-ECDSA-CHACHA20-POLY1305 / X25519 / id-ecPublicKey
    * ALPN: server accepted h2
    * Server certificate:
    * subject: CN=[DOMAIN]
    * start date: May 20 23:00:43 2026 GMT
    * expire date: Aug 18 23:58:12 2026 GMT
    * subjectAltName: host "[WEBDAV_DOMAIN]" matched cert's "*.[DOMAIN]"
    * issuer: C=US; O=Google Trust Services; CN=WE1
    * SSL certificate verify ok.
    * Certificate level 0: Public key type EC/prime256v1 (256/128 Bits/secBits), signed using ecdsa-with-SHA256
    * Certificate level 1: Public key type EC/prime256v1 (256/128 Bits/secBits), signed using ecdsa-with-SHA384
    * Certificate level 2: Public key type EC/secp384r1 (384/192 Bits/secBits), signed using ecdsa-with-SHA384
    * using HTTP/2
    * Server auth using Basic with user '[USER@EMAIL.COM]'
    * [HTTP/2] [1] OPENED stream for https://[WEBDAV_DOMAIN]/dav/[APP_DIR_1]/
    * [HTTP/2] [1] [:method: OPTIONS]
    * [HTTP/2] [1] [:scheme: https]
    * [HTTP/2] [1] [:authority: [WEBDAV_DOMAIN]]
    * [HTTP/2] [1] [:path: /dav/[APP_DIR_1]/]
    * [HTTP/2] [1] [authorization: Basic [BASE64_AUTH_TOKEN]]
    * [HTTP/2] [1] [accept: */*]
    * [HTTP/2] [1] [accept-encoding: deflate, gzip, br, zstd]
    * [HTTP/2] [1] [user-agent: MyClient/1.0]
    > OPTIONS /dav/[APP_DIR_1]/ HTTP/2
    > Host: [WEBDAV_DOMAIN]
    > Authorization: Basic [BASE64_AUTH_TOKEN]
    > Accept: */*
    > Accept-Encoding: deflate, gzip, br, zstd
    > User-Agent: MyClient/1.0
    >
    < HTTP/2 200
    < date: Fri, 03 Jul 2026 09:54:22 GMT
    < content-length: 0
    < nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
    < allow: OPTIONS, DELETE, MOVE, COPY, PROPFIND, LOCK, UNLOCK, PROPPATCH
    < cache-control: private, no-cache
    < content-encoding: gzip
    < dav: 1, 2
    < ms-author-via: DAV
    < vary: Accept-Encoding
    < set-cookie: sl-session=[SESSION_TOKEN_1]; SameSite=None; Secure; Path=/; Max-Age=86400; HttpOnly
    < strict-transport-security: max-age=15768000;
    < cf-cache-status: DYNAMIC
    < report-to: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=[REPORT_TOKEN_1]"}]}
    < server: cloudflare
    < cf-ray: [CF_RAY_ID_1]
    <
    * Connection #0 to host [WEBDAV_DOMAIN] left intact

    curl -v --compressed -X OPTIONS -H 'User-Agent: MyClient/1.0' 'https://[WEBDAV_DOMAIN]/dav/[APP_DIR_1]/'

    * Host [WEBDAV_DOMAIN]:443 was resolved.
    * IPv6: [SERVER_IPv6_2], [SERVER_IPv6_1]
    * IPv4: [SERVER_IPv4_2], [SERVER_IPv4_1]
    * Trying [SERVER_IPv4_2]:443...
    * Trying [[SERVER_IPv6_2]]:443...
    * Immediate connect fail for [SERVER_IPv6_2]: Network is unreachable
    * Trying [[SERVER_IPv6_1]]:443...
    * Immediate connect fail for [SERVER_IPv6_1]: Network is unreachable
    * Connected to [WEBDAV_DOMAIN] ([SERVER_IPv4_2]) port 443
    * ALPN: curl offers h2,http/1.1
    * TLSv1.3 (OUT), TLS handshake, Client hello (1):
    * CAfile: /etc/ssl/certs/ca-certificates.crt
    * CApath: /etc/ssl/certs
    * TLSv1.3 (IN), TLS handshake, Server hello (2):
    * TLSv1.2 (IN), TLS handshake, Certificate (11):
    * TLSv1.2 (IN), TLS handshake, Server key exchange (12):
    * TLSv1.2 (IN), TLS handshake, Server finished (14):
    * TLSv1.2 (OUT), TLS handshake, Client key exchange (16):
    * TLSv1.2 (OUT), TLS change cipher, Change cipher spec (1):
    * TLSv1.2 (OUT), TLS handshake, Finished (20):
    * TLSv1.2 (IN), TLS handshake, Finished (20):
    * SSL connection using TLSv1.2 / ECDHE-ECDSA-CHACHA20-POLY1305 / X25519 / id-ecPublicKey
    * ALPN: server accepted h2
    * Server certificate:
    * subject: CN=[DOMAIN]
    * start date: May 20 23:00:43 2026 GMT
    * expire date: Aug 18 23:58:12 2026 GMT
    * subjectAltName: host "[WEBDAV_DOMAIN]" matched cert's "*.[DOMAIN]"
    * issuer: C=US; O=Google Trust Services; CN=WE1
    * SSL certificate verify ok.
    * Certificate level 0: Public key type EC/prime256v1 (256/128 Bits/secBits), signed using ecdsa-with-SHA256
    * Certificate level 1: Public key type EC/prime256v1 (256/128 Bits/secBits), signed using ecdsa-with-SHA384
    * Certificate level 2: Public key type EC/secp384r1 (384/192 Bits/secBits), signed using ecdsa-with-SHA384
    * using HTTP/2
    * [HTTP/2] [1] OPENED stream for https://[WEBDAV_DOMAIN]/dav/[APP_DIR_1]/
    * [HTTP/2] [1] [:method: OPTIONS]
    * [HTTP/2] [1] [:scheme: https]
    * [HTTP/2] [1] [:authority: [WEBDAV_DOMAIN]]
    * [HTTP/2] [1] [:path: /dav/[APP_DIR_1]/]
    * [HTTP/2] [1] [accept: */*]
    * [HTTP/2] [1] [accept-encoding: deflate, gzip, br, zstd]
    * [HTTP/2] [1] [user-agent: MyClient/1.0]
    > OPTIONS /dav/[APP_DIR_1]/ HTTP/2
    > Host: [WEBDAV_DOMAIN]
    > Accept: */*
    > Accept-Encoding: deflate, gzip, br, zstd
    > User-Agent: MyClient/1.0
    >
    < HTTP/2 200
    < date: Fri, 03 Jul 2026 09:54:37 GMT
    < content-length: 0
    < nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
    < allow: OPTIONS, LOCK, PUT, MKCOL
    < cache-control: private, no-cache
    < content-encoding: gzip
    < dav: 1, 2
    < ms-author-via: DAV
    < vary: Accept-Encoding
    < set-cookie: sl-session=[SESSION_TOKEN_2]; SameSite=None; Secure; Path=/; Max-Age=86400; HttpOnly
    < strict-transport-security: max-age=15768000;
    < cf-cache-status: DYNAMIC
    < report-to: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=[REPORT_TOKEN_2]"}]}
    < server: cloudflare
    < cf-ray: [CF_RAY_ID_2]
    <
    * Connection #0 to host [WEBDAV_DOMAIN] left intact
  • Here's a comparison of their authentication processes captured from my backend:
    It's clear that there's no issue with PROPFIND after authentication, and there are very few cases of unauthenticated OPTIONS or unauthenticated PROPFIND (this is only limited to Zotero). And the difference between Zotero PC and Android is also obvious.

    Therefore, I don't think it's a problem with the gzip package.

    # Zotero Android
    [SERVER_IP] | - | 03/Jul/2026:18:05:43 +0800 | "[WEBDAV_DOMAIN]" | "OPTIONS /dav/[APP_DIR_1]/ HTTP/1.1" | 200 | 0 | "-" | "Zotero/1.0.0-255 (Android 36)" "[CLIENT_IP_1]"

    # Zotero PC
    [SERVER_IP] | - | 03/Jul/2026:18:06:31 +0800 | "[WEBDAV_DOMAIN]" | "OPTIONS /dav/[APP_DIR_1]/ HTTP/1.1" | 200 | 0 | "-" | "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:140.0) Gecko/20100101 Firefox/140.0 Zotero/10.0-beta.8+40b272c46" "[CLIENT_IP_2]"
    [SERVER_IP] | - | 03/Jul/2026:18:06:36 +0800 | "[WEBDAV_DOMAIN]" | "PROPFIND /dav/[APP_DIR_1]/ HTTP/1.1" | 401 | 0 | "-" | "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:140.0) Gecko/20100101 Firefox/140.0 Zotero/10.0-beta.8+40b272c46" "[CLIENT_IP_2]"
    [SERVER_IP] | [USER@EMAIL.COM] | 03/Jul/2026:18:06:43 +0800 | "[WEBDAV_DOMAIN]" | "PROPFIND /dav/[APP_DIR_1]/ HTTP/1.1" | 207 | 190 | "-" | "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:140.0) Gecko/20100101 Firefox/140.0 Firefox/140.0 Zotero/10.0-beta.8+40b272c46" "[CLIENT_IP_2]"
    [SERVER_IP] | [USER@EMAIL.COM] | 03/Jul/2026:18:06:46 +0800 | "[WEBDAV_DOMAIN]" | "GET /dav/[APP_DIR_1]/[FILE_1].prop HTTP/1.1" | 404 | 9 | "-" | "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:140.0) Gecko/20100101 Firefox/140.0 Zotero/10.0-beta.8+40b272c46" "[CLIENT_IP_2]"
    [SERVER_IP] | [USER@EMAIL.COM] | 03/Jul/2026:18:06:49 +0800 | "[WEBDAV_DOMAIN]" | "PUT /dav/[APP_DIR_1]/[FILE_2].prop HTTP/1.1" | 201 | 31 | "-" | "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:140.0) Gecko/20100101 Firefox/140.0 Zotero/10.0-beta.8+40b272c46" "[CLIENT_IP_2]"
    [SERVER_IP] | [USER@EMAIL.COM] | 03/Jul/2026:18:06:49 +0800 | "[WEBDAV_DOMAIN]" | "GET /dav/[APP_DIR_1]/[FILE_2].prop HTTP/1.1" | 200 | 25 | "-" | "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:140.0) Gecko/20100101 Firefox/140.0 Zotero/10.0-beta.8+40b272c46" "[CLIENT_IP_2]"
    [SERVER_IP] | [USER@EMAIL.COM] | 03/Jul/2026:18:06:51 +0800 | "[WEBDAV_DOMAIN]" | "DELETE /dav/[APP_DIR_1]/[FILE_2].prop HTTP/1.1" | 204 | 0 | "-" | "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:140.0) Gecko/20100101 Firefox/140.0 Zotero/10.0-beta.8+40b272c46" "[CLIENT_IP_2]"

    # Some Other APP
    [SERVER_IP] | [USER@EMAIL.COM] | 03/Jul/2026:18:08:51 +0800 | "[WEBDAV_DOMAIN]" | "PROPFIND /dav/[APP_DIR_2]/ HTTP/1.1" | 207 | 1035 | "-" | "Reeden" "[CLIENT_IP_3]"

    [SERVER_IP] | [USER@EMAIL.COM] | 03/Jul/2026:18:30:46 +0800 | "[WEBDAV_DOMAIN]" | "PROPFIND [APP_DIR_2] HTTP/1.1" | 207 | 375 | "-" | "node-fetch" "[CLIENT_IP_2]"
    [SERVER_IP] | [USER@EMAIL.COM] | 03/Jul/2026:18:30:51 +0800 | "[WEBDAV_DOMAIN]" | "PUT [APP_DIR_2]/cherry-studio.20260703183042.HP-20230824.windows.zip HTTP/1.1" | 201 | 31 | "-" | "node-fetch" "[CLIENT_IP_2]"
    [SERVER_IP] | [USER@EMAIL.COM] | 03/Jul/2026:18:30:53 +0800 | "[WEBDAV_DOMAIN]" | "PROPFIND [APP_DIR_2]/ HTTP/1.1" | 207 | 500 | "-" | "node-fetch" "[CLIENT_IP_2]"
    [SERVER_IP] | [USER@EMAIL.COM] | 03/Jul/2026:18:17:24 +0800 | "[WEBDAV_DOMAIN]" | "PROPFIND /dav/[APP_DIR_4]/ HTTP/1.1" | 207 | 393 | "-" | "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/149.0.0.0 Safari/537.36 Edg/149.0.0.0" "[CLIENT_IP_3]"
    [SERVER_IP] | [USER@EMAIL.COM] | 03/Jul/2026:18:17:24 +0800 | "[WEBDAV_DOMAIN]" | "PROPFIND /dav/[APP_DIR_4]/ HTTP/1.1" | 207 | 603 | "-" | "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/149.0.0.0 Safari/537.36 Edg/149.0.0.0" "[CLIENT_IP_3]"

    [SERVER_IP] | - | 03/Jul/2026:18:18:43 +0800 | "[WEBDAV_DOMAIN]" | "PROPFIND /dav/ HTTP/1.1" | 401 | 0 | "-" | "venera/v1.6.2" "[CLIENT_IP_4]"
    [SERVER_IP] | [USER@EMAIL.COM] | 03/Jul/2026:18:18:44 +0800 | "[WEBDAV_DOMAIN]" | "PROPFIND /dav/ HTTP/1.1" | 207 | 426 | "-" | "venera/v1.6.2" "[CLIENT_IP_4]"
    [SERVER_IP] | [USER@EMAIL.COM] | 03/Jul/2026:18:18:46 +0800 | "[WEBDAV_DOMAIN]" | "DELETE /dav/[FILE_3].venera HTTP/1.1" | 204 | 0 | "-" | "venera/v1.6.2" "[CLIENT_IP_4]"
    [SERVER_IP] | [USER@EMAIL.COM] | 03/Jul/2026:18:18:48 +0800 | "[WEBDAV_DOMAIN]" | "OPTIONS /dav/[FILE_4].venera HTTP/1.1" | 200 | 0 | "-" | "venera/v1.6.2" "[CLIENT_IP_4]"
    [SERVER_IP] | [USER@EMAIL.COM] | 03/Jul/2026:18:18:51 +0800 | "[WEBDAV_DOMAIN]" | "PUT /dav/[FILE_4].venera HTTP/1.1" | 201 | 31 | "-" | "venera/v1.6.2" "[CLIENT_IP_4]"

    Yes, I have tried other WEBDAV providers, and they do work.
    However, only the Android app does not support this server.
    Isn't it a problem with the APP?

    Only on Zotero Android says "Could not connect to WebDAV server," but is it really impossible to connect?
  • edited 9 days ago
    Additional explanation:

    Although, according to the server configuration, the gzip package itself will not work for content of this size.

    But in reality, I added a new layer of Nginx in front of the webdav server and removed the

    Content-Encoding
    field in the header.

    This has really resolved the issue, and now the links are working properly.
    Thank you all for your help!
Sign In or Register to comment.