1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78
|
package git
import (
"context"
"io"
"net/http"
"gitlab.com/gitlab-org/gitlab-shell/v14/client"
)
var httpClient = &http.Client{
Transport: client.NewTransport(client.DefaultTransport()),
}
const repoUnavailableErrMsg = "Remote repository is unavailable"
type Client struct {
Url string
Headers map[string]string
}
func (c *Client) InfoRefs(ctx context.Context, service string) (*http.Response, error) {
request, err := http.NewRequestWithContext(ctx, http.MethodGet, c.Url+"/info/refs?service="+service, nil)
if err != nil {
return nil, err
}
return c.do(request)
}
func (c *Client) ReceivePack(ctx context.Context, body io.Reader) (*http.Response, error) {
request, err := http.NewRequestWithContext(ctx, http.MethodPost, c.Url+"/git-receive-pack", body)
if err != nil {
return nil, err
}
request.Header.Add("Content-Type", "application/x-git-receive-pack-request")
request.Header.Add("Accept", "application/x-git-receive-pack-result")
return c.do(request)
}
func (c *Client) UploadPack(ctx context.Context, body io.Reader) (*http.Response, error) {
request, err := http.NewRequestWithContext(ctx, http.MethodPost, c.Url+"/git-upload-pack", body)
if err != nil {
return nil, err
}
request.Header.Add("Content-Type", "application/x-git-upload-pack-request")
request.Header.Add("Accept", "application/x-git-upload-pack-result")
return c.do(request)
}
func (c *Client) do(request *http.Request) (*http.Response, error) {
for k, v := range c.Headers {
request.Header.Add(k, v)
}
response, err := httpClient.Do(request)
if err != nil {
return nil, &client.ApiError{Msg: repoUnavailableErrMsg}
}
if response.StatusCode >= 400 {
defer response.Body.Close()
body, err := io.ReadAll(response.Body)
if err != nil {
return nil, &client.ApiError{Msg: repoUnavailableErrMsg}
}
if len(body) > 0 {
return nil, &client.ApiError{Msg: string(body)}
}
return nil, &client.ApiError{Msg: repoUnavailableErrMsg}
}
return response, nil
}
|