package lfshttp import ( "encoding/json" "fmt" "net/http" "regexp" "github.com/git-lfs/git-lfs/config" "github.com/git-lfs/git-lfs/errors" "github.com/git-lfs/git-lfs/git" ) var ( lfsMediaTypeRE = regexp.MustCompile(`\Aapplication/vnd\.git\-lfs\+json(;|\z)`) jsonMediaTypeRE = regexp.MustCompile(`\Aapplication/json(;|\z)`) ) type Context interface { GitConfig() *git.Configuration OSEnv() config.Environment GitEnv() config.Environment } func NewContext(gitConf *git.Configuration, osEnv, gitEnv map[string]string) Context { c := &testContext{gitConfig: gitConf} if c.gitConfig == nil { c.gitConfig = git.NewConfig("", "") } if osEnv != nil { c.osEnv = testEnv(osEnv) } else { c.osEnv = make(testEnv) } if gitEnv != nil { c.gitEnv = testEnv(gitEnv) } else { c.gitEnv = make(testEnv) } return c } type testContext struct { gitConfig *git.Configuration osEnv config.Environment gitEnv config.Environment } func (c *testContext) GitConfig() *git.Configuration { return c.gitConfig } func (c *testContext) OSEnv() config.Environment { return c.osEnv } func (c *testContext) GitEnv() config.Environment { return c.gitEnv } func IsDecodeTypeError(err error) bool { _, ok := err.(*decodeTypeError) return ok } type decodeTypeError struct { Type string } func (e *decodeTypeError) TypeError() {} func (e *decodeTypeError) Error() string { return fmt.Sprintf("Expected json type, got: %q", e.Type) } func DecodeJSON(res *http.Response, obj interface{}) error { ctype := res.Header.Get("Content-Type") if !(lfsMediaTypeRE.MatchString(ctype) || jsonMediaTypeRE.MatchString(ctype)) { return &decodeTypeError{Type: ctype} } err := json.NewDecoder(res.Body).Decode(obj) res.Body.Close() if err != nil { return errors.Wrapf(err, "Unable to parse HTTP response for %s %s", res.Request.Method, res.Request.URL) } return nil }