diff --git a/.gitignore b/.gitignore index 1dcd31b..52a9c61 100644 --- a/.gitignore +++ b/.gitignore @@ -16,3 +16,4 @@ go-jamming vangen *.sublime-workspace +.idea/* \ No newline at end of file diff --git a/.idea/go-jamming.iml b/.idea/go-jamming.iml index c956989..5e764c4 100644 --- a/.idea/go-jamming.iml +++ b/.idea/go-jamming.iml @@ -1,5 +1,6 @@ + diff --git a/app/webmention/send/discoverer.go b/app/webmention/send/discoverer.go index 19ad9c0..13d9e7b 100644 --- a/app/webmention/send/discoverer.go +++ b/app/webmention/send/discoverer.go @@ -4,6 +4,7 @@ import ( "brainbaking.com/go-jamming/rest" "fmt" "github.com/rs/zerolog/log" + "net/http" "net/url" "regexp" "strings" @@ -25,14 +26,32 @@ var ( "feed", "feed/index.xml", } + + possibleContentTypes = []string{ + "application/rss+xml", + "application/atom+xml", + "application/xml", + "text/xml", + "application/rdf+xml", + } ) +func isContentTypeFeedCompatible(header http.Header) bool { + cType := header.Get("Content-Type") + for _, possibleType := range possibleContentTypes { + if strings.Contains(cType, possibleType) { + return true + } + } + return false +} + func (sndr *Sender) discoverRssFeed(domain string) (string, error) { for _, endpt := range possibleFeedEndpoints { feedUrl := fmt.Sprintf("https://%s/%s", domain, endpt) resp, err := sndr.RestClient.Head(feedUrl) - if err != nil || !rest.IsStatusOk(resp) || resp.Header.Get("Content-Type") != "text/xml" { + if err != nil || !rest.IsStatusOk(resp) || !isContentTypeFeedCompatible(resp.Header) { continue } diff --git a/app/webmention/send/discoverer_test.go b/app/webmention/send/discoverer_test.go index 36c35cf..339b62b 100644 --- a/app/webmention/send/discoverer_test.go +++ b/app/webmention/send/discoverer_test.go @@ -10,6 +10,17 @@ import ( "testing" ) +func TestDiscoverRssFeedE2EBrainbaking(t *testing.T) { + var sender = &Sender{ + RestClient: &rest.HttpClient{}, + } + + link, err := sender.discoverRssFeed("brainbaking.com") + expectedUrl := "https://brainbaking.com/index.xml" + assert.Nil(t, err) + assert.Truef(t, strings.HasPrefix(link, expectedUrl), "should start with %s, but was %s", expectedUrl, link) +} + func TestDiscoverMentionEndpointE2EWithRedirect(t *testing.T) { t.Skip("Skipping TestDiscoverE2EWithRedirect, webmention.rocks is slow.") var sender = &Sender{