commit 0a4b2cc208843e2b18ec6613b00fbaeb7fbeb3c4
parent 11850cdbfb55e797c621981a9cbf55c4b54be930
Author: Natasha Kerensikova <natgh@instinctive.eu>
Date: Thu, 19 Mar 2026 20:25:31 +0000
Parameters are percent-decoded
Diffstat:
| M | src/cgi.scm | | | 46 | +++++++++++++++++++++++++++++++++++++--------- |
1 file changed, 37 insertions(+), 9 deletions(-)
diff --git a/src/cgi.scm b/src/cgi.scm
@@ -84,13 +84,41 @@ END-OF-CSS
(if ct (string->number ct) 0)))
(define input-text (read-string content-length))
(define input-list
- (map
- (lambda (s)
- (let ((index (substring-index "=" s)))
- (if index
- (list (substring s 0 index) (substring s (+ 1 index)))
- s)))
- (string-split input-text "&")))
+ (let* ((hdigit* (any-of (preceded-by (is #\0) (result 0))
+ (preceded-by (is #\1) (result 1))
+ (preceded-by (is #\2) (result 2))
+ (preceded-by (is #\3) (result 3))
+ (preceded-by (is #\4) (result 4))
+ (preceded-by (is #\5) (result 5))
+ (preceded-by (is #\6) (result 6))
+ (preceded-by (is #\7) (result 7))
+ (preceded-by (is #\8) (result 8))
+ (preceded-by (is #\9) (result 9))
+ (preceded-by (is #\a) (result 10))
+ (preceded-by (is #\A) (result 10))
+ (preceded-by (is #\b) (result 11))
+ (preceded-by (is #\B) (result 11))
+ (preceded-by (is #\c) (result 12))
+ (preceded-by (is #\C) (result 12))
+ (preceded-by (is #\d) (result 13))
+ (preceded-by (is #\D) (result 13))
+ (preceded-by (is #\e) (result 14))
+ (preceded-by (is #\E) (result 14))
+ (preceded-by (is #\f) (result 15))
+ (preceded-by (is #\F) (result 15))))
+ (pct* (sequence* ((_ (is #\%))
+ (h hdigit*)
+ (l hdigit*))
+ (result (integer->char (+ (* 16 h) l)))))
+ (value* (as-string (repeated (any-of pct* item) until: (is #\&))))
+ (name* (as-string (repeated item until: (is #\=))))
+ (pair* (sequence* ((n name*)
+ (_ (is #\=))
+ (v value*)
+ (_ (is #\&)))
+ (result (list n (string-translate v "\r")))))
+ (parser (zero-or-more pair*)))
+ (parse parser (string-append input-text "&"))))
(define (input-var name)
(let loop ((rest input-list))
(cond ((null? rest) #f)
@@ -325,8 +353,8 @@ END-OF-CSS
(sql/transient db
"UPDATE gruik SET mtime=?,notes=trim(notes||char(10)||?,char(10)),description=? WHERE mark=1 AND id=?;")
(current-seconds)
- (string-translate (required-input-var "notes") "\r")
- (string-translate (required-input-var "description") "\r")
+ (required-input-var "notes")
+ (required-input-var "description")
id))
id))