No backups are shown on Web UI with console Errors

Randomly, an error occur that I can’t see any of my backups in the Web GUI.

The following errors are shown in the console:

Some cookies are misusing the recommended “SameSite“ attribute 119
Cookie “” has been rejected as third-party. main.js
Layout was forced before the page was fully loaded. If stylesheets are not yet loaded this may cause a flash of unstyled content. jquery.min.js:4:18306
GEThttps://duplicati.domain.com/img/progress-stop.png
[HTTP/2 404 Not Found 325ms]

GEThttps://duplicati.domain.com/img/progress-resume.png
[HTTP/2 404 Not Found 449ms]

GEThttps://duplicati.domain.com/img/pause.png
[HTTP/2 404 Not Found 572ms]

GEThttps://duplicati.domain.com/img/throttle.png
[HTTP/2 404 Not Found 582ms]

GEThttps://duplicati.domain.com/img/mainmenu/home.png
[HTTP/2 404 Not Found 451ms]

GEThttps://duplicati.domain.com/img/mainmenu/add.png
[HTTP/2 404 Not Found 575ms]

GEThttps://duplicati.domain.com/img/mainmenu/restore.png
[HTTP/2 404 Not Found 452ms]

GEThttps://duplicati.domain.com/img/mainmenu/resume.png
[HTTP/2 404 Not Found 566ms]

GEThttps://duplicati.domain.com/img/mainmenu/settings.png
[HTTP/2 404 Not Found 564ms]

GEThttps://duplicati.domain.com/img/mainmenu/about.png
[HTTP/2 404 Not Found 576ms]

GEThttps://duplicati.domain.com/img/mainmenu/logout.png
[HTTP/2 404 Not Found 578ms]

GEThttps://duplicati.domain.com/img/external-link-hover.png
[HTTP/2 404 Not Found 584ms]

GEThttps://duplicati.domain.com/img/resume.png
[HTTP/2 404 Not Found 536ms]

Error: data is null
notifyIfChanged@https://duplicati.domain.com/ngax/scripts/services/ServerStatus.js?v=2.0.6.1:189:13
longpoll/<@https://duplicati.domain.com/ngax/scripts/services/ServerStatus.js?v=2.0.6.1:214:36
f/<@https://duplicati.domain.com/ngax/scripts/angular/angular.min.js:120:182
$eval@https://duplicati.domain.com/ngax/scripts/angular/angular.min.js:134:493
$digest@https://duplicati.domain.com/ngax/scripts/angular/angular.min.js:132:9
$apply@https://duplicati.domain.com/ngax/scripts/angular/angular.min.js:135:269
l@https://duplicati.domain.com/ngax/scripts/angular/angular.min.js:87:152
F@https://duplicati.domain.com/ngax/scripts/angular/angular.min.js:91:188
Sf/</K.onload@https://duplicati.domain.com/ngax/scripts/angular/angular.min.js:92:221
EventHandlerNonNull*Sf/<@https://duplicati.domain.com/ngax/scripts/angular/angular.min.js:92:57
n@https://duplicati.domain.com/ngax/scripts/angular/angular.min.js:88:367
k/f<@https://duplicati.domain.com/ngax/scripts/angular/angular.min.js:86:69
f/<@https://duplicati.domain.com/ngax/scripts/angular/angular.min.js:120:182
$eval@https://duplicati.domain.com/ngax/scripts/angular/angular.min.js:134:493
$digest@https://duplicati.domain.com/ngax/scripts/angular/angular.min.js:132:9
$apply@https://duplicati.domain.com/ngax/scripts/angular/angular.min.js:135:269
d/<@https://duplicati.domain.com/ngax/scripts/angular/angular.min.js:19:437
e@https://duplicati.domain.com/ngax/scripts/angular/angular.min.js:39:156
d@https://duplicati.domain.com/ngax/scripts/angular/angular.min.js:19:358
Ac@https://duplicati.domain.com/ngax/scripts/angular/angular.min.js:20:151
Zd@https://duplicati.domain.com/ngax/scripts/angular/angular.min.js:18:464
@https://duplicati.domain.com/ngax/scripts/angular/angular.min.js:289:430
j@https://duplicati.domain.com/ngax/scripts/libs/jquery.min.js:2:26925
fireWith@https://duplicati.domain.com/ngax/scripts/libs/jquery.min.js:2:27738
ready@https://duplicati.domain.com/ngax/scripts/libs/jquery.min.js:2:29532
I@https://duplicati.domain.com/ngax/scripts/libs/jquery.min.js:2:29723
EventListener.handleEvent*n.ready.promise@https://duplicati.domain.com/ngax/scripts/libs/jquery.min.js:2:29834
@https://duplicati.domain.com/ngax/scripts/libs/jquery.min.js:2:29932
@https://duplicati.domain.com/ngax/scripts/libs/jquery.min.js:2:207
@https://duplicati.domain.com/ngax/scripts/libs/jquery.min.js:2:212
angular.js:12330:17
    Angular 22
    jQuery 8
Error: data.data is null
reload/<@https://duplicati.domain.com/ngax/scripts/services/BackupList.js?v=2.0.6.1:45:29
f/<@https://duplicati.domain.com/ngax/scripts/angular/angular.min.js:120:182
$eval@https://duplicati.domain.com/ngax/scripts/angular/angular.min.js:134:493
$digest@https://duplicati.domain.com/ngax/scripts/angular/angular.min.js:132:9
$apply@https://duplicati.domain.com/ngax/scripts/angular/angular.min.js:135:269
l@https://duplicati.domain.com/ngax/scripts/angular/angular.min.js:87:152
F@https://duplicati.domain.com/ngax/scripts/angular/angular.min.js:91:188
Sf/</K.onload@https://duplicati.domain.com/ngax/scripts/angular/angular.min.js:92:221
EventHandlerNonNull*Sf/<@https://duplicati.domain.com/ngax/scripts/angular/angular.min.js:92:57
n@https://duplicati.domain.com/ngax/scripts/angular/angular.min.js:88:367
k/f<@https://duplicati.domain.com/ngax/scripts/angular/angular.min.js:86:69
f/<@https://duplicati.domain.com/ngax/scripts/angular/angular.min.js:120:182
$eval@https://duplicati.domain.com/ngax/scripts/angular/angular.min.js:134:493
$digest@https://duplicati.domain.com/ngax/scripts/angular/angular.min.js:132:9
$apply@https://duplicati.domain.com/ngax/scripts/angular/angular.min.js:135:269
d/<@https://duplicati.domain.com/ngax/scripts/angular/angular.min.js:19:437
e@https://duplicati.domain.com/ngax/scripts/angular/angular.min.js:39:156
d@https://duplicati.domain.com/ngax/scripts/angular/angular.min.js:19:358
Ac@https://duplicati.domain.com/ngax/scripts/angular/angular.min.js:20:151
Zd@https://duplicati.domain.com/ngax/scripts/angular/angular.min.js:18:464
@https://duplicati.domain.com/ngax/scripts/angular/angular.min.js:289:430
j@https://duplicati.domain.com/ngax/scripts/libs/jquery.min.js:2:26925
fireWith@https://duplicati.domain.com/ngax/scripts/libs/jquery.min.js:2:27738
ready@https://duplicati.domain.com/ngax/scripts/libs/jquery.min.js:2:29532
I@https://duplicati.domain.com/ngax/scripts/libs/jquery.min.js:2:29723
EventListener.handleEvent*n.ready.promise@https://duplicati.domain.com/ngax/scripts/libs/jquery.min.js:2:29834
@https://duplicati.domain.com/ngax/scripts/libs/jquery.min.js:2:29932
@https://duplicati.domain.com/ngax/scripts/libs/jquery.min.js:2:207
@https://duplicati.domain.com/ngax/scripts/libs/jquery.min.js:2:212
angular.js:12330:17
    Angular 22
    jQuery 8
Error: state.BrowserLocale is undefined
loadSystemInfo/<@https://duplicati.domain.com/ngax/scripts/services/SystemInfo.js?v=2.0.6.1:125:21
f/<@https://duplicati.domain.com/ngax/scripts/angular/angular.min.js:120:182
$eval@https://duplicati.domain.com/ngax/scripts/angular/angular.min.js:134:493
$digest@https://duplicati.domain.com/ngax/scripts/angular/angular.min.js:132:9
$apply@https://duplicati.domain.com/ngax/scripts/angular/angular.min.js:135:269
l@https://duplicati.domain.com/ngax/scripts/angular/angular.min.js:87:152
F@https://duplicati.domain.com/ngax/scripts/angular/angular.min.js:91:188
Sf/</K.onload@https://duplicati.domain.com/ngax/scripts/angular/angular.min.js:92:221
EventHandlerNonNull*Sf/<@https://duplicati.domain.com/ngax/scripts/angular/angular.min.js:92:57
n@https://duplicati.domain.com/ngax/scripts/angular/angular.min.js:88:367
k/f<@https://duplicati.domain.com/ngax/scripts/angular/angular.min.js:86:69
f/<@https://duplicati.domain.com/ngax/scripts/angular/angular.min.js:120:182
$eval@https://duplicati.domain.com/ngax/scripts/angular/angular.min.js:134:493
$digest@https://duplicati.domain.com/ngax/scripts/angular/angular.min.js:132:9
$apply@https://duplicati.domain.com/ngax/scripts/angular/angular.min.js:135:269
d/<@https://duplicati.domain.com/ngax/scripts/angular/angular.min.js:19:437
e@https://duplicati.domain.com/ngax/scripts/angular/angular.min.js:39:156
d@https://duplicati.domain.com/ngax/scripts/angular/angular.min.js:19:358
Ac@https://duplicati.domain.com/ngax/scripts/angular/angular.min.js:20:151
Zd@https://duplicati.domain.com/ngax/scripts/angular/angular.min.js:18:464
@https://duplicati.domain.com/ngax/scripts/angular/angular.min.js:289:430
j@https://duplicati.domain.com/ngax/scripts/libs/jquery.min.js:2:26925
fireWith@https://duplicati.domain.com/ngax/scripts/libs/jquery.min.js:2:27738
ready@https://duplicati.domain.com/ngax/scripts/libs/jquery.min.js:2:29532
I@https://duplicati.domain.com/ngax/scripts/libs/jquery.min.js:2:29723
EventListener.handleEvent*n.ready.promise@https://duplicati.domain.com/ngax/scripts/libs/jquery.min.js:2:29834
@https://duplicati.domain.com/ngax/scripts/libs/jquery.min.js:2:29932
@https://duplicati.domain.com/ngax/scripts/libs/jquery.min.js:2:207
@https://duplicati.domain.com/ngax/scripts/libs/jquery.min.js:2:212
angular.js:12330:17
Error: data.data is null
@https://duplicati.domain.com/ngax/scripts/controllers/AppController.js?v=2.0.6.1:162:9
f/<@https://duplicati.domain.com/ngax/scripts/angular/angular.min.js:120:182
$eval@https://duplicati.domain.com/ngax/scripts/angular/angular.min.js:134:493
$digest@https://duplicati.domain.com/ngax/scripts/angular/angular.min.js:132:9
$apply@https://duplicati.domain.com/ngax/scripts/angular/angular.min.js:135:269
l@https://duplicati.domain.com/ngax/scripts/angular/angular.min.js:87:152
F@https://duplicati.domain.com/ngax/scripts/angular/angular.min.js:91:188
Sf/</K.onload@https://duplicati.domain.com/ngax/scripts/angular/angular.min.js:92:221
EventHandlerNonNull*Sf/<@https://duplicati.domain.com/ngax/scripts/angular/angular.min.js:92:57
n@https://duplicati.domain.com/ngax/scripts/angular/angular.min.js:88:367
k/f<@https://duplicati.domain.com/ngax/scripts/angular/angular.min.js:86:69
f/<@https://duplicati.domain.com/ngax/scripts/angular/angular.min.js:120:182
$eval@https://duplicati.domain.com/ngax/scripts/angular/angular.min.js:134:493
$digest@https://duplicati.domain.com/ngax/scripts/angular/angular.min.js:132:9
$apply@https://duplicati.domain.com/ngax/scripts/angular/angular.min.js:135:269
d/<@https://duplicati.domain.com/ngax/scripts/angular/angular.min.js:19:437
e@https://duplicati.domain.com/ngax/scripts/angular/angular.min.js:39:156
d@https://duplicati.domain.com/ngax/scripts/angular/angular.min.js:19:358
Ac@https://duplicati.domain.com/ngax/scripts/angular/angular.min.js:20:151
Zd@https://duplicati.domain.com/ngax/scripts/angular/angular.min.js:18:464
@https://duplicati.domain.com/ngax/scripts/angular/angular.min.js:289:430
j@https://duplicati.domain.com/ngax/scripts/libs/jquery.min.js:2:26925
fireWith@https://duplicati.domain.com/ngax/scripts/libs/jquery.min.js:2:27738
ready@https://duplicati.domain.com/ngax/scripts/libs/jquery.min.js:2:29532
I@https://duplicati.domain.com/ngax/scripts/libs/jquery.min.js:2:29723
EventListener.handleEvent*n.ready.promise@https://duplicati.domain.com/ngax/scripts/libs/jquery.min.js:2:29834
@https://duplicati.domain.com/ngax/scripts/libs/jquery.min.js:2:29932
@https://duplicati.domain.com/ngax/scripts/libs/jquery.min.js:2:207
@https://duplicati.domain.com/ngax/scripts/libs/jquery.min.js:2:212
angular.js:12330:17
Error: resp.data is null
this.LoadMoreData/</<@https://duplicati.domain.com/ngax/scripts/services/LogService.js?v=2.0.6.1:24:49
f/<@https://duplicati.domain.com/ngax/scripts/angular/angular.min.js:120:182
$eval@https://duplicati.domain.com/ngax/scripts/angular/angular.min.js:134:493
$digest@https://duplicati.domain.com/ngax/scripts/angular/angular.min.js:132:9
$apply@https://duplicati.domain.com/ngax/scripts/angular/angular.min.js:135:269
l@https://duplicati.domain.com/ngax/scripts/angular/angular.min.js:87:152
F@https://duplicati.domain.com/ngax/scripts/angular/angular.min.js:91:188
Sf/</K.onload@https://duplicati.domain.com/ngax/scripts/angular/angular.min.js:92:221
EventHandlerNonNull*Sf/<@https://duplicati.domain.com/ngax/scripts/angular/angular.min.js:92:57
n@https://duplicati.domain.com/ngax/scripts/angular/angular.min.js:88:367
k/f<@https://duplicati.domain.com/ngax/scripts/angular/angular.min.js:86:69
f/<@https://duplicati.domain.com/ngax/scripts/angular/angular.min.js:120:182
$eval@https://duplicati.domain.com/ngax/scripts/angular/angular.min.js:134:493
$digest@https://duplicati.domain.com/ngax/scripts/angular/angular.min.js:132:9
$apply@https://duplicati.domain.com/ngax/scripts/angular/angular.min.js:135:269
l@https://duplicati.domain.com/ngax/scripts/angular/angular.min.js:87:152
F@https://duplicati.domain.com/ngax/scripts/angular/angular.min.js:91:188
Sf/</K.onload@https://duplicati.domain.com/ngax/scripts/angular/angular.min.js:92:221
EventHandlerNonNull*Sf/<@https://duplicati.domain.com/ngax/scripts/angular/angular.min.js:92:57
n@https://duplicati.domain.com/ngax/scripts/angular/angular.min.js:88:367
k/f<@https://duplicati.domain.com/ngax/scripts/angular/angular.min.js:86:69
f/<@https://duplicati.domain.com/ngax/scripts/angular/angular.min.js:120:182
$eval@https://duplicati.domain.com/ngax/scripts/angular/angular.min.js:134:493
$digest@https://duplicati.domain.com/ngax/scripts/angular/angular.min.js:132:9
$apply@https://duplicati.domain.com/ngax/scripts/angular/angular.min.js:135:269
d/<@https://duplicati.domain.com/ngax/scripts/angular/angular.min.js:19:437
e@https://duplicati.domain.com/ngax/scripts/angular/angular.min.js:39:156
d@https://duplicati.domain.com/ngax/scripts/angular/angular.min.js:19:358
Ac@https://duplicati.domain.com/ngax/scripts/angular/angular.min.js:20:151
Zd@https://duplicati.domain.com/ngax/scripts/angular/angular.min.js:18:464
@https://duplicati.domain.com/ngax/scripts/angular/angular.min.js:289:430
j@https://duplicati.domain.com/ngax/scripts/libs/jquery.min.js:2:26925
fireWith@https://duplicati.domain.com/ngax/scripts/libs/jquery.min.js:2:27738
ready@https://duplicati.domain.com/ngax/scripts/libs/jquery.min.js:2:29532
I@https://duplicati.domain.com/ngax/scripts/libs/jquery.min.js:2:29723
EventListener.handleEvent*n.ready.promise@https://duplicati.domain.com/ngax/scripts/libs/jquery.min.js:2:29834
@https://duplicati.domain.com/ngax/scripts/libs/jquery.min.js:2:29932
@https://duplicati.domain.com/ngax/scripts/libs/jquery.min.js:2:207
@https://duplicati.domain.com/ngax/scripts/libs/jquery.min.js:2:212
angular.js:12330:17
    Angular 32
    jQuery 8

Duplicati is running on Docker in Ubuntu 18.04 bionic, behind Reverse Proxy (Traefik)

Which releases has this been seen on? 2.0.6.1 is pretty new, but has some similar reports.
It’d be nice in a way to know that it’s also in 2.0.5.1, but it’d be nice to understand the cause.
I haven’t been able to talk people into using web developer tools to look, so thank you, but…

adds another possible problem point. Do you ever go in directly? Does it work more reliably?

EDIT:

I’m not seeing such errors in a Firefox console. I’m not familiar with the URL layout, but yours
which are shown as 404 error fail for me – but work OK if I put ngax in front of img in my URL.
I was using F12 web developer tools to view Network, to see what URLs normally get issued.

I’m not familiar with reverse proxy, but isn’t URL rewrites part of it? Where did those ngax go?
There are some reverse proxy examples in the forum and Issues, but I think most used nginx.

Thanks for the answer @ts678! Helping me again :slight_smile:
Unfortunately, my home server died (Thankfully, Duplicati was running and creating all the backups :sunglasses: ). I’m in process to change it and will return with the result of the suggested changes soon.

The main problem here aren’t the images, but the undefined properties traced by the angular framework.

Regarding the Reverse Proxy, mine doesn’t rewrite anything. It just read the requested subdomain and redirect to the correct service. The path stay intact.

I can share the docker-compose with the reverse proxy config:

version: "3.8"
services:
  wireguard:
    image: ghcr.io/linuxserver/wireguard
    cap_add:
      - NET_ADMIN
      - SYS_MODULE
    environment:
      TZ: Europe/Berlin
    volumes:
      - ./.docker/wireguard/config:/config
      - /lib/modules:/lib/modules:ro
    sysctls:
      net.ipv4.conf.all.src_valid_mark: 1
    extra_hosts:
      - host.docker.internal:172.177.0.1
    restart: unless-stopped

  duplicati:
    image: duplicati/duplicati
    volumes:
      - ./.docker/duplicati/data:/data
      - /home/domain:/home:ro
    labels:
      traefik.enable: true
      traefik.http.routers.duplicati.rule: Host(`duplicati.domain.com`)
      traefik.http.routers.duplicati.tls.certresolver: letsencrypt
      traefik.http.services.duplicati.loadbalancer.server.port: 8200
    restart: unless-stopped

  traefik:
    image: traefik
    command:
      - --api.dashboard
      - --certificatesresolvers.letsencrypt.acme.email=acme@domain.com
      - --certificatesresolvers.letsencrypt.acme.tlschallenge
      - --certificatesresolvers.letsencrypt.acme.storage=/letsencrypt/acme.json
      - --entrypoints.web.address=:80
      - --entrypoints.web.http.redirections.entryPoint.to=websecure
      - --entryPoints.web.proxyProtocol.trustedIPs=10.0.0.1/32
      - --entrypoints.websecure.address=:443
      - --entryPoints.websecure.proxyProtocol.trustedIPs=10.0.0.1/32
      - --providers.docker
      - --providers.docker.exposedbydefault=false
      - --tracing
    network_mode: service:wireguard
    depends_on:
      - duplicati
    volumes:
      - /run/docker.sock:/var/run/docker.sock:ro
      - ./.docker/traefik/letsencrypt:/letsencrypt
    labels:
      traefik.enable: true
      traefik.http.routers.traefik.rule: Host(`traefik.domain.com`)
      traefik.http.routers.traefik.service: api@internal
      traefik.http.routers.traefik.tls.certresolver: letsencrypt
      traefik.http.services.traefik.loadbalancer.server.port: 8080
    restart: unless-stopped

networks:
  default:
    ipam:
      config:
        - subnet: 172.177.0.0/16

Sorry about your server. Glad you had backups. I use neither Docker nor proxy, but someone else might.
I’m also not a web developer, but I do worry that a couple of people are not seeing the backup jobs listed.

Finally, I can answer you! After some time, now I could finally get everything working. But still having the same issues with Duplicati. Now I’m running the latest docker version (20.10.6, build 370c289) with Ubuntu 21.04.

Currently, I’m running 2.0.6.1_beta_2021-05-03. But I have the same results with 2.0.5.114_canary_2021-03-10 and 2.0.6.2_experimental_2021-05-29.

Fun thing:
It works when I access it directly. And when I access it via Proxy after the first direct access, it also works.
Never had seen it before :sweat_smile:
The console errors are still shown. But maybe they aren’t related to the problem, since I also see them on direct access.

These are the same code except for two bug fixes. So no history one way or the other on older code.

It’s good that it works directly. I don’t have a reverse proxy, so all I can suggest is tools like web brower provides for web developers (and I am not one, but if it were me, I’d try looking over traffic differences). Avoding caching differences might be possible with hard refresh (often a Control-F5, but it could vary).

Not sure if its the same here but while diagnosing the backups on Linux issue I’m looking into, I noticed the .desktop file and the systemd duplicati.server produces what I will call two Duplicati instances so that the backups are different in one vs the other (either empty or not the same in some way) and the port is also different because it increments the port on the second (eg being .desktop) just from starting from .desktop.

It could be possible that it happens in other situations. I removed the .desktop file to avoid this and only start Duplicati from the browser instead if I want to access the UI. But some clarification here might help see if its the same or not. The port used for Duplicati seems to be a clear indication and should be viewable from the browser URL bar.

I think we misunderstood. On a later post I said that it’s intermittent. The case that I mentioned on the post you answer was some funny coincidence, but it doesn’t mean that it’s everytime like that.
For example, right now I’m accessing it directly and don’t see any backup. So I can confirm that it isn’t the reverse proxy which is causing it.

(To avoid any cache, I even opened it on a private window)

Sorry, but I couldn’t follow your post :sweat_smile:
Should I do some tests on my docker image? Should I change my exposed ports?

What browser is this? I’m not a web developer (if any are out there, please help with debug suggestions), however Microsoft Edge and Chrome both use F12 to bring up web developer tools. My home page does:

The systeminfo response looks like what the About → System info page shows. Is yours working right?
The backups response looks like the list of backups, which seems like what you lack. Is response there?

I’m not getting Console errors, and note that I’m getting mostly 200 Status (except for a pending longpoll).
This particular screenshot is a normal refresh, but if you haven’t already done so, test a hard refresh too.
Note that I’m showing only XHR. If I was showing All there would be lots more before what I’m seeking…

If you run Firefox, there’s a similar facility.

EDIT 1:

To look at a line more closely, click it, then click on what you want, e.g. Response shows what came back.

EDIT 2:

I’m not certain there’s any harm in keeping a running trace to try to catch a random failure in action, but it might eventually raise browser resource use, unless it’s capped somehow. Might be worth a careful try…

Also be sure that you don’t have multiple Duplicati running, which I think was the concern @Xavron had.
I’ve even seen two Duplicati somehow get the same port 8200 (shouldn’t normally happen). You can test:

sudo netstat -anp | grep -w 8200

and make sure only one Duplicati has a LISTEN up.

1 Like

Well, I’m a developer but haven’t gone deep in the code to try to catch the point where it fails. Will do it later when I have the time for it.
For now, I’m trying to help with providing the data.

  1. There are no XHR requests for systeminfo and backups.


  2. The About → System Info page is just showing the template, no real data is loaded.

As I’m running in docker, only the docker proxy is caring for the open port. Which should resolve to the docker container.

$ sudo netstat -anp | grep -w 8200
tcp        0      0 0.0.0.0:8200            0.0.0.0:*               LISTEN      617452/docker-proxy 
tcp6       0      0 :::8200                 :::*                    LISTEN      617459/docker-proxy

How do you see that? I see the requests in the screenshots, and 200 responses, but very little data return.

I’m not expert in interpreting the Firefox Transferred and Size columns (I could possibly research some) but Wireshark for port 8200 showed the following for my (working) systeminfo request to the web server:

HTTP/1.1 200 OK
Cache-Control: no-cache, no-store, must-revalidate, max-age=0
Content-Language: en
Date: Sat, 12 Jun 2021 19:39:46 GMT
Content-Length: 232468
Content-Type: application/json
Server: Tiny WebServer
Keep-Alive: timeout=20, max=400
Connection: Keep-Alive
Set-Cookie: xsrf-token=7IRxDe7Q%2BuZ478%2FEHTh%2Bpvk9WXHOS0P%2FA6grHKfL2c8%3D; expires=Sat, 12 Jun 2021 19:49:43 GMT;path=/; 

...{
  "APIVersion": 1,
  "PasswordPlaceholder": "**********",
  "ServerVersion": "2.0.5.114",
  "ServerVersionName": " - 2.0.5.114_canary_2021-03-10",
  "ServerVersionType": "Canary",
  "StartedBy": "Tray icon",
  "BaseVersionName": "2.0.5.114_canary_2021-03-10",
  "DefaultUpdateChannel": "Canary",
  "DefaultUsageReportLevel": "Information",
  "ServerTime": "2021-06-12T15:39:43.5933516-04:00",
  "OSType": "Windows",
  "DirectorySeparator": "\\",
  "PathSeparator": ";",
  "CaseSensitiveFilesystem": false,
  "MonoVersion": null,
  "MachineName": "HP4",
  "UserName": "Maintenance",
  "NewLine": "\r\n",
  "CLRVersion": "4.0.30319.42000",
  "CLROSInfo": {
    "Platform": "Win32NT",
    "ServicePack": "",
    "Version": "10.0.19042.0",
    "VersionString": "Microsoft Windows NT 10.0.19042.0"
  },
  "Options": [
... and much more

I was thinking that a web server would need to know the content length in advance before it could report it.
This seems to be what the code has. Is the implication that Duplicati gave content but server didn’t send?