feat(uploads): laufenden Upload abbrechen; fix(pdf): Zoomgeste entlasten
Zoom ---- Jede Zoomstufe warf die Leinwaende weg und liess PDF.js neu malen -- eine Zusammenziehgeste hat leicht zwanzig davon, bei A4 und doppelter Pixeldichte je rund acht Megabyte. Noetig war das nie: Die Leinwand liegt mit width:100% im Seitenkasten, der Browser streckt sie also von selbst. Gezeichnet wird jetzt 120 ms nach der letzten Stufe. Die Textebene wandert korrekt mit (PDF.js setzt sie in Prozent), nur die Trefferkaesten sitzen in Pixeln -- die werden waehrend der Geste geraeumt und danach neu gemalt. Dabei ein aelterer Verlust: Jedes Oeffnen zeichnete einmal umsonst, weil der Zeichner lief, bevor die Einpassung gemessen war. Jetzt wartet er. Upload abbrechen ---------------- Das Kreuz an der Fortschrittsmeldung laesst einen laufenden Upload fallen; eine noch wartende Datei faengt gar nicht erst an. Ein Abbruch ist kein Fehler und verschwindet wie eine fertige Meldung. Auf dem Server bleibt nichts liegen -- das ist die Bauweise (Temp-Datei, Umbenennen erst am Ende), aber eine Bauweise ist keine Pruefung. Deshalb scripts/upload-abbruch-selbsttest.py: kappt eine echte Verbindung auf einem rohen Socket, 13 Pruefungen. Der teuerste Fall ist abgedeckt -- beim Ueberschreiben mit Versionierung schiebt der Server die alte Fassung kurzzeitig zur Seite; sie bleibt in Groesse, Pruefsumme und Inhalt heil. Downloads haben bewusst kein Kreuz: Sie gehen als Anker bzw. Formular an den Browser, dessen Download-Liste sie besitzt. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
1 parent
ea90f43e77
commit
511213b40d
7 files changed
+437
-18
No files matched your search
+27
@@ -175,6 +175,33 @@ Zwei Fallen, die beim Bauen auffielen und die ein Test hier abdecken muss:
|
||||
je Datei, aber ein Eintrag ohne sie ist ein Eintrag, dessen Beschädigung
|
||||
beim Herunterladen niemand bemerkt.
|
||||
|
||||
## Abgebrochener Upload
|
||||
|
||||
Am Kreuz der Fortschrittsmeldung lässt sich ein laufender Upload fallen
|
||||
lassen. Die Zusage dahinter ist die eigentliche Frage: **Auf dem Server bleibt
|
||||
dabei nichts zurück.**
|
||||
|
||||
python3 scripts/upload-abbruch-selbsttest.py
|
||||
|
||||
Der Test kappt eine echte Verbindung mitten im Leib – auf einem rohen Socket,
|
||||
nicht über eine Bibliothek. Ein sauber gesendeter, aber zu kurzer Leib wäre
|
||||
etwas anderes: Den wiese der Server als Formatfehler ab, und über den Abbruch
|
||||
bewiese das nichts.
|
||||
|
||||
13 Prüfungen: **neue Datei** (kein Eintrag, nichts im Papierkorb),
|
||||
**Überschreiben mit Versionierung** – der gefährlichste Fall, weil der Server
|
||||
die alte Fassung dabei kurzzeitig zur Seite schiebt: Sie muss danach in Größe,
|
||||
Prüfsumme und Inhalt unversehrt sein –, **Verbrauch** und ein **Rescan**, der
|
||||
nachsieht, ob herrenlose Bytes liegengeblieben sind.
|
||||
|
||||
### Eine Falle für jeden, der die Schnittstelle skriptet
|
||||
|
||||
`GET /api/v1/auth/me` **erneuert das CSRF-Token** und gibt das neue zurück.
|
||||
Wer den Wert von der Anmeldung festhält, bekommt beim nächsten schreibenden
|
||||
Ruf ein `403` und sucht die Ursache bei den Rechten. Die Weboberfläche zieht
|
||||
den neuen Wert an allen drei Stellen nach (`hooks/useAuth.ts`); ein Skript
|
||||
muss es auch.
|
||||
|
||||
## Notfall: Migration hängt fest ("Dirty database version")
|
||||
|
||||
Betrifft jede künftige Migration, nicht nur eine bestimmte. Nachgestellt und
|
||||
|
||||
Reference in new issue
Block a user