···
9
+
"github.com/bluesky-social/indigo/atproto/identity"
10
+
"github.com/go-chi/chi/v5"
11
+
"tangled.org/core/appview/models"
14
+
func (s *State) InfoRefs(w http.ResponseWriter, r *http.Request) {
15
+
user := r.Context().Value("resolvedId").(identity.Identity)
16
+
repo := r.Context().Value("repo").(*models.Repo)
19
+
if s.config.Core.Dev {
23
+
targetURL := fmt.Sprintf("%s://%s/%s/%s/info/refs?%s", scheme, repo.Knot, user.DID, repo.Name, r.URL.RawQuery)
24
+
s.proxyRequest(w, r, targetURL)
28
+
func (s *State) UploadPack(w http.ResponseWriter, r *http.Request) {
29
+
user, ok := r.Context().Value("resolvedId").(identity.Identity)
31
+
http.Error(w, "failed to resolve user", http.StatusInternalServerError)
34
+
repo := r.Context().Value("repo").(*models.Repo)
37
+
if s.config.Core.Dev {
41
+
targetURL := fmt.Sprintf("%s://%s/%s/%s/git-upload-pack?%s", scheme, repo.Knot, user.DID, repo.Name, r.URL.RawQuery)
42
+
s.proxyRequest(w, r, targetURL)
45
+
func (s *State) ReceivePack(w http.ResponseWriter, r *http.Request) {
46
+
user, ok := r.Context().Value("resolvedId").(identity.Identity)
48
+
http.Error(w, "failed to resolve user", http.StatusInternalServerError)
51
+
repo := r.Context().Value("repo").(*models.Repo)
54
+
if s.config.Core.Dev {
58
+
targetURL := fmt.Sprintf("%s://%s/%s/%s/git-receive-pack?%s", scheme, repo.Knot, user.DID, repo.Name, r.URL.RawQuery)
59
+
s.proxyRequest(w, r, targetURL)
62
+
func (s *State) DownloadArchive(w http.ResponseWriter, r *http.Request) {
63
+
ref := chi.URLParam(r, "ref")
65
+
user, ok := r.Context().Value("resolvedId").(identity.Identity)
67
+
http.Error(w, "failed to resolve user", http.StatusInternalServerError)
70
+
repo := r.Context().Value("repo").(*models.Repo)
73
+
if s.config.Core.Dev {
77
+
targetURL := fmt.Sprintf("%s://%s/%s/%s/archive/%s", scheme, repo.Knot, user.DID, repo.Name, ref)
78
+
s.proxyRequest(w, r, targetURL)
81
+
func (s *State) proxyRequest(w http.ResponseWriter, r *http.Request, targetURL string) {
82
+
client := &http.Client{}
84
+
// Create new request
85
+
proxyReq, err := http.NewRequest(r.Method, targetURL, r.Body)
87
+
http.Error(w, err.Error(), http.StatusInternalServerError)
91
+
// Copy original headers
92
+
proxyReq.Header = r.Header
94
+
repoOwnerHandle := chi.URLParam(r, "user")
95
+
proxyReq.Header.Add("x-tangled-repo-owner-handle", repoOwnerHandle)
98
+
resp, err := client.Do(proxyReq)
100
+
http.Error(w, err.Error(), http.StatusInternalServerError)
103
+
defer resp.Body.Close()
105
+
// Copy response headers
106
+
maps.Copy(w.Header(), resp.Header)
108
+
// Set response status code
109
+
w.WriteHeader(resp.StatusCode)
111
+
// Copy response body
112
+
if _, err := io.Copy(w, resp.Body); err != nil {
113
+
http.Error(w, err.Error(), http.StatusInternalServerError)