#6 - fetch feed

This commit is contained in:
2025-03-11 12:41:15 +02:00
parent e74d33ab55
commit 5a7fac748b
3 changed files with 88 additions and 0 deletions

View File

@@ -0,0 +1,30 @@
package handlers
import (
"context"
"fmt"
"github.com/rdarius/boot-dev-blog-aggregator/internal/config"
"github.com/rdarius/boot-dev-blog-aggregator/internal/rss"
"os"
)
func FetchFeedHandler(s *config.State, cmd config.Command) error {
var feedUrl string
if len(cmd.Args) < 1 {
feedUrl = "https://www.wagslane.dev/index.xml"
} else {
feedUrl = cmd.Args[0]
}
ctx := context.Background()
feed, err := rss.FetchFeed(ctx, feedUrl)
if err != nil {
fmt.Println("Failed to fetch feed")
os.Exit(1)
}
fmt.Printf("%v", feed)
return nil
}

57
internal/rss/rss.go Normal file
View File

@@ -0,0 +1,57 @@
package rss
import (
"context"
"encoding/xml"
"html"
"io"
"net/http"
)
type Feed struct {
Channel struct {
Title string `xml:"title"`
Link string `xml:"link"`
Description string `xml:"description"`
Item []Item `xml:"item"`
} `xml:"channel"`
}
type Item struct {
Title string `xml:"title"`
Link string `xml:"link"`
Description string `xml:"description"`
PubDate string `xml:"pubDate"`
}
func FetchFeed(ctx context.Context, feedURL string) (*Feed, error) {
req, err := http.NewRequestWithContext(ctx, "GET", feedURL, nil)
if err != nil {
return nil, err
}
req.Header.Set("User-Agent", "gator")
resp, err := http.DefaultClient.Do(req)
if err != nil {
return nil, err
}
defer resp.Body.Close()
res, err := io.ReadAll(resp.Body)
if err != nil {
return nil, err
}
var feed Feed
err = xml.Unmarshal(res, &feed)
if err != nil {
return nil, err
}
feed.Channel.Title = html.UnescapeString(feed.Channel.Title)
feed.Channel.Link = html.UnescapeString(feed.Channel.Link)
feed.Channel.Description = html.UnescapeString(feed.Channel.Description)
for i, _ := range feed.Channel.Item {
feed.Channel.Item[i].Link = html.UnescapeString(feed.Channel.Item[i].Link)
feed.Channel.Item[i].Description = html.UnescapeString(feed.Channel.Item[i].Description)
feed.Channel.Item[i].PubDate = html.UnescapeString(feed.Channel.Item[i].PubDate)
feed.Channel.Item[i].Title = html.UnescapeString(feed.Channel.Item[i].Title)
}
return &feed, nil
}

View File

@@ -35,6 +35,7 @@ func main() {
commands.Register("register", handlers.RegisterHandler)
commands.Register("reset", handlers.ResetUsersHandler)
commands.Register("users", handlers.GetUsersHandler)
commands.Register("agg", handlers.FetchFeedHandler)
if len(os.Args) < 2 {
log.Fatal("usage: boot-dev-blog-aggregator <command> [args...]")