1package state
2
3import (
4 "fmt"
5 "io"
6 "net/http"
7
8 "github.com/bluesky-social/indigo/atproto/identity"
9 "github.com/go-chi/chi/v5"
10)
11
12func (s *State) InfoRefs(w http.ResponseWriter, r *http.Request) {
13 user := r.Context().Value("resolvedId").(identity.Identity)
14 knot := r.Context().Value("knot").(string)
15 repo := chi.URLParam(r, "repo")
16
17 uri := "https"
18 if s.config.Dev {
19 uri = "http"
20 }
21 targetURL := fmt.Sprintf("%s://%s/%s/%s/info/refs?%s", uri, knot, user.DID, repo, r.URL.RawQuery)
22 resp, err := http.Get(targetURL)
23 if err != nil {
24 http.Error(w, err.Error(), http.StatusInternalServerError)
25 return
26 }
27 defer resp.Body.Close()
28
29 // Copy response headers
30 for k, v := range resp.Header {
31 w.Header()[k] = v
32 }
33
34 // Set response status code
35 w.WriteHeader(resp.StatusCode)
36
37 // Copy response body
38 if _, err := io.Copy(w, resp.Body); err != nil {
39 http.Error(w, err.Error(), http.StatusInternalServerError)
40 return
41 }
42
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 knot := r.Context().Value("knot").(string)
52 repo := chi.URLParam(r, "repo")
53 targetURL := fmt.Sprintf("https://%s/%s/%s/git-upload-pack?%s", knot, user.DID, repo, r.URL.RawQuery)
54 client := &http.Client{}
55
56 // Create new request
57 proxyReq, err := http.NewRequest(r.Method, targetURL, r.Body)
58 if err != nil {
59 http.Error(w, err.Error(), http.StatusInternalServerError)
60 return
61 }
62
63 // Copy original headers
64 proxyReq.Header = r.Header
65
66 // Execute request
67 resp, err := client.Do(proxyReq)
68 if err != nil {
69 http.Error(w, err.Error(), http.StatusInternalServerError)
70 return
71 }
72 defer resp.Body.Close()
73
74 // Copy response headers
75 for k, v := range resp.Header {
76 w.Header()[k] = v
77 }
78
79 // Set response status code
80 w.WriteHeader(resp.StatusCode)
81
82 // Copy response body
83 if _, err := io.Copy(w, resp.Body); err != nil {
84 http.Error(w, err.Error(), http.StatusInternalServerError)
85 return
86 }
87}