// Copyright (C) 2021 nytpu // SPDX-License-Identifier: AGPL-3.0-or-later // For more license details, see LICENSE or . package fetch import ( "bytes" "crypto/sha256" "fmt" "io" "net/url" "time" //"github.com/mmcdole/gofeed" "github.com/prologic/go-gopher" "golang.nytpu.com/comitium/core" ) // fetchGopher will make a request for a gopher resource func fetchGopher(remoteURL *url.URL) (*gopher.Response, error) { resp, err := gopher.Get(remoteURL.String()) if err != nil { return nil, err } return resp, nil } // newGopherFeed will fetch and create a new core.Feed given a gopher url func newGopherFeed(remoteURL *url.URL, title string) (*core.Feed, error) { // TODO return nil, fmt.Errorf("Feeds served over gopher are currently unsupported.") } // updateGopherFeed will check an existing core.Feed for updates func updateGopherFeed(*core.Feed) error { // TODO return fmt.Errorf("Feeds served over gopher are currently unsupported.") } // newGopherPage will create a new core.Page given a gopher url func newGopherPage(remoteURL *url.URL, title string) (*core.Page, error) { var page core.Page page.Title = title page.Link = remoteURL err := updateGopherPage(&page) if err != nil { return nil, err } return &page, nil } // updateGopherPage wll check an existing core.Page for changes func updateGopherPage(p *core.Page) error { resp, err := fetchGopher(p.Link) if err != nil { return err } defer resp.Body.Close() var reader io.Reader if len(resp.Dir.Items) > 0 { text, err := resp.Dir.ToText() if err != nil { return err } reader = io.LimitReader(bytes.NewReader(text), 1073741824) // 1 GiB } else { reader = io.LimitReader(resp.Body, 1073741824) // 1 GiB } h := sha256.New() if _, err := io.Copy(h, reader); err != nil { return err } newHash := fmt.Sprintf("%x", h.Sum(nil)) if newHash != p.Hash { p.Hash = newHash p.Updated = time.Now() } return nil }