diff options
Diffstat (limited to 'weeb/request.scm')
| -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))) |