Jelajahi Sumber

Allow application/xhtml+xml links as comments URL in Atom replies

Frédéric Guillot 6 tahun lalu
induk
melakukan
61f0c8aa66
3 mengubah file dengan 95 tambahan dan 6 penghapusan
  1. 4 2
      reader/atom/atom_10.go
  2. 84 1
      reader/atom/atom_10_test.go
  3. 7 3
      reader/atom/atom_common.go

+ 4 - 2
reader/atom/atom_10.go

@@ -194,9 +194,11 @@ func (a *atom10Entry) entryEnclosures() model.EnclosureList {
 	return enclosures
 }
 
-// See https://tools.ietf.org/html/rfc4685#section-3
+// See https://tools.ietf.org/html/rfc4685#section-4
+// If the type attribute of the atom:link is omitted, its value is assumed to be "application/atom+xml".
+// We accept only HTML or XHTML documents for now since the intention is to have the same behavior as RSS.
 func (a *atom10Entry) entryCommentsURL() string {
-	commentsURL := a.Links.firstLinkWithRelationAndType("replies", "text/html")
+	commentsURL := a.Links.firstLinkWithRelationAndType("replies", "text/html", "application/xhtml+xml")
 	if url.IsAbsoluteURL(commentsURL) {
 		return commentsURL
 	}

+ 84 - 1
reader/atom/atom_10_test.go

@@ -734,7 +734,7 @@ A website: http://example.org/</media:description>
 	}
 }
 
-func TestParseRepliesLinkRelation(t *testing.T) {
+func TestParseRepliesLinkRelationWithHTMLType(t *testing.T) {
 	data := `<?xml version="1.0" encoding="utf-8"?>
 		<feed xmlns="http://www.w3.org/2005/Atom"
 			xmlns:thr="http://purl.org/syndication/thread/1.0">
@@ -778,6 +778,89 @@ func TestParseRepliesLinkRelation(t *testing.T) {
 	}
 }
 
+func TestParseRepliesLinkRelationWithXHTMLType(t *testing.T) {
+	data := `<?xml version="1.0" encoding="utf-8"?>
+		<feed xmlns="http://www.w3.org/2005/Atom"
+			xmlns:thr="http://purl.org/syndication/thread/1.0">
+		<id>http://www.example.org/myfeed</id>
+		<title>My Example Feed</title>
+		<updated>2005-07-28T12:00:00Z</updated>
+		<link href="http://www.example.org/myfeed" />
+		<author><name>James</name></author>
+		<entry>
+			<id>tag:entries.com,2005:1</id>
+			<title>My original entry</title>
+			<updated>2006-03-01T12:12:12Z</updated>
+			<link href="http://www.example.org/entries/1" />
+			<link rel="replies"
+				type="application/atom+xml"
+				href="http://www.example.org/mycommentsfeed.xml"
+				thr:count="10" thr:updated="2005-07-28T12:10:00Z" />
+			<link rel="replies"
+				type="application/xhtml+xml"
+				href="http://www.example.org/comments.xhtml"
+				thr:count="10" thr:updated="2005-07-28T12:10:00Z" />
+			<summary>This is my original entry</summary>
+		</entry>
+	</feed>`
+
+	feed, err := Parse(bytes.NewBufferString(data))
+	if err != nil {
+		t.Fatal(err)
+	}
+
+	if len(feed.Entries) != 1 {
+		t.Errorf("Incorrect number of entries, got: %d", len(feed.Entries))
+	}
+
+	if feed.Entries[0].URL != "http://www.example.org/entries/1" {
+		t.Errorf("Incorrect entry URL, got: %s", feed.Entries[0].URL)
+	}
+
+	if feed.Entries[0].CommentsURL != "http://www.example.org/comments.xhtml" {
+		t.Errorf("Incorrect entry comments URL, got: %s", feed.Entries[0].CommentsURL)
+	}
+}
+
+func TestParseRepliesLinkRelationWithNoType(t *testing.T) {
+	data := `<?xml version="1.0" encoding="utf-8"?>
+		<feed xmlns="http://www.w3.org/2005/Atom"
+			xmlns:thr="http://purl.org/syndication/thread/1.0">
+		<id>http://www.example.org/myfeed</id>
+		<title>My Example Feed</title>
+		<updated>2005-07-28T12:00:00Z</updated>
+		<link href="http://www.example.org/myfeed" />
+		<author><name>James</name></author>
+		<entry>
+			<id>tag:entries.com,2005:1</id>
+			<title>My original entry</title>
+			<updated>2006-03-01T12:12:12Z</updated>
+			<link href="http://www.example.org/entries/1" />
+			<link rel="replies"
+				href="http://www.example.org/mycommentsfeed.xml"
+				thr:count="10" thr:updated="2005-07-28T12:10:00Z" />
+			<summary>This is my original entry</summary>
+		</entry>
+	</feed>`
+
+	feed, err := Parse(bytes.NewBufferString(data))
+	if err != nil {
+		t.Fatal(err)
+	}
+
+	if len(feed.Entries) != 1 {
+		t.Errorf("Incorrect number of entries, got: %d", len(feed.Entries))
+	}
+
+	if feed.Entries[0].URL != "http://www.example.org/entries/1" {
+		t.Errorf("Incorrect entry URL, got: %s", feed.Entries[0].URL)
+	}
+
+	if feed.Entries[0].CommentsURL != "" {
+		t.Errorf("Incorrect entry comments URL, got: %s", feed.Entries[0].CommentsURL)
+	}
+}
+
 func TestAbsoluteCommentsURL(t *testing.T) {
 	data := `<?xml version="1.0" encoding="utf-8"?>
 		<feed xmlns="http://www.w3.org/2005/Atom"

+ 7 - 3
reader/atom/atom_common.go

@@ -57,10 +57,14 @@ func (a atomLinks) firstLinkWithRelation(relation string) string {
 	return ""
 }
 
-func (a atomLinks) firstLinkWithRelationAndType(relation, contentType string) string {
+func (a atomLinks) firstLinkWithRelationAndType(relation string, contentTypes ...string) string {
 	for _, link := range a {
-		if strings.ToLower(link.Rel) == relation && strings.ToLower(link.Type) == contentType {
-			return strings.TrimSpace(link.URL)
+		if strings.ToLower(link.Rel) == relation {
+			for _, contentType := range contentTypes {
+				if strings.ToLower(link.Type) == contentType {
+					return strings.TrimSpace(link.URL)
+				}
+			}
 		}
 	}