Skip to content

Commit acd5d5b

Browse files
committed
HTTP handlers cleanup etc.
1 parent 19778d7 commit acd5d5b

File tree

3 files changed

+46
-44
lines changed

3 files changed

+46
-44
lines changed

‎lib/cache.go‎

Lines changed: 10 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -67,17 +67,17 @@ type readSeekCloser interface {
6767
io.Closer
6868
}
6969

70-
type cacheHandler struct {
70+
type cache struct {
7171
cfg Config
7272
logger *Logger
7373
storage s3Client
7474
}
7575

76-
func newCacheHandler(cfg Config, logger *Logger) *cacheHandler {
77-
return &cacheHandler{cfg: cfg, logger: logger, storage: s3Client{cfg: cfg, logger: logger}}
76+
func newCache(cfg Config, logger *Logger) *cache {
77+
return &cache{cfg: cfg, logger: logger, storage: s3Client{cfg: cfg, logger: logger}}
7878
}
7979

80-
func (c *cacheHandler) handleRequest(rw http.ResponseWriter, req *http.Request) error {
80+
func (c *cache) handleRequest(rw http.ResponseWriter, req *http.Request) error {
8181
urlPath := strings.TrimLeft(req.URL.Path, " /")
8282

8383
if urlPath == "" || strings.HasSuffix(urlPath, "/") {
@@ -135,7 +135,7 @@ func (c *cacheHandler) handleRequest(rw http.ResponseWriter, req *http.Request)
135135
return err
136136
}
137137

138-
func (c *cacheHandler) getFileMeta(relPath string) (*fileMeta, error) {
138+
func (c *cache) getFileMeta(relPath string) (*fileMeta, error) {
139139
db, err := c.openDB()
140140
if err != nil {
141141
return nil, err
@@ -155,7 +155,7 @@ func (c *cacheHandler) getFileMeta(relPath string) (*fileMeta, error) {
155155
return &fm, nil
156156
}
157157

158-
func (c *cacheHandler) getAndWriteFile(
158+
func (c *cache) getAndWriteFile(
159159
urlPath string, host Host,
160160
rw http.ResponseWriter, req *http.Request) (*fileMeta, error) {
161161

@@ -180,7 +180,7 @@ func (c *cacheHandler) getAndWriteFile(
180180

181181
}
182182

183-
func (c *cacheHandler) getFile(relPath string) (readSeekCloser, error) {
183+
func (c *cache) getFile(relPath string) (readSeekCloser, error) {
184184
filename := filepath.Join(c.cfg.CacheDir, filepath.FromSlash(relPath))
185185
f, err := os.Open(filename)
186186
if err != nil {
@@ -193,7 +193,7 @@ func (c *cacheHandler) getFile(relPath string) (readSeekCloser, error) {
193193
}
194194

195195
// TODO(bep) transactions
196-
func (c *cacheHandler) doWithDB(f func(db *storm.DB) error) error {
196+
func (c *cache) doWithDB(f func(db *storm.DB) error) error {
197197
db, err := c.openDB()
198198
if err != nil {
199199
return err
@@ -202,26 +202,6 @@ func (c *cacheHandler) doWithDB(f func(db *storm.DB) error) error {
202202
return f(db)
203203
}
204204

205-
func (c *cacheHandler) openDB() (*storm.DB, error) {
206-
return storm.Open(c.cfg.DBFilename, storm.BoltOptions(0600, &bolt.Options{Timeout: 5 * time.Second}))
205+
func (c *cache) openDB() (*storm.DB, error) {
206+
return storm.Open(c.cfg.DBFilename, storm.BoltOptions(0600, &bolt.Options{Timeout: 10 * time.Second}))
207207
}
208-
209-
// Plans:
210-
//
211-
// Request file:
212-
// If db.File => if os.File => OK
213-
// If db.File => if !os.File => delete db.File => stream and save db.File and os.File
214-
// If !db.File => stream and save db.File and os.File
215-
216-
// On server start:
217-
// For each os.File:
218-
// If not in db.File => delete os.File
219-
// For each db.File:
220-
// If not in os.File => delete db.File
221-
// Else: Set some in memory size counter.
222-
223-
// On free space:
224-
// Order by CreatedAt asc
225-
226-
// On Garbage Collect:
227-
//

‎lib/cache_maintenance.go‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ import (
2222
"github.com/asdine/storm/q"
2323
)
2424

25-
func (c *cacheHandler) purgePrefix(prefix string) error {
25+
func (c *cache) purgePrefix(prefix string) error {
2626
db, err := c.openDB()
2727
if err != nil {
2828
return err
@@ -58,7 +58,7 @@ func (c *cacheHandler) purgePrefix(prefix string) error {
5858

5959
// This is a Least Recently Used (LRU) cache.
6060
// So: Sort by created and delete until we reach the target.
61-
func (c *cacheHandler) shrinkTo(target int64) error {
61+
func (c *cache) shrinkTo(target int64) error {
6262
db, err := c.openDB()
6363
if err != nil {
6464
return err

‎lib/server.go‎

Lines changed: 34 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,20 @@ package lib
1616

1717
import (
1818
"context"
19+
"fmt"
1920
"net/http"
21+
"path"
2022

2123
"crypto/tls"
2224

2325
"golang.org/x/crypto/acme/autocert"
2426
)
2527

28+
const (
29+
// Make it unlikely that this clashes with some other static resource.
30+
appNS = "__s3p"
31+
)
32+
2633
// Server represents the caching HTTP server.
2734
type Server struct {
2835
cfg Config
@@ -34,35 +41,50 @@ type Server struct {
3441
}
3542

3643
type httpHandlers struct {
37-
c *cacheHandler
44+
c *cache
3845
}
3946

4047
func NewServer(cfg Config, logger *Logger) (*Server, error) {
4148
// TODO(bep) validate config
4249

43-
h := http.NewServeMux()
44-
c := newCacheHandler(cfg, logger)
45-
mw := &httpHandlers{c: c}
50+
var (
51+
h = http.NewServeMux()
52+
c = newCache(cfg, logger)
53+
mw = &httpHandlers{c: c}
54+
)
4655

4756
var purger http.HandlerFunc = func(w http.ResponseWriter, r *http.Request) {
4857
prefix := r.FormValue("prefix")
49-
if prefix != "" {
50-
if err := c.purgePrefix(prefix); err != nil {
51-
c.logger.Error("area", "cache", "tag", "purge", "prefix", prefix, "error", err)
52-
}
58+
host, found := cfg.host(r.Host)
59+
if !found {
60+
c.logger.Error("area", "cache", "tag", "purge", "host_not_found", r.Host)
61+
return
5362
}
63+
64+
prefix = path.Join(host.Name, prefix)
65+
66+
if err := c.purgePrefix(prefix); err != nil {
67+
c.logger.Error("area", "cache", "tag", "purge", "prefix", prefix, "error", err)
68+
}
69+
5470
}
5571

5672
var shrinker http.HandlerFunc = func(w http.ResponseWriter, r *http.Request) {
57-
target := 50 << 10
73+
target := 50 << 10 // TODO(bep) Take value from conf
5874
if err := c.shrinkTo(int64(target)); err != nil {
5975
c.logger.Error("area", "cache", "tag", "shrink", "error", err)
6076
}
6177
}
6278

63-
h.Handle("/purge", mw.secure(mw.validateSig(purger)))
64-
h.Handle("/shrink", mw.secure(mw.validateSig(shrinker)))
65-
h.Handle("/", mw.secure(mw.serveFile()))
79+
var (
80+
// Make the handler chaining a little bit more fluid.
81+
secure = mw.secure
82+
validateSig = mw.validateSig
83+
)
84+
85+
h.Handle(fmt.Sprintf("/%s/purge", appNS), secure(validateSig(purger)))
86+
h.Handle(fmt.Sprintf("/%s/shrink", appNS), secure(validateSig(shrinker)))
87+
h.Handle("/", secure(mw.serveFile()))
6688

6789
tlsEnabled, err := cfg.isTLSConfigured()
6890
if err != nil {

0 commit comments

Comments
 (0)