87 lines
2.1 kB
1
package state
2
3
import (
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
12
func (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
45
func (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
}
88