Blame


1 635ade7f 2024-04-10 o package lemmy
2 635ade7f 2024-04-10 o
3 635ade7f 2024-04-10 o import (
4 635ade7f 2024-04-10 o "fmt"
5 635ade7f 2024-04-10 o "net/http"
6 635ade7f 2024-04-10 o "strconv"
7 635ade7f 2024-04-10 o "strings"
8 635ade7f 2024-04-10 o "sync"
9 635ade7f 2024-04-10 o "time"
10 635ade7f 2024-04-10 o )
11 635ade7f 2024-04-10 o
12 635ade7f 2024-04-10 o type cache struct {
13 635ade7f 2024-04-10 o post map[int]entry
14 635ade7f 2024-04-10 o community map[string]entry
15 635ade7f 2024-04-10 o mu *sync.Mutex
16 635ade7f 2024-04-10 o }
17 635ade7f 2024-04-10 o
18 635ade7f 2024-04-10 o type entry struct {
19 635ade7f 2024-04-10 o post Post
20 635ade7f 2024-04-10 o community Community
21 635ade7f 2024-04-10 o expiry time.Time
22 635ade7f 2024-04-10 o }
23 635ade7f 2024-04-10 o
24 635ade7f 2024-04-10 o func (c *cache) store(p Post, com Community, dur time.Duration) {
25 635ade7f 2024-04-10 o c.mu.Lock()
26 635ade7f 2024-04-10 o defer c.mu.Unlock()
27 635ade7f 2024-04-10 o t := time.Now().Add(dur)
28 635ade7f 2024-04-10 o entry := entry{expiry: t}
29 635ade7f 2024-04-10 o if p.Name() != "" {
30 635ade7f 2024-04-10 o entry.post = p
31 635ade7f 2024-04-10 o c.post[p.ID] = entry
32 635ade7f 2024-04-10 o }
33 635ade7f 2024-04-10 o if com.Name() != "" {
34 635ade7f 2024-04-10 o entry.community = com
35 635ade7f 2024-04-10 o c.community[com.Name()] = entry
36 635ade7f 2024-04-10 o }
37 635ade7f 2024-04-10 o }
38 635ade7f 2024-04-10 o
39 635ade7f 2024-04-10 o func (c *cache) delete(p Post, com Community) {
40 635ade7f 2024-04-10 o c.mu.Lock()
41 635ade7f 2024-04-10 o defer c.mu.Unlock()
42 635ade7f 2024-04-10 o delete(c.post, p.ID)
43 635ade7f 2024-04-10 o delete(c.community, com.Name())
44 635ade7f 2024-04-10 o }
45 635ade7f 2024-04-10 o
46 635ade7f 2024-04-10 o // max-age=50
47 635ade7f 2024-04-10 o func parseMaxAge(s string) (time.Duration, error) {
48 635ade7f 2024-04-10 o var want string
49 635ade7f 2024-04-10 o elems := strings.Split(s, ",")
50 635ade7f 2024-04-10 o for i := range elems {
51 635ade7f 2024-04-10 o elems[i] = strings.TrimSpace(elems[i])
52 635ade7f 2024-04-10 o if strings.HasPrefix(elems[i], "max-age") {
53 635ade7f 2024-04-10 o want = elems[i]
54 635ade7f 2024-04-10 o }
55 635ade7f 2024-04-10 o }
56 635ade7f 2024-04-10 o _, num, found := strings.Cut(want, "=")
57 635ade7f 2024-04-10 o if !found {
58 635ade7f 2024-04-10 o return 0, fmt.Errorf("missing = separator")
59 635ade7f 2024-04-10 o }
60 635ade7f 2024-04-10 o n, err := strconv.Atoi(num)
61 635ade7f 2024-04-10 o if err != nil {
62 635ade7f 2024-04-10 o return 0, fmt.Errorf("parse seconds: %w", err)
63 635ade7f 2024-04-10 o }
64 635ade7f 2024-04-10 o return time.Duration(n) * time.Second, nil
65 635ade7f 2024-04-10 o }
66 635ade7f 2024-04-10 o
67 635ade7f 2024-04-10 o // Cache-Control: public, max-age=50
68 635ade7f 2024-04-10 o func extractMaxAge(header http.Header) string {
69 635ade7f 2024-04-10 o cc := header.Get("Cache-Control")
70 635ade7f 2024-04-10 o if !strings.Contains(cc, "max-age=") {
71 635ade7f 2024-04-10 o return ""
72 635ade7f 2024-04-10 o }
73 635ade7f 2024-04-10 o return cc
74 635ade7f 2024-04-10 o }