From f4c0fcaea08f512c11417761c99498c7953e5cfd Mon Sep 17 00:00:00 2001 From: Eli Barzilay Date: Tue, 3 May 2011 16:19:24 -0400 Subject: [PATCH] Improved code for `form-urlencoded->alist', should be faster too. original commit: 8b48802440ea08e237b28f823fd2de57740d7c62 --- collects/net/uri-codec-unit.rkt | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/collects/net/uri-codec-unit.rkt b/collects/net/uri-codec-unit.rkt index c992d62..a59162e 100644 --- a/collects/net/uri-codec-unit.rkt +++ b/collects/net/uri-codec-unit.rkt @@ -269,20 +269,19 @@ See more in PR8831. ;; string -> listof (cons string string) ;; http://www.w3.org/TR/html401/appendix/notes.html#ampersands-in-uris (define (form-urlencoded->alist str) - (define keyval-regexp #rx"^([^=]*)(?:=(.*))?$") + (define keyval-regexp #rx"=") (define value-regexp (case (current-alist-separator-mode) [(semi) #rx"[;]"] [(amp) #rx"[&]"] [else #rx"[&;]"])) - (if (equal? "" str) - '() - (map (lambda (keyval) - (let ([m (regexp-match keyval-regexp keyval)]) ; cannot fail - (cons (string->symbol (form-urlencoded-decode (cadr m))) - ;; can be #f for no "=..." part - (and (caddr m) (form-urlencoded-decode (caddr m)))))) - (regexp-split value-regexp str)))) + (define (parse-keyval keyval) + (let (;; m = #f => no "=..." part + [m (regexp-match-positions keyval-regexp keyval)]) + (cons (string->symbol (form-urlencoded-decode + (if m (substring keyval 0 (caar m)) keyval))) + (and m (form-urlencoded-decode (substring keyval (cdar m))))))) + (if (equal? "" str) '() (map parse-keyval (regexp-split value-regexp str)))) (define current-alist-separator-mode (make-parameter 'amp-or-semi