aboutsummaryrefslogtreecommitdiffstats
path: root/clients/http/git_upload_pack.go
diff options
context:
space:
mode:
Diffstat (limited to 'clients/http/git_upload_pack.go')
-rw-r--r--clients/http/git_upload_pack.go78
1 files changed, 78 insertions, 0 deletions
diff --git a/clients/http/git_upload_pack.go b/clients/http/git_upload_pack.go
new file mode 100644
index 0000000..96dbdce
--- /dev/null
+++ b/clients/http/git_upload_pack.go
@@ -0,0 +1,78 @@
+package http
+
+import (
+ "io"
+ "net/http"
+ "strings"
+
+ "gopkg.in/src-d/go-git.v2/clients/common"
+ "gopkg.in/src-d/go-git.v2/pktline"
+)
+
+type GitUploadPackService struct {
+ Client *http.Client
+
+ endpoint common.Endpoint
+}
+
+func NewGitUploadPackService() *GitUploadPackService {
+ return &GitUploadPackService{
+ Client: http.DefaultClient,
+ }
+}
+
+func (s *GitUploadPackService) Connect(url common.Endpoint) error {
+ s.endpoint = url
+
+ return nil
+}
+
+func (s *GitUploadPackService) Info() (*common.GitUploadPackInfo, error) {
+ res, err := s.doRequest("GET", common.GitUploadPackServiceName, nil)
+ if err != nil {
+ return nil, err
+ }
+
+ defer res.Body.Close()
+
+ dec := pktline.NewDecoder(res.Body)
+ return common.NewGitUploadPackInfo(dec)
+}
+
+func (s *GitUploadPackService) doRequest(method, service string, content *strings.Reader) (*http.Response, error) {
+ var body io.Reader
+ if content != nil {
+ body = content
+ }
+
+ req, err := http.NewRequest(method, s.endpoint.Service(service), body)
+ if err != nil {
+ return nil, err
+ }
+
+ s.applyHeadersToRequest(req, content)
+
+ res, err := s.Client.Do(req)
+ if err != nil {
+ return nil, err
+ }
+
+ if err := NewHTTPError(res); err != nil {
+ return nil, err
+ }
+
+ return res, nil
+}
+
+func (s *GitUploadPackService) applyHeadersToRequest(req *http.Request, content *strings.Reader) {
+ req.Header.Add("User-Agent", "git/1.0")
+ req.Header.Add("Host", "github.com")
+
+ if content == nil {
+ req.Header.Add("Accept", "*/*")
+ } else {
+ req.Header.Add("Accept", "application/x-git-upload-pack-result")
+ req.Header.Add("Content-Type", "application/x-git-upload-pack-request")
+ req.Header.Add("Content-Length", string(content.Len()))
+ }
+}