aboutsummaryrefslogtreecommitdiff
path: root/weeb
diff options
context:
space:
mode:
authorJakob L. Kreuze2026-07-16 15:16:12 -0400
committerJakob L. Kreuze2026-07-16 15:28:58 -0400
commitd840644f481a348ffcb4e1d85363563c97499336 (patch)
tree41e6a4adb36798239ab25d550c54f86da2e12b2f /weeb
parent5618be7d5a01ae09d8cd9bf9e2b799e3dc503d8e (diff)
Hash table implementation of parse-form-urlencoded
Diffstat (limited to 'weeb')
-rw-r--r--weeb/request.scm21
1 files changed, 16 insertions, 5 deletions
diff --git a/weeb/request.scm b/weeb/request.scm
index 3d18b0a..3704ba2 100644
--- a/weeb/request.scm
+++ b/weeb/request.scm
@@ -18,6 +18,7 @@
(define-module (weeb request)
#:use-module (ice-9 match)
+ #:use-module (srfi srfi-69)
#:use-module (weeb struct)
#:export (<request>
urldecode
@@ -43,8 +44,18 @@
(loop (+ i 1) (string-append acc (string (string-ref str i))))))))
(define (parse-form-urlencoded encoded)
- (map (lambda (encoded-pair)
- (match (map urldecode (string-split encoded-pair #\=))
- ((key value) `(,key . ,value))))
- (filter (lambda (x) (not (zero? (string-length x))))
- (string-split encoded #\&))))
+ (let ((result (make-hash-table)))
+ (for-each
+ (lambda (encoded-pair)
+ (match (map urldecode (string-split encoded-pair #\=))
+ ((key value)
+ (let ((possible-duplicate (hash-table-ref/default result key #f)))
+ (cond ((list? possible-duplicate)
+ (hash-table-set! result key (append possible-duplicate (list value))))
+ (possible-duplicate
+ (hash-table-set! result key (list possible-duplicate value)))
+ (else
+ (hash-table-set! result key value)))))))
+ (filter (lambda (x) (not (zero? (string-length x))))
+ (string-split encoded #\&)))
+ (hash-table->alist result)))

© 2015 - 2026 Jakob L. Kreuze