This repository has been archived by the owner on Mar 24, 2023. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 70
/
http_upload.go
99 lines (85 loc) · 2.34 KB
/
http_upload.go
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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
package util
import (
"io/ioutil"
"net/http"
"os"
"path"
"github.com/go-kit/kit/log"
"github.com/go-kit/kit/log/level"
"github.com/mholt/archiver"
"github.com/pkg/errors"
)
type AssetUploader interface {
UploadAssets(target string) error
}
type assetUploader struct {
logger log.Logger
tar archiver.Archiver
client *http.Client
}
func NewAssetUploader(
logger log.Logger,
client *http.Client,
) AssetUploader {
return &assetUploader{
logger: log.With(logger, "struct", "assetUploader"),
client: client,
}
}
// i need tests
func (a *assetUploader) UploadAssets(target string) error {
debug := log.With(level.Debug(a.logger), "method", "UploadAssets")
currentWorkingDir, err := os.Getwd()
if err != nil {
return errors.Wrapf(err, "get working directory")
}
debug.Log("event", "tmpdir.create")
// need a real tmpdir because archiver library doesn't support Afero
tmpdir, err := ioutil.TempDir("", "ship-archive")
if err != nil {
return errors.Wrapf(err, "create temp dir")
}
defer os.RemoveAll(tmpdir)
// in normal use this means that the targz archiver will be used, but tests can set something else if needed
if a.tar == nil {
a.tar = archiver.TarGz
}
debug.Log("event", "archive.create")
archivePath := path.Join(tmpdir, "assets.tar.gz")
err = a.tar.Make(archivePath, []string{currentWorkingDir})
if err != nil {
return errors.Wrapf(err, "create archive at ")
}
debug.Log("event", "archive.open")
archive, err := os.Open(archivePath)
if err != nil {
return errors.Wrap(err, "open archive")
}
debug.Log("event", "request.create")
request, err := http.NewRequest("PUT", target, archive)
if err != nil {
return errors.Wrap(err, "create request")
}
stat, err := archive.Stat()
if err != nil {
return errors.Wrap(err, "get archive info")
}
request.ContentLength = stat.Size()
debug.Log("event", "request.send")
resp, err := a.client.Do(request)
if err != nil {
return errors.Wrap(err, "send request")
} else if resp == nil {
return errors.Errorf("request returned no error, but was nil")
}
if resp.StatusCode > 299 {
if resp.Body != nil {
body, err := ioutil.ReadAll(resp.Body)
if err == nil {
return errors.Errorf("request returned status code %d and body %q", resp.StatusCode, string(body))
}
}
return errors.Errorf("request returned status code %d", resp.StatusCode)
}
return nil
}