Improved code for `form-urlencoded->alist', should be faster too.
original commit: 8b48802440ea08e237b28f823fd2de57740d7c62
This commit is contained in:
parent
2fd831d01e
commit
f4c0fcaea0
|
@ -269,20 +269,19 @@ See more in PR8831.
|
||||||
;; string -> listof (cons string string)
|
;; string -> listof (cons string string)
|
||||||
;; http://www.w3.org/TR/html401/appendix/notes.html#ampersands-in-uris
|
;; http://www.w3.org/TR/html401/appendix/notes.html#ampersands-in-uris
|
||||||
(define (form-urlencoded->alist str)
|
(define (form-urlencoded->alist str)
|
||||||
(define keyval-regexp #rx"^([^=]*)(?:=(.*))?$")
|
(define keyval-regexp #rx"=")
|
||||||
(define value-regexp
|
(define value-regexp
|
||||||
(case (current-alist-separator-mode)
|
(case (current-alist-separator-mode)
|
||||||
[(semi) #rx"[;]"]
|
[(semi) #rx"[;]"]
|
||||||
[(amp) #rx"[&]"]
|
[(amp) #rx"[&]"]
|
||||||
[else #rx"[&;]"]))
|
[else #rx"[&;]"]))
|
||||||
(if (equal? "" str)
|
(define (parse-keyval keyval)
|
||||||
'()
|
(let (;; m = #f => no "=..." part
|
||||||
(map (lambda (keyval)
|
[m (regexp-match-positions keyval-regexp keyval)])
|
||||||
(let ([m (regexp-match keyval-regexp keyval)]) ; cannot fail
|
(cons (string->symbol (form-urlencoded-decode
|
||||||
(cons (string->symbol (form-urlencoded-decode (cadr m)))
|
(if m (substring keyval 0 (caar m)) keyval)))
|
||||||
;; can be #f for no "=..." part
|
(and m (form-urlencoded-decode (substring keyval (cdar m)))))))
|
||||||
(and (caddr m) (form-urlencoded-decode (caddr m))))))
|
(if (equal? "" str) '() (map parse-keyval (regexp-split value-regexp str))))
|
||||||
(regexp-split value-regexp str))))
|
|
||||||
|
|
||||||
(define current-alist-separator-mode
|
(define current-alist-separator-mode
|
||||||
(make-parameter 'amp-or-semi
|
(make-parameter 'amp-or-semi
|
||||||
|
|
Loading…
Reference in New Issue
Block a user