1
0
Fork 0
mirror of https://github.com/miniflux/v2.git synced 2025-09-15 18:57:04 +00:00

Handle invalid feeds with relative URLs

This commit is contained in:
Frédéric Guillot 2020-12-02 20:47:11 -08:00 committed by fguillot
parent 49feb1958c
commit f722fd1208
18 changed files with 392 additions and 157 deletions

View file

@ -55,12 +55,22 @@ func (j *jsonFeed) GetAuthor() string {
return getAuthor(j.Author)
}
func (j *jsonFeed) Transform() *model.Feed {
feed := new(model.Feed)
feed.FeedURL = j.FeedURL
feed.SiteURL = j.SiteURL
feed.Title = strings.TrimSpace(j.Title)
func (j *jsonFeed) Transform(baseURL string) *model.Feed {
var err error
feed := new(model.Feed)
feed.FeedURL, err = url.AbsoluteURL(baseURL, j.FeedURL)
if err != nil {
feed.FeedURL = j.FeedURL
}
feed.SiteURL, err = url.AbsoluteURL(baseURL, j.SiteURL)
if err != nil {
feed.SiteURL = j.SiteURL
}
feed.Title = strings.TrimSpace(j.Title)
if feed.Title == "" {
feed.Title = feed.SiteURL
}

View file

@ -13,12 +13,12 @@ import (
)
// Parse returns a normalized feed struct from a JON feed.
func Parse(data io.Reader) (*model.Feed, *errors.LocalizedError) {
func Parse(baseURL string, data io.Reader) (*model.Feed, *errors.LocalizedError) {
feed := new(jsonFeed)
decoder := json.NewDecoder(data)
if err := decoder.Decode(&feed); err != nil {
return nil, errors.NewLocalizedError("Unable to parse JSON Feed: %q", err)
}
return feed.Transform(), nil
return feed.Transform(baseURL), nil
}

View file

@ -31,7 +31,7 @@ func TestParseJsonFeed(t *testing.T) {
]
}`
feed, err := Parse(bytes.NewBufferString(data))
feed, err := Parse("https://example.org/feed.json", bytes.NewBufferString(data))
if err != nil {
t.Fatal(err)
}
@ -113,7 +113,7 @@ func TestParsePodcast(t *testing.T) {
]
}`
feed, err := Parse(bytes.NewBufferString(data))
feed, err := Parse("http://therecord.co/feed.json", bytes.NewBufferString(data))
if err != nil {
t.Fatal(err)
}
@ -197,7 +197,7 @@ func TestParseEntryWithoutAttachmentURL(t *testing.T) {
]
}`
feed, err := Parse(bytes.NewBufferString(data))
feed, err := Parse("http://therecord.co/feed.json", bytes.NewBufferString(data))
if err != nil {
t.Fatal(err)
}
@ -226,7 +226,7 @@ func TestParseFeedWithRelativeURL(t *testing.T) {
]
}`
feed, err := Parse(bytes.NewBufferString(data))
feed, err := Parse("https://example.org/feed.json", bytes.NewBufferString(data))
if err != nil {
t.Fatal(err)
}
@ -258,7 +258,7 @@ func TestParseAuthor(t *testing.T) {
]
}`
feed, err := Parse(bytes.NewBufferString(data))
feed, err := Parse("https://example.org/feed.json", bytes.NewBufferString(data))
if err != nil {
t.Fatal(err)
}
@ -287,7 +287,7 @@ func TestParseFeedWithoutTitle(t *testing.T) {
]
}`
feed, err := Parse(bytes.NewBufferString(data))
feed, err := Parse("https://example.org/feed.json", bytes.NewBufferString(data))
if err != nil {
t.Fatal(err)
}
@ -313,7 +313,7 @@ func TestParseFeedItemWithInvalidDate(t *testing.T) {
]
}`
feed, err := Parse(bytes.NewBufferString(data))
feed, err := Parse("https://example.org/feed.json", bytes.NewBufferString(data))
if err != nil {
t.Fatal(err)
}
@ -341,7 +341,7 @@ func TestParseFeedItemWithoutID(t *testing.T) {
]
}`
feed, err := Parse(bytes.NewBufferString(data))
feed, err := Parse("https://example.org/feed.json", bytes.NewBufferString(data))
if err != nil {
t.Fatal(err)
}
@ -368,7 +368,7 @@ func TestParseFeedItemWithoutTitle(t *testing.T) {
]
}`
feed, err := Parse(bytes.NewBufferString(data))
feed, err := Parse("https://example.org/feed.json", bytes.NewBufferString(data))
if err != nil {
t.Fatal(err)
}
@ -395,7 +395,7 @@ func TestParseTruncateItemTitle(t *testing.T) {
]
}`
feed, err := Parse(bytes.NewBufferString(data))
feed, err := Parse("https://example.org/feed.json", bytes.NewBufferString(data))
if err != nil {
t.Fatal(err)
}
@ -411,7 +411,7 @@ func TestParseTruncateItemTitle(t *testing.T) {
func TestParseInvalidJSON(t *testing.T) {
data := `garbage`
_, err := Parse(bytes.NewBufferString(data))
_, err := Parse("https://example.org/feed.json", bytes.NewBufferString(data))
if err == nil {
t.Error("Parse should returns an error")
}