commit d13c5b3

delthas  ·  2024-12-09 15:22:48 +0000 UTC
parent e6d6b9e
Make image preview timeouts more aggressive

We could previously wait up to 6 seconds for unresponsive hosts.
1 files changed,  +26, -14
M app.go
M app.go
+26, -14
 1@@ -917,7 +917,7 @@ func (app *App) handleChannelEvent(ev *events.EventClickChannel) {
 2 	}
 3 }
 4 
 5-var patternOpenGraphImage = regexp.MustCompile(`<meta property="og:image" content="(.*?)"/>`)
 6+var patternOpenGraphImage = regexp.MustCompile(`<meta property="og:image" content="(.*?)"/?>`)
 7 var patternOpenGraphVideo = regexp.MustCompile(`<meta property="og:video"`)
 8 
 9 func (app *App) fetchImage(link string) (image.Image, error) {
10@@ -934,10 +934,10 @@ func (app *App) fetchImage(link string) (image.Image, error) {
11 		}
12 	}
13 
14-	c := http.Client{
15-		Timeout: 6 * time.Second,
16+	cHead := http.Client{
17+		Timeout: 1500 * time.Millisecond,
18 	}
19-	res, err := c.Head(link)
20+	res, err := cHead.Head(link)
21 	if err != nil {
22 		return nil, err
23 	}
24@@ -956,12 +956,21 @@ func (app *App) fetchImage(link string) (image.Image, error) {
25 	default:
26 		return nil, fmt.Errorf("unexpected content type: %v", contentType)
27 	}
28-	res, err = c.Get(link)
29-	if err != nil {
30-		return nil, err
31-	}
32 	if isHTML {
33-		b, err := io.ReadAll(io.LimitReader(res.Body, 10*1024))
34+		req, err := http.NewRequest("GET", link, nil)
35+		if err != nil {
36+			return nil, err
37+		}
38+		var previewSize int64 = 10 * 1024
39+		if res.Header.Get("Accept-Ranges") == "bytes" {
40+			req.Header.Set("Range", fmt.Sprintf("bytes=0-%v", previewSize))
41+		}
42+		res, err = cHead.Get(link)
43+		if err != nil {
44+			return nil, err
45+		}
46+		b, err := io.ReadAll(io.LimitReader(res.Body, previewSize))
47+		res.Body.Close()
48 		if err != nil {
49 			return nil, fmt.Errorf("unexpected read error: %v", err)
50 		}
51@@ -973,11 +982,14 @@ func (app *App) fetchImage(link string) (image.Image, error) {
52 		if len(m) < 2 {
53 			return nil, fmt.Errorf("image embed not found")
54 		}
55-		imageLink := html.UnescapeString(string(m[1]))
56-		res, err = c.Get(imageLink)
57-		if err != nil {
58-			return nil, err
59-		}
60+		link = html.UnescapeString(string(m[1]))
61+	}
62+	cGet := http.Client{
63+		Timeout: 5 * time.Second,
64+	}
65+	res, err = cGet.Get(link)
66+	if err != nil {
67+		return nil, err
68 	}
69 	img, _, err := ui.DecodeImage(res.Body)
70 	res.Body.Close()