blob: 4215ab9a005e36717ecff1112e89244e752207d4 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
|
(define-module (entry-points server)
:export (main)
:use-module (util))
(use-modules* (web (server request response uri))
(output (html))
(server (util macro))
(sxml (simple))
(ice-9 (match control rdelim curried-definitions ftw
getopt-long
iconv regex #| regex here due to bad macros |# ))
(srfi (srfi-1 srfi-19 srfi-88)))
(use-modules (srfi srfi-19 util))
(define (file-extension name)
(car (last-pair (string-split name #\.))))
(define (sxml->xml-string sxml)
(with-output-to-string
(lambda () (sxml->xml sxml))))
(define (directory-table dir)
`(table
(thead
(tr (th "Name") (th "Type") (th "Perm")))
(tbody
,@(map (lambda (kv)
(let* (((k stat) kv))
`(tr (td (a (@ (href ,dir ,k)) ,k))
(td ,(stat:type stat))
(td ,(number->string (stat:perms stat) 8)))))
(cddr (file-system-tree dir))))))
(define (make-make-routes calendar events)
(make-routes
(GET "/" (y m) ; m in [1, 12]
(let* ((cd (current-date))
(start (if m
(date year: 2019 day: 1 month: (string->number m))
(current-date)))
(end (set (date-month start) = (+ 1))))
(return '((content-type text/html))
(with-output-to-string
(lambda () (html-generate calendar events start end))))))
(GET "/static" ()
(return
'((content-type text/html))
(sxml->xml-string
(directory-table "static/"))))
(GET "/static/:filename" (filename)
(return
`((content-type ,(case (string->symbol (file-extension filename))
((js) 'text/javascript)
((css) 'text/css))))
(call-with-input-file (string-append "static/" filename) read-string)))
(GET "/count" ()
;; (sleep 1)
(return '((content-type text/plain))
(string-append (number->string state) "\n")
(1+ state)))
))
(define options
'((port (value #t) (single-char #\p))
(addr (value #t))))
(define-public (server-main c e args)
(define opts (getopt-long args options))
(define port (option-ref opts 'port 8080))
(define addr (option-ref opts 'addr INADDR_LOOPBACK))
(format #t "Starting server on ~a:~a~%I'm ~a, runing from ~a~%"
(number->string addr 16) port
(getpid) (getcwd))
(run-server (make-make-routes c e)
'http
`(port: ,port
addr: ,addr)
0))
|