summaryrefslogtreecommitdiff
path: root/fetch/gopher.go
diff options
context:
space:
mode:
Diffstat (limited to 'fetch/gopher.go')
-rw-r--r--fetch/gopher.go25
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