Replace Python server with Guile
This commit is contained in:
43
server.scm
Normal file
43
server.scm
Normal file
@@ -0,0 +1,43 @@
|
||||
(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)
|
||||
Reference in New Issue
Block a user