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()