- commit
- 675fdb0
- parent
- 2c908e6
- author
- Eric Bower
- date
- 2025-06-17 12:51:39 -0400 EDT
fix(pgs): cdn send partial url to proxy instead of entire url
1 files changed,
+26,
-15
+26,
-15
1@@ -3,6 +3,7 @@ package main
2 import (
3 "context"
4 "fmt"
5+ "log/slog"
6 "net"
7 "net/http"
8 "net/http/httputil"
9@@ -50,6 +51,26 @@ type cachedHttp struct {
10 routes *pgs.WebRouter
11 }
12
13+type CustomTransport struct {
14+ *http.Transport
15+ Logger *slog.Logger
16+}
17+
18+func (t *CustomTransport) RoundTrip(request *http.Request) (*http.Response, error) {
19+ // reqDump, _ := httputil.DumpRequestOut(request, false)
20+ // t.Logger.Info("request", "dump", string(reqDump))
21+ response, err := http.DefaultTransport.RoundTrip(request)
22+
23+ // body, err := httputil.DumpResponse(response, false)
24+ // if err != nil {
25+ // // copying the response body did not work
26+ // return nil, err
27+ // }
28+ // t.Logger.Info("response", "dump", string(body))
29+
30+ return response, err
31+}
32+
33 func (c *cachedHttp) ServeHTTP(writer http.ResponseWriter, req *http.Request) {
34 if req.URL.Path == "/_metrics" {
35 promhttp.Handler().ServeHTTP(writer, req)
36@@ -72,36 +93,26 @@ func (c *cachedHttp) ServeHTTP(writer http.ResponseWriter, req *http.Request) {
37 }
38
39 _ = c.handler.ServeHTTP(writer, req, func(w http.ResponseWriter, r *http.Request) error {
40- url, _ := url.Parse(fullURL(r))
41+ url, _ := url.Parse(partialURL(r))
42
43 c.routes.Cfg.Logger.Info("proxying request to ash.pgs.sh", "url", url.String())
44 defaultTransport := http.DefaultTransport.(*http.Transport)
45- newTransport := defaultTransport.Clone()
46- oldDialContext := newTransport.DialContext
47+ oldDialContext := defaultTransport.DialContext
48+ newTransport := CustomTransport{Transport: defaultTransport, Logger: c.routes.Cfg.Logger}
49 newTransport.DialContext = func(ctx context.Context, network, addr string) (net.Conn, error) {
50 return oldDialContext(ctx, "tcp", "ash.pgs.sh:443")
51 }
52 proxy := httputil.NewSingleHostReverseProxy(url)
53- proxy.Transport = newTransport
54-
55+ proxy.Transport = &newTransport
56 proxy.ServeHTTP(w, r)
57 return nil
58 })
59 }
60
61-func fullURL(r *http.Request) string {
62+func partialURL(r *http.Request) string {
63 builder := strings.Builder{}
64 // this service sits behind a proxy so we need to force it to https
65 builder.WriteString("https://")
66 builder.WriteString(r.Host)
67- builder.WriteString(r.URL.Path)
68-
69- if r.URL.RawQuery != "" {
70- builder.WriteString("?" + r.URL.RawQuery)
71- }
72- if r.URL.Fragment != "" {
73- builder.WriteString("#" + r.URL.Fragment)
74- }
75-
76 return builder.String()
77 }