aboutsummaryrefslogtreecommitdiffstats
path: root/clients/http
diff options
context:
space:
mode:
authorMáximo Cuadros <mcuadros@gmail.com>2015-10-23 00:34:40 +0200
committerMáximo Cuadros <mcuadros@gmail.com>2015-10-23 00:34:40 +0200
commitb359f11ea09e642695edcd114b463da4395b10c1 (patch)
tree6f84c4693429a3815b7523e957801cdb420abb40 /clients/http
parent6f43e8933ba3c04072d5d104acc6118aac3e52ee (diff)
downloadgo-git-b359f11ea09e642695edcd114b463da4395b10c1.tar.gz
clients: supporting diferent protocols
Diffstat (limited to 'clients/http')
-rw-r--r--clients/http/common.go28
-rw-r--r--clients/http/common_test.go9
-rw-r--r--clients/http/git_upload_pack.go78
-rw-r--r--clients/http/git_upload_pack_test.go32
4 files changed, 147 insertions, 0 deletions
diff --git a/clients/http/common.go b/clients/http/common.go
new file mode 100644
index 0000000..a0f012e
--- /dev/null
+++ b/clients/http/common.go
@@ -0,0 +1,28 @@
+package http
+
+import (
+ "fmt"
+ "net/http"
+)
+
+type HTTPError struct {
+ Response *http.Response
+}
+
+func NewHTTPError(r *http.Response) *HTTPError {
+ if r.StatusCode >= 200 && r.StatusCode < 300 {
+ return nil
+ }
+
+ return &HTTPError{r}
+}
+
+func (e *HTTPError) StatusCode() int {
+ return e.Response.StatusCode
+}
+
+func (e *HTTPError) Error() string {
+ return fmt.Sprintf("Error requesting %q status code: %d",
+ e.Response.Request.URL, e.Response.StatusCode,
+ )
+}
diff --git a/clients/http/common_test.go b/clients/http/common_test.go
new file mode 100644
index 0000000..b672801
--- /dev/null
+++ b/clients/http/common_test.go
@@ -0,0 +1,9 @@
+package http
+
+import (
+ "testing"
+
+ . "gopkg.in/check.v1"
+)
+
+func Test(t *testing.T) { TestingT(t) }
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()))
+ }
+}
diff --git a/clients/http/git_upload_pack_test.go b/clients/http/git_upload_pack_test.go
new file mode 100644
index 0000000..b478445
--- /dev/null
+++ b/clients/http/git_upload_pack_test.go
@@ -0,0 +1,32 @@
+package http
+
+import . "gopkg.in/check.v1"
+
+type SuiteRemote struct{}
+
+var _ = Suite(&SuiteRemote{})
+
+const RepositoryFixture = "https://github.com/tyba/git-fixture"
+
+func (s *SuiteRemote) TestConnect(c *C) {
+ r := NewGitUploadPackService()
+ c.Assert(r.Connect(RepositoryFixture), IsNil)
+}
+
+func (s *SuiteRemote) TestDefaultBranch(c *C) {
+ r := NewGitUploadPackService()
+ c.Assert(r.Connect(RepositoryFixture), IsNil)
+
+ info, err := r.Info()
+ c.Assert(err, IsNil)
+ c.Assert(info.Capabilities.SymbolicReference("HEAD"), Equals, "refs/heads/master")
+}
+
+func (s *SuiteRemote) TestCapabilities(c *C) {
+ r := NewGitUploadPackService()
+ c.Assert(r.Connect(RepositoryFixture), IsNil)
+
+ info, err := r.Info()
+ c.Assert(err, IsNil)
+ c.Assert(info.Capabilities.Get("agent"), HasLen, 1)
+}