diff options
| author | nytpu <alex@nytpu.com> | 2021-03-18 15:08:24 -0600 |
|---|---|---|
| committer | nytpu <alex@nytpu.com> | 2021-03-18 15:08:24 -0600 |
| commit | ee43bf108447f1264fb1ebaac7a0e1f6e0b06a81 (patch) | |
| tree | 3158153aa9cd61b7ca51caf3fa5e510deeb432b2 /fetch | |
| parent | 8dfb63e640603d444c81e657bc0045178144e2a0 (diff) | |
implement atom/rss/json feeds over gopher.
TODO: write gophermap->gemtext mapper so the same gemini feed parser can
be used on both.
Diffstat (limited to 'fetch')
| -rw-r--r-- | fetch/gopher.go | 25 |
1 files 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 |
