Skip to content

Commit 3bdeb10

Browse files
authored
fix: check for nil link to avoid runtime panic #95 (#103)
## What type of PR is this? (check all applicable) - [x] Bug Fix ## Description Check for nil link in feed to avoid runtime panic ## Related Issue - Closes #95 ## Added/updated tests? - [x] Yes
1 parent 8b1dc44 commit 3bdeb10

File tree

3 files changed

+72
-9
lines changed

3 files changed

+72
-9
lines changed

atom.go

+15-8
Original file line numberDiff line numberDiff line change
@@ -89,13 +89,16 @@ type Atom struct {
8989

9090
func newAtomEntry(i *Item) *AtomEntry {
9191
id := i.Id
92-
92+
link := i.Link
93+
if link == nil {
94+
link = &Link{}
95+
}
9396
if len(id) == 0 {
9497
// if there's no id set, try to create one, either from data or just a uuid
95-
if len(i.Link.Href) > 0 && (!i.Created.IsZero() || !i.Updated.IsZero()) {
98+
if len(link.Href) > 0 && (!i.Created.IsZero() || !i.Updated.IsZero()) {
9699
dateStr := anyTimeFormat("2006-01-02", i.Updated, i.Created)
97-
host, path := i.Link.Href, "/invalid.html"
98-
if url, err := url.Parse(i.Link.Href); err == nil {
100+
host, path := link.Href, "/invalid.html"
101+
if url, err := url.Parse(link.Href); err == nil {
99102
host, path = url.Host, url.Path
100103
}
101104
id = fmt.Sprintf("tag:%s,%s:%s", host, dateStr, path)
@@ -108,13 +111,13 @@ func newAtomEntry(i *Item) *AtomEntry {
108111
name, email = i.Author.Name, i.Author.Email
109112
}
110113

111-
link_rel := i.Link.Rel
114+
link_rel := link.Rel
112115
if link_rel == "" {
113116
link_rel = "alternate"
114117
}
115118
x := &AtomEntry{
116119
Title: i.Title,
117-
Links: []AtomLink{{Href: i.Link.Href, Rel: link_rel, Type: i.Link.Type}},
120+
Links: []AtomLink{{Href: link.Href, Rel: link_rel, Type: link.Type}},
118121
Id: id,
119122
Updated: anyTimeFormat(time.RFC3339, i.Updated, i.Created),
120123
}
@@ -142,12 +145,16 @@ func newAtomEntry(i *Item) *AtomEntry {
142145
// create a new AtomFeed with a generic Feed struct's data
143146
func (a *Atom) AtomFeed() *AtomFeed {
144147
updated := anyTimeFormat(time.RFC3339, a.Updated, a.Created)
148+
link := a.Link
149+
if link == nil {
150+
link = &Link{}
151+
}
145152
feed := &AtomFeed{
146153
Xmlns: ns,
147154
Title: a.Title,
148-
Link: &AtomLink{Href: a.Link.Href, Rel: a.Link.Rel},
155+
Link: &AtomLink{Href: link.Href, Rel: link.Rel},
149156
Subtitle: a.Description,
150-
Id: a.Link.Href,
157+
Id: link.Href,
151158
Updated: updated,
152159
Rights: a.Copyright,
153160
}

feed_test.go

+52
Original file line numberDiff line numberDiff line change
@@ -504,6 +504,58 @@ func TestFeedSorted(t *testing.T) {
504504
}
505505
}
506506

507+
func TestFeedNil(t *testing.T) {
508+
now, err := time.Parse(time.RFC3339, "2013-01-16T21:52:35-05:00")
509+
if err != nil {
510+
t.Error(err)
511+
}
512+
tz := time.FixedZone("EST", -5*60*60)
513+
now = now.In(tz)
514+
515+
feed := &Feed{
516+
Title: "jmoiron.net blog",
517+
Link: nil,
518+
Description: "discussion about tech, footie, photos",
519+
Author: nil,
520+
Created: now,
521+
Copyright: "This work is copyright © Benjamin Button",
522+
}
523+
524+
feed.Items = []*Item{
525+
{
526+
Title: "Limiting Concurrency in Go",
527+
Link: nil,
528+
Description: "A discussion on controlled parallelism in golang",
529+
Author: nil,
530+
Created: now,
531+
Content: `<p>Go's goroutines make it easy to make <a href="http://collectiveidea.com/blog/archives/2012/12/03/playing-with-go-embarrassingly-parallel-scripts/">embarrassingly parallel programs</a>, but in many &quot;real world&quot; cases resources can be limited and attempting to do everything at once can exhaust your access to them.</p>`,
532+
}}
533+
534+
if _, err := feed.ToAtom(); err != nil {
535+
t.Errorf("unexpected error encoding Atom: %v", err)
536+
}
537+
var buf bytes.Buffer
538+
if err := feed.WriteAtom(&buf); err != nil {
539+
t.Errorf("unexpected error writing Atom: %v", err)
540+
}
541+
542+
if _, err := feed.ToRss(); err != nil {
543+
t.Errorf("unexpected error encoding RSS: %v", err)
544+
}
545+
buf.Reset()
546+
if err := feed.WriteRss(&buf); err != nil {
547+
t.Errorf("unexpected error writing RSS: %v", err)
548+
}
549+
550+
if _, err := feed.ToJSON(); err != nil {
551+
t.Errorf("unexpected error encoding JSON: %v", err)
552+
}
553+
buf.Reset()
554+
if err := feed.WriteJSON(&buf); err != nil {
555+
t.Errorf("unexpected error writing JSON: %v", err)
556+
}
557+
}
558+
507559
var jsonOutputHub = `{
508560
"version": "https://jsonfeed.org/version/1",
509561
"title": "feed title",

rss.go

+5-1
Original file line numberDiff line numberDiff line change
@@ -137,9 +137,13 @@ func (r *Rss) RssFeed() *RssFeed {
137137
image = &RssImage{Url: r.Image.Url, Title: r.Image.Title, Link: r.Image.Link, Width: r.Image.Width, Height: r.Image.Height}
138138
}
139139

140+
var href string
141+
if r.Link != nil {
142+
href = r.Link.Href
143+
}
140144
channel := &RssFeed{
141145
Title: r.Title,
142-
Link: r.Link.Href,
146+
Link: href,
143147
Description: r.Description,
144148
ManagingEditor: author,
145149
PubDate: pub,

0 commit comments

Comments
 (0)