rehome plugin hyperdrive to extend instead of main in the package def

clean up plugin hyperdrive
This commit is contained in:
Azareal 2020-04-13 15:55:13 +10:00
parent 584a50b461
commit b67b95ce98
1 changed files with 82 additions and 82 deletions

View File

@ -1,16 +1,16 @@
// Highly experimental plugin for caching rendered pages for guests // Highly experimental plugin for caching rendered pages for guests
package main package extend
import ( import (
//"log" //"log"
"bytes" "bytes"
"errors" "errors"
"strings"
"strconv"
"time"
"sync/atomic"
"net/http" "net/http"
"net/http/httptest" "net/http/httptest"
"strconv"
"strings"
"sync/atomic"
"time"
c "github.com/Azareal/Gosora/common" c "github.com/Azareal/Gosora/common"
"github.com/Azareal/Gosora/routes" "github.com/Azareal/Gosora/routes"
@ -22,35 +22,35 @@ func init() {
c.Plugins.Add(&c.Plugin{UName: "hyperdrive", Name: "Hyperdrive", Author: "Azareal", Init: initHdrive, Deactivate: deactivateHdrive}) c.Plugins.Add(&c.Plugin{UName: "hyperdrive", Name: "Hyperdrive", Author: "Azareal", Init: initHdrive, Deactivate: deactivateHdrive})
} }
func initHdrive(plugin *c.Plugin) error { func initHdrive(pl *c.Plugin) error {
hyperspace = newHyperspace() hyperspace = newHyperspace()
plugin.AddHook("tasks_tick_topic_list",tickHdrive) pl.AddHook("tasks_tick_topic_list", tickHdrive)
plugin.AddHook("tasks_tick_widget_wol",tickHdriveWol) pl.AddHook("tasks_tick_widget_wol", tickHdriveWol)
plugin.AddHook("route_topic_list_start",jumpHdriveTopicList) pl.AddHook("route_topic_list_start", jumpHdriveTopicList)
plugin.AddHook("route_forum_list_start",jumpHdriveForumList) pl.AddHook("route_forum_list_start", jumpHdriveForumList)
tickHdrive() tickHdrive()
return nil return nil
} }
func deactivateHdrive(plugin *c.Plugin) { func deactivateHdrive(pl *c.Plugin) {
plugin.RemoveHook("tasks_tick_topic_list",tickHdrive) pl.RemoveHook("tasks_tick_topic_list", tickHdrive)
plugin.RemoveHook("tasks_tick_widget_wol",tickHdriveWol) pl.RemoveHook("tasks_tick_widget_wol", tickHdriveWol)
plugin.RemoveHook("route_topic_list_start",jumpHdriveTopicList) pl.RemoveHook("route_topic_list_start", jumpHdriveTopicList)
plugin.RemoveHook("route_forum_list_start",jumpHdriveForumList) pl.RemoveHook("route_forum_list_start", jumpHdriveForumList)
hyperspace = nil hyperspace = nil
} }
type Hyperspace struct { type Hyperspace struct {
topicList atomic.Value topicList atomic.Value
gzipTopicList atomic.Value gzipTopicList atomic.Value
forumList atomic.Value forumList atomic.Value
gzipForumList atomic.Value gzipForumList atomic.Value
lastTopicListUpdate atomic.Value lastTopicListUpdate atomic.Value
} }
func newHyperspace() *Hyperspace { func newHyperspace() *Hyperspace {
pageCache := new(Hyperspace) pageCache := new(Hyperspace)
blank := make(map[string][]byte,len(c.Themes)) blank := make(map[string][]byte, len(c.Themes))
pageCache.topicList.Store(blank) pageCache.topicList.Store(blank)
pageCache.gzipTopicList.Store(blank) pageCache.gzipTopicList.Store(blank)
pageCache.forumList.Store(blank) pageCache.forumList.Store(blank)
@ -69,7 +69,7 @@ func tickHdrive(args ...interface{}) (skip bool, rerr c.RouteError) {
c.DebugLog("Refueling...") c.DebugLog("Refueling...")
// Avoid accidentally caching already cached content // Avoid accidentally caching already cached content
blank := make(map[string][]byte,len(c.Themes)) blank := make(map[string][]byte, len(c.Themes))
hyperspace.topicList.Store(blank) hyperspace.topicList.Store(blank)
hyperspace.gzipTopicList.Store(blank) hyperspace.gzipTopicList.Store(blank)
hyperspace.forumList.Store(blank) hyperspace.forumList.Store(blank)
@ -80,69 +80,69 @@ func tickHdrive(args ...interface{}) (skip bool, rerr c.RouteError) {
fListMap := make(map[string][]byte) fListMap := make(map[string][]byte)
gfListMap := make(map[string][]byte) gfListMap := make(map[string][]byte)
var cacheTheme = func(tname string) (skip bool, fail bool, rerr c.RouteError) { cacheTheme := func(tname string) (skip, fail bool, rerr c.RouteError) {
themeCookie := http.Cookie{Name: "current_theme", Value: tname, Path: "/", MaxAge: c.Year} themeCookie := http.Cookie{Name: "current_theme", Value: tname, Path: "/", MaxAge: c.Year}
w := httptest.NewRecorder() w := httptest.NewRecorder()
req := httptest.NewRequest("get", "/topics/", bytes.NewReader(nil)) req := httptest.NewRequest("get", "/topics/", bytes.NewReader(nil))
req.AddCookie(&themeCookie) req.AddCookie(&themeCookie)
user := c.GuestUser user := c.GuestUser
head, rerr := c.UserCheck(w, req, &user) head, rerr := c.UserCheck(w, req, &user)
if rerr != nil { if rerr != nil {
return true, true, rerr return true, true, rerr
} }
rerr = routes.TopicList(w, req, user, head)
if rerr != nil {
return true, true, rerr
}
if w.Code != 200 {
c.LogWarning(errors.New("not 200 for topic list in hyperdrive"))
return false, true, nil
}
buf := new(bytes.Buffer) rerr = routes.TopicList(w, req, &user, head)
buf.ReadFrom(w.Result().Body) if rerr != nil {
tListMap[tname] = buf.Bytes() return true, true, rerr
}
if w.Code != 200 {
c.LogWarning(errors.New("not 200 for topic list in hyperdrive"))
return false, true, nil
}
gbuf, err := c.CompressBytesGzip(buf.Bytes()) buf := new(bytes.Buffer)
if err != nil { buf.ReadFrom(w.Result().Body)
c.LogWarning(err) tListMap[tname] = buf.Bytes()
return false, true, nil
}
gtListMap[tname] = gbuf
w = httptest.NewRecorder() gbuf, err := c.CompressBytesGzip(buf.Bytes())
req = httptest.NewRequest("get", "/forums/", bytes.NewReader(nil)) if err != nil {
user = c.GuestUser c.LogWarning(err)
return false, true, nil
}
gtListMap[tname] = gbuf
head, rerr = c.UserCheck(w, req, &user) w = httptest.NewRecorder()
if rerr != nil { req = httptest.NewRequest("get", "/forums/", bytes.NewReader(nil))
return true, true, rerr user = c.GuestUser
}
rerr = routes.ForumList(w, req, user, head) head, rerr = c.UserCheck(w, req, &user)
if rerr != nil { if rerr != nil {
return true, true, rerr return true, true, rerr
} }
if w.Code != 200 {
c.LogWarning(errors.New("not 200 for forum list in hyperdrive"))
return false, true, nil
}
buf = new(bytes.Buffer) rerr = routes.ForumList(w, req, &user, head)
buf.ReadFrom(w.Result().Body) if rerr != nil {
fListMap[tname] = buf.Bytes() return true, true, rerr
}
if w.Code != 200 {
c.LogWarning(errors.New("not 200 for forum list in hyperdrive"))
return false, true, nil
}
gbuf, err = c.CompressBytesGzip(buf.Bytes()) buf = new(bytes.Buffer)
if err != nil { buf.ReadFrom(w.Result().Body)
c.LogWarning(err) fListMap[tname] = buf.Bytes()
return false, true, nil
} gbuf, err = c.CompressBytesGzip(buf.Bytes())
gfListMap[tname] = gbuf if err != nil {
return false, false, nil c.LogWarning(err)
return false, true, nil
}
gfListMap[tname] = gbuf
return false, false, nil
} }
for tname, _ := range c.Themes { for tname, _ := range c.Themes {
@ -157,7 +157,7 @@ func tickHdrive(args ...interface{}) (skip bool, rerr c.RouteError) {
hyperspace.forumList.Store(fListMap) hyperspace.forumList.Store(fListMap)
hyperspace.gzipForumList.Store(gfListMap) hyperspace.gzipForumList.Store(gfListMap)
hyperspace.lastTopicListUpdate.Store(time.Now().Unix()) hyperspace.lastTopicListUpdate.Store(time.Now().Unix())
return false, nil return false, nil
} }
@ -175,7 +175,7 @@ func jumpHdriveForumList(args ...interface{}) (skip bool, rerr c.RouteError) {
return jumpHdrive(pg[theme.Name], p[theme.Name], args) return jumpHdrive(pg[theme.Name], p[theme.Name], args)
} }
func jumpHdrive(pg []byte, p []byte, args []interface{}) (skip bool, rerr c.RouteError) { func jumpHdrive(pg, p []byte, args []interface{}) (skip bool, rerr c.RouteError) {
var tList []byte var tList []byte
w := args[0].(http.ResponseWriter) w := args[0].(http.ResponseWriter)
var iw http.ResponseWriter var iw http.ResponseWriter
@ -199,7 +199,7 @@ func jumpHdrive(pg []byte, p []byte, args []interface{}) (skip bool, rerr c.Rout
c.DebugLog("not guest") c.DebugLog("not guest")
return false, nil return false, nil
} }
// Avoid intercepting search requests and filters as we don't have those in cache // Avoid intercepting search requests and filters as we don't have those in cache
r := args[1].(*http.Request) r := args[1].(*http.Request)
//c.DebugLog("r.URL.Path:",r.URL.Path) //c.DebugLog("r.URL.Path:",r.URL.Path)
@ -215,12 +215,12 @@ func jumpHdrive(pg []byte, p []byte, args []interface{}) (skip bool, rerr c.Rout
var etag string var etag string
lastUpdate := hyperspace.lastTopicListUpdate.Load().(int64) lastUpdate := hyperspace.lastTopicListUpdate.Load().(int64)
c.DebugLog("lastUpdate:",lastUpdate) c.DebugLog("lastUpdate:", lastUpdate)
if ok { if ok {
iw.Header().Set("X-I","1") iw.Header().Set("X-I", "1")
etag = "\""+strconv.FormatInt(lastUpdate, 10)+"-g\"" etag = "\"" + strconv.FormatInt(lastUpdate, 10) + "-g\""
} else { } else {
etag = "\""+strconv.FormatInt(lastUpdate, 10)+"\"" etag = "\"" + strconv.FormatInt(lastUpdate, 10) + "\""
} }
if lastUpdate != 0 { if lastUpdate != 0 {
@ -238,4 +238,4 @@ func jumpHdrive(pg []byte, p []byte, args []interface{}) (skip bool, rerr c.Rout
iw.Write(tList) iw.Write(tList)
return true, nil return true, nil
} }