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