diff --git a/admin_test.go b/admin_test.go index 539837cf..71cc209e 100644 --- a/admin_test.go +++ b/admin_test.go @@ -52,6 +52,8 @@ func oldMap() M { m["BConfig.WebConfig.DirectoryIndex"] = BConfig.WebConfig.DirectoryIndex m["BConfig.WebConfig.StaticDir"] = BConfig.WebConfig.StaticDir m["BConfig.WebConfig.StaticExtensionsToGzip"] = BConfig.WebConfig.StaticExtensionsToGzip + m["BConfig.WebConfig.StaticCacheFileSize"] = BConfig.WebConfig.StaticCacheFileSize + m["BConfig.WebConfig.StaticCacheFileNum"] = BConfig.WebConfig.StaticCacheFileNum m["BConfig.WebConfig.TemplateLeft"] = BConfig.WebConfig.TemplateLeft m["BConfig.WebConfig.TemplateRight"] = BConfig.WebConfig.TemplateRight m["BConfig.WebConfig.ViewsPath"] = BConfig.WebConfig.ViewsPath diff --git a/config.go b/config.go index 7969dcea..72b8a333 100644 --- a/config.go +++ b/config.go @@ -81,6 +81,8 @@ type WebConfig struct { DirectoryIndex bool StaticDir map[string]string StaticExtensionsToGzip []string + StaticCacheFileSize int + StaticCacheFileNum int TemplateLeft string TemplateRight string ViewsPath string @@ -236,6 +238,8 @@ func newBConfig() *Config { DirectoryIndex: false, StaticDir: map[string]string{"/static": "static"}, StaticExtensionsToGzip: []string{".css", ".js"}, + StaticCacheFileSize: 1024 * 100, + StaticCacheFileNum: 1000, TemplateLeft: "{{", TemplateRight: "}}", ViewsPath: "views", @@ -317,6 +321,14 @@ func assignConfig(ac config.Configer) error { } } + if sfs, err := ac.Int("StaticCacheFileSize"); err == nil { + BConfig.WebConfig.StaticCacheFileSize = sfs + } + + if sfn, err := ac.Int("StaticCacheFileNum"); err == nil { + BConfig.WebConfig.StaticCacheFileNum = sfn + } + if lo := ac.String("LogOutputs"); lo != "" { // if lo is not nil or empty // means user has set his own LogOutputs diff --git a/config_test.go b/config_test.go index 53411b01..5f71f1c3 100644 --- a/config_test.go +++ b/config_test.go @@ -115,6 +115,8 @@ func TestAssignConfig_03(t *testing.T) { ac.Set("RunMode", "online") ac.Set("StaticDir", "download:down download2:down2") ac.Set("StaticExtensionsToGzip", ".css,.js,.html,.jpg,.png") + ac.Set("StaticCacheFileSize", "87456") + ac.Set("StaticCacheFileNum", "1254") assignConfig(ac) t.Logf("%#v", BConfig) @@ -132,6 +134,12 @@ func TestAssignConfig_03(t *testing.T) { if BConfig.WebConfig.StaticDir["/download2"] != "down2" { t.FailNow() } + if BConfig.WebConfig.StaticCacheFileSize != 87456 { + t.FailNow() + } + if BConfig.WebConfig.StaticCacheFileNum != 1254 { + t.FailNow() + } if len(BConfig.WebConfig.StaticExtensionsToGzip) != 5 { t.FailNow() } diff --git a/staticfile.go b/staticfile.go index a29a6b51..57bdca7e 100644 --- a/staticfile.go +++ b/staticfile.go @@ -105,19 +105,19 @@ type serveContentReader struct { *bytes.Reader } -const ( - //max file size to cache,default: 100k - MaxCacheFileSize int = 1024 * 100 - //max file count to cache,default: 1000 - MaxCacheFileCount int = 1000 -) - var ( - staticFileLruCache, _ = lru.New(MaxCacheFileCount) - lruLock sync.RWMutex + staticFileLruCache *lru.Cache + lruLock sync.RWMutex ) func openFile(filePath string, fi os.FileInfo, acceptEncoding string) (bool, string, *serveContentHolder, *serveContentReader, error) { + if staticFileLruCache == nil { + if BConfig.WebConfig.StaticCacheFileNum >= 1 { + staticFileLruCache, _ = lru.New(BConfig.WebConfig.StaticCacheFileNum) + } else { + staticFileLruCache, _ = lru.New(1) + } + } mapKey := acceptEncoding + ":" + filePath lruLock.RLock() var mapFile *serveContentHolder @@ -158,7 +158,7 @@ func openFile(filePath string, fi os.FileInfo, acceptEncoding string) (bool, str func isOk(s *serveContentHolder, fi os.FileInfo) bool { if s == nil { return false - } else if s.size > int64(MaxCacheFileSize) { + } else if s.size > int64(BConfig.WebConfig.StaticCacheFileSize) { return false } return s.modTime == fi.ModTime() && s.originSize == fi.Size()