fix handling of redirect from asset download

This commit is contained in:
Alex Suraci
2016-07-09 18:32:35 -07:00
parent 12003714cf
commit 3a7443448e
72 changed files with 10743 additions and 680 deletions

View File

@@ -10,19 +10,18 @@ import (
"golang.org/x/oauth2"
"github.com/google/go-github/github"
"github.com/xoebus/statham"
)
//go:generate counterfeiter . GitHub
type GitHub interface {
ListReleases() ([]github.RepositoryRelease, error)
ListReleases() ([]*github.RepositoryRelease, error)
GetReleaseByTag(tag string) (*github.RepositoryRelease, error)
GetRelease(id int) (*github.RepositoryRelease, error)
CreateRelease(release github.RepositoryRelease) (*github.RepositoryRelease, error)
UpdateRelease(release github.RepositoryRelease) (*github.RepositoryRelease, error)
ListReleaseAssets(release github.RepositoryRelease) ([]github.ReleaseAsset, error)
ListReleaseAssets(release github.RepositoryRelease) ([]*github.ReleaseAsset, error)
UploadReleaseAsset(release github.RepositoryRelease, name string, file *os.File) error
DeleteReleaseAsset(asset github.ReleaseAsset) error
DownloadReleaseAsset(asset github.ReleaseAsset) (io.ReadCloser, error)
@@ -156,7 +155,7 @@ func (g *GitHubClient) UpdateRelease(release github.RepositoryRelease) (*github.
func (g *GitHubClient) ListReleaseAssets(release github.RepositoryRelease) ([]*github.ReleaseAsset, error) {
assets, res, err := g.client.Repositories.ListReleaseAssets(g.user, g.repository, *release.ID, nil)
if err != nil {
return []*github.ReleaseAsset{}, err
return nil, err
}
err = res.Body.Close()
@@ -194,11 +193,20 @@ func (g *GitHubClient) DeleteReleaseAsset(asset github.ReleaseAsset) error {
}
func (g *GitHubClient) DownloadReleaseAsset(asset github.ReleaseAsset) (io.ReadCloser, error) {
res, _, err := g.client.Repositories.DownloadReleaseAsset(g.user, g.repository, *asset.ID)
res, redir, err := g.client.Repositories.DownloadReleaseAsset(g.user, g.repository, *asset.ID)
if err != nil {
return nil, err
}
if redir != "" {
resp, err := http.Get(redir)
if err != nil {
return nil, err
}
return resp.Body, nil
}
return res, err
}
@@ -226,40 +234,12 @@ func oauthClient(source Source) (*github.Client, error) {
ts := oauth2.StaticTokenSource(&oauth2.Token{
AccessToken: source.AccessToken,
})
oauthClient := oauth2.NewClient(oauth2.NoContext, ts)
apiHost := "api.github.com"
if source.GitHubAPIURL != "" {
uri, err := url.Parse(source.GitHubAPIURL)
if err != nil {
return nil, err
}
apiHost = uri.Host
githubHTTPClient := &http.Client{
Transport: oauthClient.Transport,
}
uploadHost := "uploads.github.com"
if source.GitHubUploadsURL != "" {
uri, err := url.Parse(source.GitHubUploadsURL)
if err != nil {
return nil, err
}
uploadHost = uri.Host
}
// The google/go-github library uses the same http.Client to perform
// requests to both github.com and the S3 download API (for downloading
// release assets). We don't want it to user the same OAuth transport for
// both.
transport := statham.NewTransport(http.DefaultTransport, statham.Mapping{
apiHost: oauthClient.Transport,
uploadHost: oauthClient.Transport,
})
httpClient := &http.Client{
Transport: transport,
}
return github.NewClient(httpClient), nil
return github.NewClient(githubHTTPClient), nil
}