fix: split out the botscraper response cache from the web app

This commit is contained in:
Gabe Kangas 2023-12-10 18:14:26 -08:00
parent c8985093fb
commit 0827af6cc8
No known key found for this signature in database
GPG key ID: 4345B2060657F330
2 changed files with 39 additions and 5 deletions

View file

@ -20,7 +20,7 @@ import (
) )
var ( var (
cacheAdapter *cache.Adapter hlsCacheAdapter *cache.Adapter
hlsResponseCache *cache.Client hlsResponseCache *cache.Client
) )
@ -40,13 +40,13 @@ func HandleHLSRequest(w http.ResponseWriter, r *http.Request) {
return return
} }
if cacheAdapter == nil { if hlsCacheAdapter == nil {
ca, err := memory.NewAdapter( ca, err := memory.NewAdapter(
memory.AdapterWithAlgorithm(memory.LFU), memory.AdapterWithAlgorithm(memory.LFU),
memory.AdapterWithCapacity(50), memory.AdapterWithCapacity(50),
memory.AdapterWithStorageCapacity(104_857_600), memory.AdapterWithStorageCapacity(104_857_600),
) )
cacheAdapter = &ca hlsCacheAdapter = &ca
if err != nil { if err != nil {
log.Warn("unable to create web cache", err) log.Warn("unable to create web cache", err)
} }
@ -56,7 +56,7 @@ func HandleHLSRequest(w http.ResponseWriter, r *http.Request) {
// individual segments for a long time. // individual segments for a long time.
if hlsResponseCache == nil { if hlsResponseCache == nil {
rc, err := cache.NewClient( rc, err := cache.NewClient(
cache.ClientWithAdapter(*cacheAdapter), cache.ClientWithAdapter(*hlsCacheAdapter),
cache.ClientWithTTL(30*time.Second), cache.ClientWithTTL(30*time.Second),
cache.ClientWithExpiresHeader(), cache.ClientWithExpiresHeader(),
) )

View file

@ -7,6 +7,7 @@ import (
"net/url" "net/url"
"path/filepath" "path/filepath"
"strings" "strings"
"time"
"github.com/owncast/owncast/config" "github.com/owncast/owncast/config"
"github.com/owncast/owncast/core" "github.com/owncast/owncast/core"
@ -16,12 +17,45 @@ import (
"github.com/owncast/owncast/static" "github.com/owncast/owncast/static"
"github.com/owncast/owncast/utils" "github.com/owncast/owncast/utils"
log "github.com/sirupsen/logrus" log "github.com/sirupsen/logrus"
cache "github.com/victorspringer/http-cache"
"github.com/victorspringer/http-cache/adapter/memory"
)
var (
indexCacheAdapter *cache.Adapter
indexBotSearchCache *cache.Client
) )
// IndexHandler handles the default index route. // IndexHandler handles the default index route.
func IndexHandler(w http.ResponseWriter, r *http.Request) { func IndexHandler(w http.ResponseWriter, r *http.Request) {
middleware.EnableCors(w) middleware.EnableCors(w)
if indexCacheAdapter == nil {
ca, err := memory.NewAdapter(
memory.AdapterWithAlgorithm(memory.LFU),
memory.AdapterWithCapacity(50),
memory.AdapterWithStorageCapacity(104_857_600),
)
indexCacheAdapter = &ca
if err != nil {
log.Warn("unable to create web cache", err)
}
}
if indexBotSearchCache == nil {
rc, err := cache.NewClient(
cache.ClientWithAdapter(*indexCacheAdapter),
cache.ClientWithTTL(30*time.Second),
cache.ClientWithExpiresHeader(),
cache.ClientWithRefreshKey("bot-search-page"),
cache.ClientWithExpiresHeader(),
)
indexBotSearchCache = rc
if err != nil {
log.Warn("unable to create web cache client", err)
}
}
isIndexRequest := r.URL.Path == "/" || filepath.Base(r.URL.Path) == "index.html" || filepath.Base(r.URL.Path) == "" isIndexRequest := r.URL.Path == "/" || filepath.Base(r.URL.Path) == "index.html" || filepath.Base(r.URL.Path) == ""
if utils.IsUserAgentAPlayer(r.UserAgent()) && isIndexRequest { if utils.IsUserAgentAPlayer(r.UserAgent()) && isIndexRequest {
@ -32,7 +66,7 @@ func IndexHandler(w http.ResponseWriter, r *http.Request) {
// For search engine bots and social scrapers return a special // For search engine bots and social scrapers return a special
// server-rendered page. // server-rendered page.
if utils.IsUserAgentABot(r.UserAgent()) && isIndexRequest { if utils.IsUserAgentABot(r.UserAgent()) && isIndexRequest {
handleScraperMetadataPage(w, r) indexBotSearchCache.Middleware(http.HandlerFunc(handleScraperMetadataPage))
return return
} }