-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathquery.scm
45 lines (39 loc) · 1.26 KB
/
query.scm
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
(define-module (schingle query)
#:use-module (srfi srfi-1)
#:use-module (web uri)
#:use-module (web request)
#:use-module (schingle util)
#:export (query->alist
alist->query
req-query
*query-string*
query))
(define (empty-split str char)
"like string-split, but empty strings and #f become '()"
(if (or (not str) (string-null? str))
'()
(string-split str char)))
(define (query->alist qstring)
"converts an application/x-www-form-urlencoded query string to an alist"
(map (lambda (kv)
(let ((split (string-split kv #\=)))
(cons
(uri-decode (first split))
(uri-decode (second split)))))
(empty-split qstring #\&)))
(define (alist->query alist)
"converts an alist to an application/x-www-form-urlencoded query string"
(string-join
(map (lambda (pair)
(string-append
(uri-encode (to-string (car pair)))
"="
(uri-encode (to-string (cdr pair)))))
alist)
"&"))
(define (req-query request)
"returns the request's query string as an alist"
(query->alist (uri-query (request-uri request))))
(define *query-string* (make-parameter #f))
(define (query key)
(assoc-ref (*query-string*) key))