Skip to content

Commit 070b95f

Browse files
committed
refactor(pgs): custom rfc9111 compliant cache
1 parent 7c27c34 commit 070b95f

12 files changed

Lines changed: 1898 additions & 1318 deletions

File tree

Makefile

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,12 +85,16 @@ build-pico:
8585
go build -o "build/pico-ssh" "./cmd/pico/ssh"
8686
.PHONY: build-auth
8787

88+
build-pgs-cdn:
89+
go build -o "build/pgs-cdn" "./cmd/pgs/cdn"
90+
.PHONY: build-cdn
91+
8892
build-%:
8993
go build -o "build/$*-web" "./cmd/$*/web"
9094
go build -o "build/$*-ssh" "./cmd/$*/ssh"
9195
.PHONY: build-%
9296

93-
build: build-prose build-pastes build-feeds build-pgs build-auth build-pico build-pipe
97+
build: build-prose build-pastes build-feeds build-pgs build-pgs-cdn build-auth build-pico build-pipe
9498
.PHONY: build
9599

96100
scripts:

cmd/pgs/cdn/main.go

Lines changed: 42 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,6 @@ import (
1010
"net/url"
1111
"strings"
1212

13-
"github.com/darkweak/souin/pkg/middleware"
14-
"github.com/hashicorp/golang-lru/v2/expirable"
1513
"github.com/picosh/pico/pkg/apps/pgs"
1614
"github.com/picosh/pico/pkg/shared"
1715
"github.com/prometheus/client_golang/prometheus/promhttp"
@@ -27,19 +25,11 @@ func main() {
2725
_ = pubsub.Close()
2826
}()
2927
cfg := pgs.NewPgsConfig(logger, nil, nil, drain)
30-
httpCache := pgs.SetupCache(cfg)
31-
router := &pgs.WebRouter{
32-
Cfg: cfg,
33-
RedirectsCache: expirable.NewLRU[string, []*pgs.RedirectRule](2048, nil, shared.CacheTimeout),
34-
HeadersCache: expirable.NewLRU[string, []*pgs.HeaderRule](2048, nil, shared.CacheTimeout),
35-
}
36-
cacher := &cachedHttp{
37-
handler: httpCache,
38-
routes: router,
39-
}
28+
proxy := &proxyServe{cfg.Logger}
29+
httpCache := pgs.NewPgsHttpCache(cfg, "pgs-nue", proxy)
30+
cacher := &cachedHttp{}
4031

41-
go router.WatchCacheClear()
42-
go router.CacheMgmt(ctx, httpCache, cfg.CacheClearingQueue)
32+
go pgs.CacheMgmt(ctx, cfg.CacheClearingQueue, cfg, httpCache.Cache)
4333

4434
portStr := fmt.Sprintf(":%s", cfg.WebPort)
4535
cfg.Logger.Info(
@@ -51,29 +41,27 @@ func main() {
5141
cfg.Logger.Error("listen and serve", "err", err)
5242
}
5343

54-
type cachedHttp struct {
55-
handler *middleware.SouinBaseHandler
56-
routes *pgs.WebRouter
57-
}
58-
59-
type CustomTransport struct {
60-
*http.Transport
44+
type proxyServe struct {
6145
Logger *slog.Logger
6246
}
6347

64-
func (t *CustomTransport) RoundTrip(request *http.Request) (*http.Response, error) {
65-
// reqDump, _ := httputil.DumpRequestOut(request, false)
66-
// t.Logger.Info("request", "dump", string(reqDump))
67-
response, err := http.DefaultTransport.RoundTrip(request)
48+
func (p *proxyServe) ServeHTTP(w http.ResponseWriter, req *http.Request) {
49+
url, _ := url.Parse(partialURL(req))
6850

69-
// body, err := httputil.DumpResponse(response, false)
70-
// if err != nil {
71-
// // copying the response body did not work
72-
// return nil, err
73-
// }
74-
// t.Logger.Info("response", "dump", string(body))
51+
p.Logger.Info("proxying request to ash.pgs.sh", "url", url.String())
52+
defaultTransport := http.DefaultTransport.(*http.Transport)
53+
oldDialContext := defaultTransport.DialContext
54+
newTransport := CustomTransport{Transport: defaultTransport, Logger: p.Logger}
55+
newTransport.DialContext = func(ctx context.Context, network, addr string) (net.Conn, error) {
56+
return oldDialContext(ctx, "tcp", "ash.pgs.sh:443")
57+
}
58+
proxy := httputil.NewSingleHostReverseProxy(url)
59+
proxy.Transport = &newTransport
60+
proxy.ServeHTTP(w, req)
61+
}
7562

76-
return response, err
63+
type cachedHttp struct {
64+
Logger *slog.Logger
7765
}
7866

7967
func (c *cachedHttp) ServeHTTP(writer http.ResponseWriter, req *http.Request) {
@@ -83,35 +71,19 @@ func (c *cachedHttp) ServeHTTP(writer http.ResponseWriter, req *http.Request) {
8371
}
8472

8573
if req.URL.Path == "/check" {
86-
c.routes.Cfg.Logger.Info("proxying `/check` request to ash.pgs.sh", "query", req.URL.RawQuery)
74+
c.Logger.Info("proxying `/check` request to ash.pgs.sh", "query", req.URL.RawQuery)
8775
req, _ := http.NewRequest("GET", "https://ash.pgs.sh/check?"+req.URL.RawQuery, nil)
8876
req.Host = "pgs.sh"
8977
// reqDump, _ := httputil.DumpRequestOut(req, true)
9078
// fmt.Printf("REQUEST:\n%s", string(reqDump))
9179

9280
resp, err := http.DefaultClient.Do(req)
9381
if err != nil {
94-
c.routes.Cfg.Logger.Error("check request", "err", err)
82+
c.Logger.Error("check request", "err", err)
9583
}
9684
writer.WriteHeader(resp.StatusCode)
9785
return
9886
}
99-
100-
_ = c.handler.ServeHTTP(writer, req, func(w http.ResponseWriter, r *http.Request) error {
101-
url, _ := url.Parse(partialURL(r))
102-
103-
c.routes.Cfg.Logger.Info("proxying request to ash.pgs.sh", "url", url.String())
104-
defaultTransport := http.DefaultTransport.(*http.Transport)
105-
oldDialContext := defaultTransport.DialContext
106-
newTransport := CustomTransport{Transport: defaultTransport, Logger: c.routes.Cfg.Logger}
107-
newTransport.DialContext = func(ctx context.Context, network, addr string) (net.Conn, error) {
108-
return oldDialContext(ctx, "tcp", "ash.pgs.sh:443")
109-
}
110-
proxy := httputil.NewSingleHostReverseProxy(url)
111-
proxy.Transport = &newTransport
112-
proxy.ServeHTTP(w, r)
113-
return nil
114-
})
11587
}
11688

11789
func partialURL(r *http.Request) string {
@@ -121,3 +93,23 @@ func partialURL(r *http.Request) string {
12193
builder.WriteString(r.Host)
12294
return builder.String()
12395
}
96+
97+
type CustomTransport struct {
98+
*http.Transport
99+
Logger *slog.Logger
100+
}
101+
102+
func (t *CustomTransport) RoundTrip(request *http.Request) (*http.Response, error) {
103+
// reqDump, _ := httputil.DumpRequestOut(request, false)
104+
// t.Logger.Info("request", "dump", string(reqDump))
105+
response, err := http.DefaultTransport.RoundTrip(request)
106+
107+
// body, err := httputil.DumpResponse(response, false)
108+
// if err != nil {
109+
// // copying the response body did not work
110+
// return nil, err
111+
// }
112+
// t.Logger.Info("response", "dump", string(body))
113+
114+
return response, err
115+
}

0 commit comments

Comments
 (0)