// Copyright (C) 2021 nytpu // SPDX-License-Identifier: AGPL-3.0-or-later // For more license details, see LICENSE or . // package fetch implements routines for fetching gemini, gopher, and http // resources and parsing feed formats package fetch import ( "fmt" "net/url" "reflect" "golang.nytpu.com/comitium/core" ) // Feed will fetch and insert a new core.Feed into a core.FullData given any url // (or update if it's preexisting) func Feed(data *core.FullData, remote *url.URL, title string) error { switch remote.Scheme { case "gemini": return geminiFeed(data, remote, title) case "http", "https": return httpFeed(data, remote, title) case "gopher", "gophers": return gopherFeed(data, remote, title) default: return fmt.Errorf("Unsupported protocol '%s'", remote.Scheme) } } // Page will fetch and insert a new core.Page into a core.FullData given any url // (or update if it's preexisting) func Page(data *core.FullData, remote *url.URL, title string) error { switch remote.Scheme { case "gemini": return geminiPage(data, remote, title) case "http", "https": return httpPage(data, remote, title) case "gopher", "gophers": return gopherPage(data, remote, title) default: return fmt.Errorf("Unsupported protocol '%s'", remote.Scheme) } } // InsertFeed will insert or update a core.Feed in a core.FullData func InsertFeed(data *core.FullData, new *core.Feed, remote *url.URL) { data.FeedsMu.Lock() oldFeed, ok := data.Feeds[*remote] if !ok || !reflect.DeepEqual(new, oldFeed) { // Feeds are different, or there was never an old one data.Feeds[*remote] = new data.FeedsMu.Unlock() } else { data.FeedsMu.Unlock() } } // InsertFeed will insert or update a core.Page in a core.FullData func InsertPage(data *core.FullData, new *core.Page, remote *url.URL) { data.PagesMu.Lock() _, ok := data.Pages[*remote] if !ok || data.Pages[*remote].Hash != new.Hash { // pages are different, or there was never an old one data.Pages[*remote] = new data.PagesMu.Unlock() } else { data.PagesMu.Unlock() } }