rehome plugin hyperdrive to extend instead of main in the package def
clean up plugin hyperdrive
This commit is contained in:
parent
584a50b461
commit
b67b95ce98
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue