forked from tangled.org/core
this repo has no description
at txns 2.1 kB view raw
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}