pico / refactor(pgs): use httputil rev proxy to external service #29

open · opened on 2024-10-14T02:29:12Z by erockmKua
Help
# add changes to patch request
git format-patch main --stdout | ssh pr.pico.sh pr add 29
# add review to patch request
git format-patch main --stdout | ssh pr.pico.sh pr add --review 29
# remove patchset
ssh pr.pico.sh ps rm ps-x
# checkout all patches
ssh pr.pico.sh pr print 29 | git am -3
# print a diff between the last two patches in a patch request
ssh pr.pico.sh pr diff 29
# accept PR
ssh pr.pico.sh pr accept 29
# close PR
ssh pr.pico.sh pr close 29

Logs

erockmKua created pr with ps-48 on 2024-10-14T02:29:12Z
erockmKua added ps-49 on 2024-10-14T02:35:23Z
erockmKua added ps-50 on 2024-10-14T03:30:35Z

Patchsets

Diff ↕
 pgs/api.go | 22 ++++++++++------------
 1 file changed, 10 insertions(+), 12 deletions(-)
 1From 6de64fd62a4ede2c8dc7cde91a4984f81a45a173 Mon Sep 17 00:00:00 2001
 2From: Eric Bower <me@erock.io>
 3Date: Sun, 13 Oct 2024 22:28:12 -0400
 4Subject: [PATCH] refactor(pgs): use httputil rev proxy to external service
 5
 6---
 7 pgs/api.go | 22 ++++++++++------------
 8 1 file changed, 10 insertions(+), 12 deletions(-)
 9
10diff --git a/pgs/api.go b/pgs/api.go
11index a566677..acb28a6 100644
12--- a/pgs/api.go
13+++ b/pgs/api.go
14@@ -13,6 +13,7 @@ import (
15 	"strings"
16 	"time"
17 
18+	"net/http/httputil"
19 	_ "net/http/pprof"
20 
21 	"github.com/gorilla/feeds"
22@@ -229,24 +230,21 @@ func (h *AssetHandler) handle(logger *slog.Logger, w http.ResponseWriter, r *htt
23 				"destination", fp.Filepath,
24 				"status", fp.Status,
25 			)
26-			// fetch content from url and serve it
27-			resp, err := http.Get(fp.Filepath)
28+
29+			destUrl, err := url.Parse(fp.Filepath)
30 			if err != nil {
31-				logger.Error(
32-					"external service not found",
33-					"err", err,
34-					"status", http.StatusNotFound,
35-				)
36-				http.Error(w, "404 not found", http.StatusNotFound)
37+				http.Error(w, err.Error(), http.StatusInternalServerError)
38 				return
39 			}
40+			proxy := httputil.NewSingleHostReverseProxy(destUrl)
41 
42-			w.Header().Set("content-type", resp.Header.Get("content-type"))
43-			w.WriteHeader(status)
44-			_, err = io.Copy(w, resp.Body)
45+			req, err := http.NewRequest("GET", fp.Filepath, nil)
46 			if err != nil {
47-				logger.Error("io copy", "err", err.Error())
48+				http.Error(w, err.Error(), http.StatusInternalServerError)
49+				return
50 			}
51+
52+			proxy.ServeHTTP(w, req)
53 			return
54 		}
55 
56
57base-commit: ae3f38949770e4b92367f074ee9e172f93e518b8
58-- 
592.45.2
60
ps-48 by erockmKua on 2024-10-14T02:29:12Z
Diff ↕

fix: dont need to create a new request

Eric Bower <me@erock.io>
 pgs/api.go | 9 +--------
 1 file changed, 1 insertion(+), 8 deletions(-)
 1From 7581b29116c46d4ddc53b4bb151d9afadee5e488 Mon Sep 17 00:00:00 2001
 2From: Eric Bower <me@erock.io>
 3Date: Sun, 13 Oct 2024 22:34:59 -0400
 4Subject: [PATCH 2/2] fix: dont need to create a new request
 5
 6---
 7 pgs/api.go | 9 +--------
 8 1 file changed, 1 insertion(+), 8 deletions(-)
 9
10diff --git a/pgs/api.go b/pgs/api.go
11index acb28a6..62afff5 100644
12--- a/pgs/api.go
13+++ b/pgs/api.go
14@@ -237,14 +237,7 @@ func (h *AssetHandler) handle(logger *slog.Logger, w http.ResponseWriter, r *htt
15 				return
16 			}
17 			proxy := httputil.NewSingleHostReverseProxy(destUrl)
18-
19-			req, err := http.NewRequest("GET", fp.Filepath, nil)
20-			if err != nil {
21-				http.Error(w, err.Error(), http.StatusInternalServerError)
22-				return
23-			}
24-
25-			proxy.ServeHTTP(w, req)
26+			proxy.ServeHTTP(w, r)
27 			return
28 		}
29 
30-- 
312.45.2
32
ps-49 by erockmKua on 2024-10-14T02:35:23Z
Diff ↕

chore: get it to work

Eric Bower <me@erock.io>
 pgs/api.go | 6 ++++++
 1 file changed, 6 insertions(+)
 1From 3050d2040a07127136fcc164813d2d7fce38eba2 Mon Sep 17 00:00:00 2001
 2From: Eric Bower <me@erock.io>
 3Date: Sun, 13 Oct 2024 23:30:17 -0400
 4Subject: [PATCH 3/3] chore: get it to work
 5
 6---
 7 pgs/api.go | 6 ++++++
 8 1 file changed, 6 insertions(+)
 9
10diff --git a/pgs/api.go b/pgs/api.go
11index 62afff5..47b5cae 100644
12--- a/pgs/api.go
13+++ b/pgs/api.go
14@@ -237,6 +237,12 @@ func (h *AssetHandler) handle(logger *slog.Logger, w http.ResponseWriter, r *htt
15 				return
16 			}
17 			proxy := httputil.NewSingleHostReverseProxy(destUrl)
18+			oldDirector := proxy.Director
19+			proxy.Director = func(r *http.Request) {
20+				oldDirector(r)
21+				r.Host = destUrl.Host
22+				r.URL = destUrl
23+			}
24 			proxy.ServeHTTP(w, r)
25 			return
26 		}
27-- 
282.45.2
29
ps-50 by erockmKua on 2024-10-14T03:30:35Z

refactor(pgs): use httputil rev proxy to external service

Eric Bower <me@erock.io> 2024-10-14T02:28:12Z
 pgs/api.go | 22 ++++++++++------------
 1 file changed, 10 insertions(+), 12 deletions(-)
 1From 6de64fd62a4ede2c8dc7cde91a4984f81a45a173 Mon Sep 17 00:00:00 2001
 2From: Eric Bower <me@erock.io>
 3Date: Sun, 13 Oct 2024 22:28:12 -0400
 4Subject: [PATCH 1/3] refactor(pgs): use httputil rev proxy to external service
 5
 6---
 7 pgs/api.go | 22 ++++++++++------------
 8 1 file changed, 10 insertions(+), 12 deletions(-)
 9
10diff --git a/pgs/api.go b/pgs/api.go
11index a566677..acb28a6 100644
12--- a/pgs/api.go
13+++ b/pgs/api.go
14@@ -13,6 +13,7 @@ import (
15 	"strings"
16 	"time"
17 
18+	"net/http/httputil"
19 	_ "net/http/pprof"
20 
21 	"github.com/gorilla/feeds"
22@@ -229,24 +230,21 @@ func (h *AssetHandler) handle(logger *slog.Logger, w http.ResponseWriter, r *htt
23 				"destination", fp.Filepath,
24 				"status", fp.Status,
25 			)
26-			// fetch content from url and serve it
27-			resp, err := http.Get(fp.Filepath)
28+
29+			destUrl, err := url.Parse(fp.Filepath)
30 			if err != nil {
31-				logger.Error(
32-					"external service not found",
33-					"err", err,
34-					"status", http.StatusNotFound,
35-				)
36-				http.Error(w, "404 not found", http.StatusNotFound)
37+				http.Error(w, err.Error(), http.StatusInternalServerError)
38 				return
39 			}
40+			proxy := httputil.NewSingleHostReverseProxy(destUrl)
41 
42-			w.Header().Set("content-type", resp.Header.Get("content-type"))
43-			w.WriteHeader(status)
44-			_, err = io.Copy(w, resp.Body)
45+			req, err := http.NewRequest("GET", fp.Filepath, nil)
46 			if err != nil {
47-				logger.Error("io copy", "err", err.Error())
48+				http.Error(w, err.Error(), http.StatusInternalServerError)
49+				return
50 			}
51+
52+			proxy.ServeHTTP(w, req)
53 			return
54 		}
55 
56
57base-commit: ae3f38949770e4b92367f074ee9e172f93e518b8
58-- 
592.45.2
60

fix: dont need to create a new request

Eric Bower <me@erock.io> 2024-10-14T02:34:59Z
 pgs/api.go | 9 +--------
 1 file changed, 1 insertion(+), 8 deletions(-)
 1From 7581b29116c46d4ddc53b4bb151d9afadee5e488 Mon Sep 17 00:00:00 2001
 2From: Eric Bower <me@erock.io>
 3Date: Sun, 13 Oct 2024 22:34:59 -0400
 4Subject: [PATCH 2/3] fix: dont need to create a new request
 5
 6---
 7 pgs/api.go | 9 +--------
 8 1 file changed, 1 insertion(+), 8 deletions(-)
 9
10diff --git a/pgs/api.go b/pgs/api.go
11index acb28a6..62afff5 100644
12--- a/pgs/api.go
13+++ b/pgs/api.go
14@@ -237,14 +237,7 @@ func (h *AssetHandler) handle(logger *slog.Logger, w http.ResponseWriter, r *htt
15 				return
16 			}
17 			proxy := httputil.NewSingleHostReverseProxy(destUrl)
18-
19-			req, err := http.NewRequest("GET", fp.Filepath, nil)
20-			if err != nil {
21-				http.Error(w, err.Error(), http.StatusInternalServerError)
22-				return
23-			}
24-
25-			proxy.ServeHTTP(w, req)
26+			proxy.ServeHTTP(w, r)
27 			return
28 		}
29 
30-- 
312.45.2
32

chore: get it to work

Eric Bower <me@erock.io> 2024-10-14T03:30:17Z
 pgs/api.go | 6 ++++++
 1 file changed, 6 insertions(+)
 1From 3050d2040a07127136fcc164813d2d7fce38eba2 Mon Sep 17 00:00:00 2001
 2From: Eric Bower <me@erock.io>
 3Date: Sun, 13 Oct 2024 23:30:17 -0400
 4Subject: [PATCH 3/3] chore: get it to work
 5
 6---
 7 pgs/api.go | 6 ++++++
 8 1 file changed, 6 insertions(+)
 9
10diff --git a/pgs/api.go b/pgs/api.go
11index 62afff5..47b5cae 100644
12--- a/pgs/api.go
13+++ b/pgs/api.go
14@@ -237,6 +237,12 @@ func (h *AssetHandler) handle(logger *slog.Logger, w http.ResponseWriter, r *htt
15 				return
16 			}
17 			proxy := httputil.NewSingleHostReverseProxy(destUrl)
18+			oldDirector := proxy.Director
19+			proxy.Director = func(r *http.Request) {
20+				oldDirector(r)
21+				r.Host = destUrl.Host
22+				r.URL = destUrl
23+			}
24 			proxy.ServeHTTP(w, r)
25 			return
26 		}
27-- 
282.45.2
29