repos / pico

pico services mono repo
git clone https://github.com/picosh/pico.git

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
M cmd/pgs/cdn/main.go
+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 }