diff --git a/src/server/opml/read.go b/src/server/opml/read.go index cebb6db..c34510f 100644 --- a/src/server/opml/read.go +++ b/src/server/opml/read.go @@ -3,6 +3,8 @@ package opml import ( "encoding/xml" "io" + + "golang.org/x/net/html/charset" ) type opml struct { @@ -45,6 +47,7 @@ func Parse(r io.Reader) (Folder, error) { decoder := xml.NewDecoder(r) decoder.Entity = xml.HTMLEntity decoder.Strict = false + decoder.CharsetReader = charset.NewReaderLabel err := decoder.Decode(&val) if err != nil { diff --git a/src/server/opml/read_test.go b/src/server/opml/read_test.go index 5f6b7c2..ae82e1c 100644 --- a/src/server/opml/read_test.go +++ b/src/server/opml/read_test.go @@ -1,6 +1,7 @@ package opml import ( + "os" "reflect" "strings" "testing" @@ -87,3 +88,41 @@ func TestParseFallback(t *testing.T) { t.Fatal("invalid opml") } } + +func TestParseWithEncoding(t *testing.T) { + file, err := os.Open("sample_win1251.xml") + if err != nil { + t.Fatal(err) + } + have, err := Parse(file) + if err != nil { + t.Fatal(err) + } + want := Folder{ + Title: "", + Feeds: []Feed{ + { + Title: "пример1", + FeedUrl: "https://baz.com/feed.xml", + SiteUrl: "https://baz.com/", + }, + }, + Folders: []Folder{ + { + Title: "папка", + Feeds: []Feed{ + { + Title: "пример2", + FeedUrl: "https://foo.com/feed.xml", + SiteUrl: "https://foo.com/", + }, + }, + }, + }, + } + if !reflect.DeepEqual(want, have) { + t.Logf("want: %#v", want) + t.Logf("have: %#v", have) + t.Fatal("invalid opml") + } +} diff --git a/src/server/opml/sample_win1251.xml b/src/server/opml/sample_win1251.xml new file mode 100644 index 0000000..563ab56 --- /dev/null +++ b/src/server/opml/sample_win1251.xml @@ -0,0 +1,10 @@ + + +Çàãîëîâîê + + + + + + +