(use-modules (ice-9 binary-ports) (web server) (web request) (web response) (web uri)) (define mime-types '(("html" . (text/html)) ("css" . (text/css)) ("js" . (application/javascript)) ("wasm" . (application/wasm)) ("f" . (text/plain)) ("wat" . (text/plain)) ("png" . (image/png)))) (define (mime-type path) (let* ((dot (string-rindex path #\.)) (ext (when dot (substring path (1+ dot))))) (or (assoc-ref mime-types ext) "application/octet-stream"))) (define headers '((cross-origin-opener-policy . "same-origin") (cross-origin-embedder-policy . "require-corp") (cache-control . (no-store no-cache must-revalidate)))) (define (is-dir? path) (eq? 'directory (stat:type (stat path)))) (define (request-path request) (let ((path (string-append "." (uri-path (request-uri request))))) (cond ((not (file-exists? path)) #nil) ((is-dir? path) (string-append path "index.html")) (#t path)))) (define (file-handler request body) (let ((path (request-path request))) (if path (values (cons `(content-type . ,(mime-type path)) headers) (get-bytevector-all (open-input-file path))) (values (build-response #:code 404) "")))) (run-server file-handler)