]> Cypherpunks repositories - gostls13.git/commitdiff
encoding/xml: case-insensitive encoding recognition
authorGiulio Iotti <dullgiulio@gmail.com>
Mon, 31 Aug 2015 16:08:49 +0000 (19:08 +0300)
committerRuss Cox <rsc@golang.org>
Wed, 25 Nov 2015 17:09:28 +0000 (17:09 +0000)
From the XML spec: "XML processors should match character encoding
names in a case-insensitive way"

Fixes #12417.

Change-Id: I678c50152a49c14364be62b3f21ab9b9b009b24b
Reviewed-on: https://go-review.googlesource.com/14084
Reviewed-by: Russ Cox <rsc@golang.org>
src/encoding/xml/xml.go
src/encoding/xml/xml_test.go

index bdd607cfa850a09cfd69e98a09933cd7c6440d72..70ff8771720634244557c9c2adc17f009278d449 100644 (file)
@@ -583,7 +583,7 @@ func (d *Decoder) rawToken() (Token, error) {
                                return nil, d.err
                        }
                        enc := procInst("encoding", content)
-                       if enc != "" && enc != "utf-8" && enc != "UTF-8" {
+                       if enc != "" && enc != "utf-8" && enc != "UTF-8" && !strings.EqualFold(enc, "utf-8") {
                                if d.CharsetReader == nil {
                                        d.err = fmt.Errorf("xml: encoding %q declared but Decoder.CharsetReader is nil", enc)
                                        return nil, d.err
index 19465d7fb1744aa4d710e2d0971d4b0beeb8d74f..5d5e4bf9709cfa59112b5519f6df9567f6dcc31a 100644 (file)
@@ -771,3 +771,35 @@ func TestIssue11405(t *testing.T) {
                }
        }
 }
+
+func TestIssue12417(t *testing.T) {
+       testCases := []struct {
+               s  string
+               ok bool
+       }{
+               {`<?xml encoding="UtF-8" version="1.0"?><root/>`, true},
+               {`<?xml encoding="UTF-8" version="1.0"?><root/>`, true},
+               {`<?xml encoding="utf-8" version="1.0"?><root/>`, true},
+               {`<?xml encoding="uuu-9" version="1.0"?><root/>`, false},
+       }
+       for _, tc := range testCases {
+               d := NewDecoder(strings.NewReader(tc.s))
+               var err error
+               for {
+                       _, err = d.Token()
+                       if err != nil {
+                               if err == io.EOF {
+                                       err = nil
+                               }
+                               break
+                       }
+               }
+               if err != nil && tc.ok {
+                       t.Errorf("%q: Encoding charset: expected no error, got %s", tc.s, err)
+                       continue
+               }
+               if err == nil && !tc.ok {
+                       t.Errorf("%q: Encoding charset: expected error, got nil", tc.s)
+               }
+       }
+}