Elenco endpoint e parametri - risposta text/plain 1) Caricamento file (diretto) - POST /d * Form (multipart): file (required) * Oppure body raw (application/octet-stream) * Query (opzionali): ttl=<30m|1h|7d>, secure=true|false (se MAX_FILE_DURATION configurato il ttl viene defaultato/clippato) * Header: Authorization: Bearer (opzionale) - se fornito viene usato come secure_key * Comportamento: se secure=true e non viene fornito Authorization, il server genera una secure_key e la restituisce UNA SOLA VOLTA nella risposta. * Response: JSON { "url": "..." [, "secure_key": "..."] } - POST /d/{file_id} * Stesso comportamento, ma 409 se file_id già esiste. 2) Caricamento chunked (resumable) - POST /d/{file_id}/{n} (n >= 1) * Body: raw bytes del chunk * Header (solo primo chunk): X-Filename: * Header opzionale per integrità: X-Checksum: sha256= * Query (solo primo chunk): ttl=<...>, secure=true (MAX_FILE_DURATION applicato) * Header Authorization: Bearer (se secure, opzionale sul primo chunk per imporre la chiave) * Errori: 413 se chunk > CHUNK_SIZE_MB, 409 se chunk già presente con dimensione diversa - POST /d/{file_id}/complete * Body JSON opzionale: { "chunk_count": N, "total_size": BYTES } (se omessi, il server li inferisce) * Effetto: marca l'upload come completo 3) Download - GET /d/{file_id} (inline) - GET /d/{file_id}/f (attachment) * Header: Authorization: Bearer REQUIRED se il file è sicuro * Errori: 404 se non esiste, 410 se scaduto, 403 se non autorizzato, 409 se upload chunked non completo 4) Aggiornamento file - PUT /d/{file_id} * Form (multipart): file (required) oppure body raw * Query (opzionali): ttl, secure (se omesso mantiene lo stato precedente) * Header: Authorization: Bearer REQUIRED se il file esistente è sicuro * Response: JSON { "message": "ok" [, "secure_key": "..."] } 5) Cancellazione file - DELETE /d/{file_id} * Header: Authorization: Bearer REQUIRED se il file è sicuro * Response: JSON { "message": "ok" } 6) Metadata e storico - GET /i/{file_id} * Restituisce JSON con "metadata" (secure_key_hash non esposto) e "history" Formato TTL riconosciuto (s, m, h, d). MAX_FILE_DURATION (env) impone durata massima e default se ttl mancante: - s (secondi), m (minuti), h (ore), d (giorni) Header di autenticazione (per file sicuri): - Authorization: Bearer - Se perdi la secure_key generata dal server non potrai più accedere al file (viene salvata solo l'hash). Esempi rapidi (curl): Upload diretto (server genera id): curl -X POST "http://localhost:8000/d" -F "file=@/percorso/file" -F "ttl=1d" Upload chunk (primo chunk): curl -X POST "http://localhost:8000/d/{file_id}/1?secure=true" -H "X-Filename: file.iso" --data-binary @chunk1.bin Finalize: curl -X POST "http://localhost:8000/d/{file_id}/complete" -H 'Content-Type: application/json' -d '{"chunk_count":10, "total_size":104857600}' Download inline: curl -X GET "http://localhost:8000/d/{file_id}" -o out.bin Download attachment sicuro: curl -X GET "http://localhost:8000/d/{file_id}/f" -H "Authorization: Bearer " -o out.bin Fine lista.