From a4e529a816ede56a4df6204b59906ec749182dc1 Mon Sep 17 00:00:00 2001 From: Sam Tobin-Hochstadt Date: Fri, 5 Jul 2013 11:00:41 -0400 Subject: [PATCH] Fix wide-character decoding in URLs. --- racket/lib/collects/net/uri-codec.rkt | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/racket/lib/collects/net/uri-codec.rkt b/racket/lib/collects/net/uri-codec.rkt index 3b12af20e36..2c09c037810 100644 --- a/racket/lib/collects/net/uri-codec.rkt +++ b/racket/lib/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