1
0
Fork 0
hoot-experiments/web-server.scm

39 lines
1.2 KiB
Scheme

(use-modules (ice-9 binary-ports) (ice-9 format) (ice-9 match)
(web server) (web request) (web response) (web uri))
(define (extension file)
(match (string-split file #\.)
(() #f)
((_ ... ext) ext)))
(define (mime-type file-name)
(or (assoc-ref '(("js" . application/javascript)
("html" . text/html)
("wasm" . application/wasm))
(extension file-name))
'text/plain))
(define (render-file file-name)
(values `((content-type . (,(mime-type file-name))))
(call-with-input-file file-name get-bytevector-all)))
(define (not-found path)
(values (build-response #:code 404) (string-append "Not found: " path)))
(define (directory? file-name)
(eq? (stat:type (stat file-name)) 'directory))
(define (serve-file path)
(let ((f (string-append (getcwd) (uri-decode path))))
(if (and (file-exists? f) (not (directory? f)))
(render-file f)
(not-found path))))
(define (handle-request request body)
(let ((method (request-method request))
(path (uri-path (request-uri request))))
(format #t "~a ~a\n" method path)
(serve-file path)))
(run-server handle-request 'http '(#:port 8080))