Statische Dateien
Dateien ausliefern, ohne zu einem backend-spezifischen Plugin zu greifen.
getFromFile liefert eine Datei; getFromDirectory bildet eine URL auf
einen Verzeichnisbaum ab; getFromBrowseableDirectory ergänzt
HTML-Listings.
import { concat, getFromFile, getFromBrowseableDirectory, path } from 'actor-ts/http';
const routes = concat( path('logo.svg', getFromFile('./assets/logo.svg')), getFromBrowseableDirectory('static', './public'), // mountet unter /static);getFromDirectory([routePrefix,] fsRoot, options?) — mit routePrefix
mountet es darunter (z. B. /static/...), ohne mountet es an der Wurzel.
Optionen
Abschnitt betitelt „Optionen“| Builder-Methode | Feld | Default |
|---|---|---|
withIndexFiles(...n) | indexFiles | ['index.html'] ([] deaktiviert) |
withBrowse(flag?) | browse | false |
withCacheControl(v) | cacheControl | Header entfällt |
withEtag(flag) | etag | true (schwach, size+mtime) |
withLastModified(flag) | lastModified | true |
withRanges(flag) | ranges | true |
withDotfiles('deny' | 'allow') | dotfiles | 'deny' |
withSymlinks('within-root' | 'follow') | symlinks | 'within-root' |
withContentTypes(map) | contentTypes | — (ext → type Overrides) |
withMaxFileSize(bytes) | maxFileSize | 50 MiB (größer → 413) |
Verhalten
Abschnitt betitelt „Verhalten“- Conditional Requests — ein schwaches
ETag(size + mtime) undLast-Modified; passendesIf-None-Match/If-Modified-Since→304. - Range — ein einzelner
bytes=-Range →206(oder416, wenn unerfüllbar);Accept-Ranges: byteswird angekündigt. - Verzeichnisse — ein Request ohne Trailing-Slash
301-redirectet, um ihn zu ergänzen (Query erhalten); mit Slash werden Index-Dateien der Reihe nach probiert, dann ein Listing (falls Browsing) oder404. - HEAD — volle Header, leerer Body, kein Dateilesen.
MIME-Typen
Abschnitt betitelt „MIME-Typen“Content-Types kommen von contentTypeFor(pathOrExt, overrides?) — einer
kleinen Registry von ~45 gängigen Web-Typen. Text-artige Typen erhalten
; charset=utf-8; unbekannte Endungen fallen auf application/octet-stream
zurück. Pro Route mit withContentTypes({ ext: 'type' }) überschreiben oder
contentTypeFor direkt aufrufen, wenn du Responses von Hand baust.
Sicherheitsmodell
Abschnitt betitelt „Sicherheitsmodell“Der URL-Rest wird vor der Validierung vollständig dekodiert (jede
Encoding-Schicht abgetragen), dann wird jedes Pfad-Segment abgelehnt, wenn
es .., leer, ein NUL, ein Backslash oder ein :-Segment ist
(Windows-Laufwerk / NTFS Alternate Data Stream); absolute Formen werden
verweigert, der zusammengesetzte Pfad wird auf die Wurzel eingegrenzt, und
ein Symlink, der die Wurzel verlässt, wird verweigert (within-root-
Default). Dotfiles sind standardmäßig verboten. Jede Ablehnung ist ein
einheitlicher 404 — kein Informationsleck über Existierendes.
Wie weiter
Abschnitt betitelt „Wie weiter“- Route-DSL — wie Direktiven komponieren.
- HTML & XSS — das Listing escapet Dateinamen mit denselben Helfern.
- Sicherheit — der empfohlene Stack.
