this repo has no description
1package state
2
3import (
4 "fmt"
5 "io"
6 "maps"
7 "net/http"
8
9 "github.com/bluesky-social/indigo/atproto/identity"
10 "github.com/go-chi/chi/v5"
11 "tangled.org/core/appview/models"
12)
13
14func (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)
17
18 scheme := "https"
19 if s.config.Core.Dev {
20 scheme = "http"
21 }
22
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)
25
26}
27
28func (s *State) UploadArchive(w http.ResponseWriter, r *http.Request) {
29 user, ok := r.Context().Value("resolvedId").(identity.Identity)
30 if !ok {
31 http.Error(w, "failed to resolve user", http.StatusInternalServerError)
32 return
33 }
34 repo := r.Context().Value("repo").(*models.Repo)
35
36 scheme := "https"
37 if s.config.Core.Dev {
38 scheme = "http"
39 }
40
41 targetURL := fmt.Sprintf("%s://%s/%s/%s/git-upload-archive?%s", scheme, repo.Knot, user.DID, repo.Name, r.URL.RawQuery)
42 s.proxyRequest(w, r, targetURL)
43}
44
45func (s *State) UploadPack(w http.ResponseWriter, r *http.Request) {
46 user, ok := r.Context().Value("resolvedId").(identity.Identity)
47 if !ok {
48 http.Error(w, "failed to resolve user", http.StatusInternalServerError)
49 return
50 }
51 repo := r.Context().Value("repo").(*models.Repo)
52
53 scheme := "https"
54 if s.config.Core.Dev {
55 scheme = "http"
56 }
57
58 targetURL := fmt.Sprintf("%s://%s/%s/%s/git-upload-pack?%s", scheme, repo.Knot, user.DID, repo.Name, r.URL.RawQuery)
59 s.proxyRequest(w, r, targetURL)
60}
61
62func (s *State) ReceivePack(w http.ResponseWriter, r *http.Request) {
63 user, ok := r.Context().Value("resolvedId").(identity.Identity)
64 if !ok {
65 http.Error(w, "failed to resolve user", http.StatusInternalServerError)
66 return
67 }
68 repo := r.Context().Value("repo").(*models.Repo)
69
70 scheme := "https"
71 if s.config.Core.Dev {
72 scheme = "http"
73 }
74
75 targetURL := fmt.Sprintf("%s://%s/%s/%s/git-receive-pack?%s", scheme, repo.Knot, user.DID, repo.Name, r.URL.RawQuery)
76 s.proxyRequest(w, r, targetURL)
77}
78
79func (s *State) proxyRequest(w http.ResponseWriter, r *http.Request, targetURL string) {
80 client := &http.Client{}
81
82 // Create new request
83 proxyReq, err := http.NewRequest(r.Method, targetURL, r.Body)
84 if err != nil {
85 http.Error(w, err.Error(), http.StatusInternalServerError)
86 return
87 }
88
89 // Copy original headers
90 proxyReq.Header = r.Header
91
92 repoOwnerHandle := chi.URLParam(r, "user")
93 proxyReq.Header.Add("x-tangled-repo-owner-handle", repoOwnerHandle)
94
95 // Execute request
96 resp, err := client.Do(proxyReq)
97 if err != nil {
98 http.Error(w, err.Error(), http.StatusInternalServerError)
99 return
100 }
101 defer resp.Body.Close()
102
103 // Copy response headers
104 maps.Copy(w.Header(), resp.Header)
105
106 // Set response status code
107 w.WriteHeader(resp.StatusCode)
108
109 // Copy response body
110 if _, err := io.Copy(w, resp.Body); err != nil {
111 http.Error(w, err.Error(), http.StatusInternalServerError)
112 return
113 }
114}