diff --git a/go.sum b/go.sum
index a625c4a..054e8f1 100644
--- a/go.sum
+++ b/go.sum
@@ -11,4 +11,5 @@ golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5h
golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20201018230417-eeed37f84f13 h1:5jaG59Zhd+8ZXe8C+lgiAGqkOaZBruqrWclLkgAww34=
golang.org/x/sys v0.0.0-20201018230417-eeed37f84f13/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
diff --git a/src/feed/atom.go b/src/feed/atom.go
index 3cb9b4c..c33af22 100644
--- a/src/feed/atom.go
+++ b/src/feed/atom.go
@@ -59,7 +59,7 @@ func (links atomLinks) First(rel string) string {
func ParseAtom(r io.Reader) (*Feed, error) {
srcfeed := atomFeed{}
- decoder := xml.NewDecoder(r)
+ decoder := xmlDecoder(r)
if err := decoder.Decode(&srcfeed); err != nil {
return nil, err
}
diff --git a/src/feed/feed.go b/src/feed/feed.go
index daaab1a..0e4d656 100644
--- a/src/feed/feed.go
+++ b/src/feed/feed.go
@@ -19,7 +19,7 @@ func sniff(lookup string) (string, processor) {
lookup = strings.TrimSpace(lookup)
switch lookup[0] {
case '<':
- decoder := xml.NewDecoder(strings.NewReader(lookup))
+ decoder := xmlDecoder(strings.NewReader(lookup))
for {
token, _ := decoder.Token()
if token == nil {
diff --git a/src/feed/feed_test.go b/src/feed/feed_test.go
index addbc39..3d473ba 100644
--- a/src/feed/feed_test.go
+++ b/src/feed/feed_test.go
@@ -12,6 +12,10 @@ func TestSniff(t *testing.T) {
``,
"rdf",
},
+ {
+ ``,
+ "rss",
+ },
{
``,
"rss",
diff --git a/src/feed/rdf.go b/src/feed/rdf.go
index 2436310..5f6d7f8 100644
--- a/src/feed/rdf.go
+++ b/src/feed/rdf.go
@@ -27,7 +27,7 @@ type rdfItem struct {
func ParseRDF(r io.Reader) (*Feed, error) {
srcfeed := rdfFeed{}
- decoder := xml.NewDecoder(r)
+ decoder := xmlDecoder(r)
if err := decoder.Decode(&srcfeed); err != nil {
return nil, err
}
diff --git a/src/feed/rss.go b/src/feed/rss.go
index 1581545..e11eda2 100644
--- a/src/feed/rss.go
+++ b/src/feed/rss.go
@@ -6,7 +6,6 @@ package feed
import (
"encoding/xml"
- "fmt"
"io"
)
@@ -59,10 +58,9 @@ type rssEnclosure struct {
func ParseRSS(r io.Reader) (*Feed, error) {
srcfeed := rssFeed{}
- decoder := xml.NewDecoder(r)
+ decoder := xmlDecoder(r)
decoder.DefaultSpace = "rss"
if err := decoder.Decode(&srcfeed); err != nil {
- fmt.Println(err)
return nil, err
}
diff --git a/src/feed/utils.go b/src/feed/utils.go
index f538c91..38b626e 100644
--- a/src/feed/utils.go
+++ b/src/feed/utils.go
@@ -1,6 +1,9 @@
package feed
import (
+ "encoding/xml"
+ "io"
+ "golang.org/x/net/html/charset"
"time"
)
@@ -13,6 +16,13 @@ func firstNonEmpty(vals ...string) string {
return ""
}
+func xmlDecoder(r io.Reader) *xml.Decoder {
+ decoder := xml.NewDecoder(r)
+ decoder.Strict = false
+ decoder.CharsetReader = charset.NewReaderLabel
+ return decoder
+}
+
// taken from github.com/mjibson/goread
var dateFormats = []string{
time.RFC822, // RSS