docs: record the measured CalDAV write path and the T2 decisions

This commit is contained in:
Pierre Martin
2026-08-13 16:50:16 +02:00
parent 69c10abbd7
commit c6b0e7799a
2 changed files with 86 additions and 0 deletions
+27
View File
@@ -31,6 +31,33 @@ Document de référence pour l'implémentation. Toutes les valeurs ci-dessous so
> être enregistrés (`ICAL.TimezoneService.register`) **avant** `toJSDate()`,
> sinon l'offset est faux pour les TZID non standards (ex. `Africa/Lagos`).
### Écriture CalDAV — **mesuré le 2026-08-13** (spike navigateur, T2)
Mesures faites depuis la console de la page d'extension, session Nextcloud
ouverte. La séquence complète a été jouée, `PUT` **no-op** compris (contenu
reposé à l'identique : rien modifié).
| Étape | Résultat mesuré |
|---|---|
| `GET /csrftoken` | **200**, corps `{"token":"…=:…="}` (le repli `data-requesttoken` n'a pas servi) |
| `REPORT` sur la collection (`calendar-query` filtrée sur `UID`) | **207**, en-têtes `Depth: 1` + `Content-Type: application/xml; charset=utf-8` |
| `PUT` avec `If-Match` | **204** → **le partage est en écriture** |
| `REPORT` avec un `requesttoken` **invalide** | **207 quand même** : l'endpoint DAV **n'exige pas** le jeton CSRF |
- **Collection** = URL du calendrier **sans** `?export` (d'où `URL_COLLECTION`
dérivée dans `nextcloud.js`).
- **Préfixes réels** du `multistatus` : `d:` → `DAV:`, `cal:` →
`urn:ietf:params:xml:ns:caldav` (plus `s:`, `cs:`, `oc:`, `nc:`). Ce sont des
**préfixes**, pas un contrat : sélectionner **par namespace**
(`getElementsByTagNameNS`), jamais par préfixe.
- ⚠️ **Le nom de la ressource n'est PAS l'UID** : l'événement d'UID
`db2d146b-8e18-…` vit dans `…/00D03211-DA2E-4D06-AAAE-6E8C2355BA2B.ics`.
Déduire l'URL en `<uid>.ics` **aurait échoué** — d'où le `REPORT` préalable.
- `href` du `multistatus` = chemin **absolu depuis la racine**
(`/remote.php/dav/…`) → à résoudre contre la collection.
- `getetag` est rendu **avec ses guillemets** (`"8ee26a8f…"`) : `If-Match` le
reprend **verbatim**.
---
## 2. Cible : formulaire mairie (Gravity Forms, form id = 6)