2022-07-14 18:07:07 +01:00
|
|
|
package pageHandler
|
|
|
|
|
|
|
|
import (
|
|
|
|
"golang.captainalm.com/cityuni-webserver/conf"
|
|
|
|
"net/http"
|
2022-07-14 23:25:43 +01:00
|
|
|
"strings"
|
|
|
|
"sync"
|
2022-07-14 18:07:07 +01:00
|
|
|
)
|
|
|
|
|
2022-07-14 23:25:43 +01:00
|
|
|
type PageHandler struct {
|
|
|
|
PageContentsCache map[string][]byte
|
|
|
|
PageProviders map[string]PageProvider
|
|
|
|
pageContentsCacheRWMutex *sync.RWMutex
|
|
|
|
RangeSupported bool
|
|
|
|
CacheSettings conf.CacheSettingsYaml
|
|
|
|
}
|
|
|
|
|
|
|
|
func NewPageHandler(config conf.ServeYaml) *PageHandler {
|
|
|
|
var thePCCMap map[string][]byte
|
|
|
|
var theMutex *sync.RWMutex
|
|
|
|
if config.CacheSettings.EnableContentsCaching {
|
|
|
|
thePCCMap = make(map[string][]byte)
|
|
|
|
theMutex = &sync.RWMutex{}
|
|
|
|
}
|
|
|
|
return &PageHandler{
|
|
|
|
PageContentsCache: thePCCMap,
|
|
|
|
PageProviders: GetProviders(config.CacheSettings.EnableTemplateCaching),
|
|
|
|
pageContentsCacheRWMutex: theMutex,
|
|
|
|
RangeSupported: config.RangeSupported,
|
|
|
|
CacheSettings: config.CacheSettings,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func (ph *PageHandler) ServeHTTP(writer http.ResponseWriter, request *http.Request) {
|
|
|
|
//Provide processing for requests using providers
|
|
|
|
}
|
|
|
|
|
|
|
|
func (ph *PageHandler) PurgeContentsCache(path string, query string) {
|
|
|
|
if ph.CacheSettings.EnableContentsCaching {
|
|
|
|
if path == "" {
|
|
|
|
ph.pageContentsCacheRWMutex.Lock()
|
|
|
|
ph.PageContentsCache = make(map[string][]byte)
|
|
|
|
ph.pageContentsCacheRWMutex.Unlock()
|
|
|
|
} else {
|
|
|
|
if strings.HasSuffix(path, "/") {
|
|
|
|
ph.pageContentsCacheRWMutex.RLock()
|
|
|
|
toDelete := make([]string, len(ph.PageContentsCache))
|
|
|
|
theSize := 0
|
|
|
|
for cPath := range ph.PageContentsCache {
|
|
|
|
dPath := strings.Split(cPath, "?")[0]
|
|
|
|
if dPath == path || dPath == path[:len(path)-1] {
|
|
|
|
toDelete[theSize] = cPath
|
|
|
|
theSize++
|
|
|
|
}
|
|
|
|
}
|
|
|
|
ph.pageContentsCacheRWMutex.RUnlock()
|
|
|
|
ph.pageContentsCacheRWMutex.Lock()
|
|
|
|
for i := 0; i < theSize; i++ {
|
|
|
|
delete(ph.PageContentsCache, toDelete[i])
|
|
|
|
}
|
|
|
|
ph.pageContentsCacheRWMutex.Unlock()
|
|
|
|
} else {
|
|
|
|
ph.pageContentsCacheRWMutex.Lock()
|
|
|
|
if query == "" {
|
|
|
|
delete(ph.PageContentsCache, path)
|
|
|
|
} else {
|
|
|
|
delete(ph.PageContentsCache, path+"?"+query)
|
|
|
|
}
|
|
|
|
ph.pageContentsCacheRWMutex.Unlock()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2022-07-14 18:07:07 +01:00
|
|
|
|
2022-07-14 23:25:43 +01:00
|
|
|
func (ph *PageHandler) PurgeTemplateCache(path string) {
|
|
|
|
if ph.CacheSettings.EnableTemplateCaching && ph.CacheSettings.EnableTemplateCachePurge {
|
|
|
|
if path == "" {
|
|
|
|
for _, pageProvider := range ph.PageProviders {
|
|
|
|
pageProvider.PurgeTemplate()
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
if pageProvider, ok := ph.PageProviders[path]; ok {
|
|
|
|
pageProvider.PurgeTemplate()
|
|
|
|
}
|
|
|
|
}
|
2022-07-14 18:07:07 +01:00
|
|
|
}
|
|
|
|
}
|