diff --git a/collects/net/uri-codec.rkt b/collects/net/uri-codec.rkt index 3b12af20e3..2c09c03781 100644 --- a/collects/net/uri-codec.rkt +++ b/collects/net/uri-codec.rkt @@ -167,19 +167,21 @@ See more in PR8831. ;; vector string -> string (define (decode table str) (define max-ascii (integer->char ascii-size)) + ;; internal-decode : list -> listof[byte] (define (internal-decode l) (if (null? l) '() (let* ([c (car l)] [l (cdr l)] [hex (and (equal? #\% c) (pair? l) (pair? (cdr l)) (string->number (string (car l) (cadr l)) 16))]) - (if hex (cons hex (internal-decode (cddr l))) - (cons (if (charinteger c)) - ;; This should probably error, but strings to be decoded - ;; might come from misbehaving sources; maybe it's better - ;; to add some parameter for a permissive mode - (bytes->list (string->bytes/utf-8 (string c)))) - (internal-decode l)))))) + (if hex + (cons hex (internal-decode (cddr l))) + (append (if (charinteger c))) + ;; This should probably error, but strings to be decoded + ;; might come from misbehaving sources; maybe it's better + ;; to add some parameter for a permissive mode + (bytes->list (string->bytes/utf-8 (string c)))) + (internal-decode l)))))) (bytes->string/utf-8 (apply bytes (internal-decode (string->list str))))) ;; Utility for defining codecs