nandi/gleanpublic Fork 0
bd2dd69
Commits
Clone
git clone https://git.rickub.com/nandi/glean.git
git clone ssh://git@rickub.com/nandi/glean.git

Host key fingerprint (ed25519): SHA256:iycHnxEyq0Q7uyVpB7JlznP0G7JrTPXLYRcAU5CSLhc — verify it before your first connect.

Fix favicon issue hanging fetcherUnverified

Julien Robert committed 2026-04-24T02:17:05+02:00 Browse files
bd2dd69 parent: 2bc4161
modified internal/feed/discover.go +11 -0
@@ -7,6 +7,7 @@ import (
77 "net/url"
88 "regexp"
99 "strings"
10+ "sync"
1011 "time"
1112
1213 "pkg.rbrt.fr/glean/internal/httpclient"
@@ -117,8 +118,11 @@ func findFavicon(ctx context.Context, base *url.URL, links []string) string {
117118 ctx, cancel := context.WithCancel(ctx)
118119 defer cancel()
119120
121+ var wg sync.WaitGroup
120122 for _, path := range faviconPaths {
123+ wg.Add(1)
121124 go func(path string) {
125+ defer wg.Done()
122126 u, _ := url.Parse(path)
123127 resolved := origin.ResolveReference(u)
124128 req, err := http.NewRequestWithContext(ctx, http.MethodGet, resolved.String(), nil)
@@ -140,11 +144,18 @@ func findFavicon(ctx context.Context, base *url.URL, links []string) string {
140144 }(path)
141145 }
142146
147+ done := make(chan struct{})
148+ go func() {
149+ wg.Wait()
150+ close(done)
151+ }()
152+
143153 select {
144154 case r := <-found:
145155 if r.found {
146156 return r.url
147157 }
158+ case <-done:
148159 case <-ctx.Done():
149160 }
150161 return ""
@@ -7,6 +7,7 @@ import (
7 "net/url"7 "net/url"
8 "regexp"8 "regexp"
9 "strings"9 "strings"
10+ "sync"
10 "time"11 "time"
11 12
12 "pkg.rbrt.fr/glean/internal/httpclient"13 "pkg.rbrt.fr/glean/internal/httpclient"
@@ -117,8 +118,11 @@ func findFavicon(ctx context.Context, base *url.URL, links []string) string {
117 ctx, cancel := context.WithCancel(ctx)118 ctx, cancel := context.WithCancel(ctx)
118 defer cancel()119 defer cancel()
119 120
121+ var wg sync.WaitGroup
120 for _, path := range faviconPaths {122 for _, path := range faviconPaths {
123+ wg.Add(1)
121 go func(path string) {124 go func(path string) {
125+ defer wg.Done()
122 u, _ := url.Parse(path)126 u, _ := url.Parse(path)
123 resolved := origin.ResolveReference(u)127 resolved := origin.ResolveReference(u)
124 req, err := http.NewRequestWithContext(ctx, http.MethodGet, resolved.String(), nil)128 req, err := http.NewRequestWithContext(ctx, http.MethodGet, resolved.String(), nil)
@@ -140,11 +144,18 @@ func findFavicon(ctx context.Context, base *url.URL, links []string) string {
140 }(path)144 }(path)
141 }145 }
142 146
147+ done := make(chan struct{})
148+ go func() {
149+ wg.Wait()
150+ close(done)
151+ }()
152+
143 select {153 select {
144 case r := <-found:154 case r := <-found:
145 if r.found {155 if r.found {
146 return r.url156 return r.url
147 }157 }
158+ case <-done:
148 case <-ctx.Done():159 case <-ctx.Done():
149 }160 }
150 return ""161 return ""
modified internal/feed/fetcher.go +1 -1
@@ -209,7 +209,7 @@ func (s *Scheduler) FetchFeed(ctx context.Context, feed *Feed) {
209209
210210 faviconURL := result.Feed.FaviconURL
211211 if faviconURL == "" && feed.FaviconURL == "" {
212- faviconURL = ResolveFavicon(context.Background(), feed.URL, feed.SiteURL)
212+ faviconURL = ResolveFavicon(ctx, feed.URL, feed.SiteURL)
213213 }
214214
215215 if err := s.store.StoreFetchResult(ctx, feed.URL, result.Articles, faviconURL); err != nil {
@@ -209,7 +209,7 @@ func (s *Scheduler) FetchFeed(ctx context.Context, feed *Feed) {
209 209
210 faviconURL := result.Feed.FaviconURL210 faviconURL := result.Feed.FaviconURL
211 if faviconURL == "" && feed.FaviconURL == "" {211 if faviconURL == "" && feed.FaviconURL == "" {
212- faviconURL = ResolveFavicon(context.Background(), feed.URL, feed.SiteURL)212+ faviconURL = ResolveFavicon(ctx, feed.URL, feed.SiteURL)
213 }213 }
214 214
215 if err := s.store.StoreFetchResult(ctx, feed.URL, result.Articles, faviconURL); err != nil {215 if err := s.store.StoreFetchResult(ctx, feed.URL, result.Articles, faviconURL); err != nil {