From ee43bf108447f1264fb1ebaac7a0e1f6e0b06a81 Mon Sep 17 00:00:00 2001 From: nytpu Date: Thu, 18 Mar 2021 15:08:24 -0600 Subject: [PATCH] implement atom/rss/json feeds over gopher. TODO: write gophermap->gemtext mapper so the same gemini feed parser can be used on both. --- fetch/gopher.go | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/fetch/gopher.go b/fetch/gopher.go index 5fe24ad..9fbcfe0 100644 --- a/fetch/gopher.go +++ b/fetch/gopher.go @@ -11,6 +11,7 @@ import ( "io" "time" + "github.com/mmcdole/gofeed" "github.com/prologic/go-gopher" "golang.nytpu.com/comitium/core" @@ -28,8 +29,28 @@ func fetchGopher(remote string) (*gopher.Response, error) { // gopherFeed will fetch and insert a new core.Feed into a core.FullData given a // gopher url (or update if it's preexisting) func gopherFeed(data *core.FullData, remote string, title string) error { - // TODO - return fmt.Errorf("Feeds served over gopher are currently unsupported.") + resp, err := fetchGopher(remote) + if err != nil { + return err + } + defer resp.Body.Close() + + if len(resp.Dir.Items) != 0 { + // TODO + return fmt.Errorf("Gemini-style feeds served over gopher are currently unsupported.") + } + + reader := io.LimitReader(resp.Body, 1073741824) // 1 GiB + gofeed, err := gofeed.NewParser().Parse(reader) + if err != nil { + return err + } + feed, err := core.GofeedConvert(gofeed, title) + if err != nil { + return err + } + data.InsertFeed(feed, remote) + return nil } // gopherPage will fetch and insert a new core.Page into a core.FullData given a