Add caching for Fetch2
This commit is contained in:
parent
5e80ddddca
commit
ee2eb32b1c
|
|
@ -19,6 +19,8 @@
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"bufio"
|
||||||
|
"bytes"
|
||||||
"encoding/hex"
|
"encoding/hex"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
@ -38,7 +40,7 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
type cacheItem struct {
|
type cacheItem struct {
|
||||||
item *microformats.Data
|
item []byte
|
||||||
created time.Time
|
created time.Time
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -260,12 +262,37 @@ func Fetch2(fetchURL string) (*http.Response, error) {
|
||||||
return nil, fmt.Errorf("error parsing %s as url: %s", fetchURL, err)
|
return nil, fmt.Errorf("error parsing %s as url: %s", fetchURL, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
resp, err := http.Get(u.String())
|
req, err := http.NewRequest("GET", u.String(), nil)
|
||||||
|
|
||||||
|
if data, e := cache[u.String()]; e {
|
||||||
|
if data.created.After(time.Now().Add(time.Minute * -10)) {
|
||||||
|
log.Printf("HIT %s - %s\n", u.String(), time.Now().Sub(data.created).String())
|
||||||
|
rd := bufio.NewReader(bytes.NewReader(data.item))
|
||||||
|
return http.ReadResponse(rd, req)
|
||||||
|
} else {
|
||||||
|
log.Printf("EXPIRE %s\n", u.String())
|
||||||
|
delete(cache, u.String())
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
log.Printf("MISS %s\n", u.String())
|
||||||
|
}
|
||||||
|
|
||||||
|
client := http.Client{}
|
||||||
|
resp, err := client.Do(req)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("error while fetching %s: %s", u, err)
|
return nil, fmt.Errorf("error while fetching %s: %s", u, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return resp, err
|
var b bytes.Buffer
|
||||||
|
resp.Write(&b)
|
||||||
|
|
||||||
|
cachedCopy := make([]byte, b.Len())
|
||||||
|
cur := b.Bytes()
|
||||||
|
copy(cachedCopy, cur)
|
||||||
|
cache[u.String()] = cacheItem{item: cachedCopy, created: time.Now()}
|
||||||
|
|
||||||
|
cachedResp, err := http.ReadResponse(bufio.NewReader(bytes.NewReader(cachedCopy)), req)
|
||||||
|
return cachedResp, err
|
||||||
}
|
}
|
||||||
|
|
||||||
func Fetch(fetchURL string) []microsub.Item {
|
func Fetch(fetchURL string) []microsub.Item {
|
||||||
|
|
|
||||||
|
|
@ -417,6 +417,7 @@ func (b *memoryBackend) Search(query string) []microsub.Feed {
|
||||||
feeds := []microsub.Feed{}
|
feeds := []microsub.Feed{}
|
||||||
|
|
||||||
for _, u := range urls {
|
for _, u := range urls {
|
||||||
|
log.Println(u)
|
||||||
resp, err := Fetch2(u)
|
resp, err := Fetch2(u)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Printf("Error while fetching %s: %v\n", u, err)
|
log.Printf("Error while fetching %s: %v\n", u, err)
|
||||||
|
|
|
||||||
|
|
@ -68,7 +68,7 @@ func (b *NullBackend) FollowGetList(uid string) []microsub.Feed {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (b *NullBackend) FollowURL(uid string, url string) microsub.Feed {
|
func (b *NullBackend) FollowURL(uid string, url string) microsub.Feed {
|
||||||
return microsub.Feed{"feed", url}
|
return microsub.Feed{Type: "feed", URL: url}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (b *NullBackend) UnfollowURL(uid string, url string) {
|
func (b *NullBackend) UnfollowURL(uid string, url string) {
|
||||||
|
|
|
||||||
|
|
@ -38,8 +38,8 @@ type Channel struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
type Author struct {
|
type Author struct {
|
||||||
Filled bool `json:"-"`
|
Filled bool `json:"-,omitempty"`
|
||||||
Type string `json:"type"`
|
Type string `json:"type,omitempty"`
|
||||||
Name string `json:"name,omitempty"`
|
Name string `json:"name,omitempty"`
|
||||||
URL string `json:"url,omitempty"`
|
URL string `json:"url,omitempty"`
|
||||||
Photo string `json:"photo,omitempty"`
|
Photo string `json:"photo,omitempty"`
|
||||||
|
|
@ -86,8 +86,12 @@ type Timeline struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
type Feed struct {
|
type Feed struct {
|
||||||
Type string `json:"type"`
|
Type string `json:"type"`
|
||||||
URL string `json:"url"`
|
URL string `json:"url"`
|
||||||
|
Name string `json:"name,omitempty"`
|
||||||
|
Photo string `json:"photo,omitempty"`
|
||||||
|
Description string `json:"description,omitempty"`
|
||||||
|
Author Author `json:"author,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// Microsub is the main protocol that should be implemented by a backend
|
// Microsub is the main protocol that should be implemented by a backend
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user