diff options
| author | Jakob L. Kreuze | 2026-07-16 15:16:12 -0400 |
|---|---|---|
| committer | Jakob L. Kreuze | 2026-07-16 15:28:58 -0400 |
| commit | d840644f481a348ffcb4e1d85363563c97499336 (patch) | |
| tree | 41e6a4adb36798239ab25d550c54f86da2e12b2f /weeb | |
| parent | 5618be7d5a01ae09d8cd9bf9e2b799e3dc503d8e (diff) | |
Hash table implementation of parse-form-urlencoded
Diffstat (limited to 'weeb')
| -rw-r--r-- | weeb/request.scm | 21 |
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))) |