Skip to content
This repository was archived by the owner on Nov 10, 2021. It is now read-only.

Commit cd8eb23

Browse files
committed
merging uploadLayer from kispaljr/docker-registry-client
1 parent 64f0c4b commit cd8eb23

1 file changed

Lines changed: 27 additions & 39 deletions

File tree

registry/blob.go

Lines changed: 27 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,13 @@
11
package registry
22

33
import (
4-
"bytes"
4+
"fmt"
55
"io"
66
"net/http"
77
"net/url"
88

99
"github.com/docker/distribution"
1010
digest "github.com/opencontainers/go-digest"
11-
"github.com/pkg/errors"
1211
)
1312

1413
func (registry *Registry) DownloadBlob(repository string, digest digest.Digest) (io.ReadCloser, error) {
@@ -30,60 +29,49 @@ func (registry *Registry) UploadBlobToArtifactory(repository string, digest dige
3029
if err != nil {
3130
return err
3231
}
32+
q := uploadUrl.Query()
33+
q.Set("digest", digest.String())
34+
uploadUrl.RawQuery = q.Encode()
3335

34-
registry.Logf("registry.blob.chunkedUpload url=%s repository=%s digest=%s", uploadUrl, repository, digest)
36+
registry.Logf("registry.layer.upload url=%s repository=%s digest=%s", uploadUrl, repository, digest)
3537

36-
upload, err := http.NewRequest("PATCH", uploadUrl.String(), content)
38+
uploadStep1, err := http.NewRequest("PATCH", uploadUrl.String(), content)
3739
if err != nil {
3840
return err
3941
}
40-
upload.Header.Set("Content-Type", "application/octet-stream")
42+
uploadStep1.Header.Set("Content-Type", "application/octet-stream")
4143
if getBody != nil {
42-
upload.GetBody = getBody
43-
}
44-
45-
resp, err := registry.Client.Do(upload)
46-
if err != nil {
47-
return err
44+
uploadStep1.GetBody = getBody
4845
}
49-
if resp.StatusCode != 202 {
50-
buf := new(bytes.Buffer)
51-
buf.ReadFrom(resp.Body)
52-
return errors.Errorf("retrieving %+v returned %v response: %s", uploadUrl, resp.Status, buf.String())
46+
resp1, err := registry.Client.Do(uploadStep1)
47+
if resp1 != nil {
48+
defer resp1.Body.Close()
5349
}
54-
_ = resp.Body.Close()
55-
56-
q := uploadUrl.Query()
57-
q.Set("digest", digest.String())
58-
uploadUrl.RawQuery = q.Encode()
59-
60-
upload, err = http.NewRequest("PUT", uploadUrl.String(), nil) //sending zero length body
61-
62-
registry.Logf("registry.blob.completeChunkedUpload url=%s repository=%s digest=%s", uploadUrl, repository, digest)
63-
50+
// TODO: retry upload more than 0 bytes were successfully transferred
51+
// (HEAD upload UUID, adn check the Range header)
6452
if err != nil {
65-
return err
53+
if resp1 == nil {
54+
return fmt.Errorf("error while uploading layer to %s, digest: %s: %s", repository, digest, err)
55+
56+
} else {
57+
return fmt.Errorf("error while uploading layer to %s: %v %v: digest: %s: %s", repository, resp1.StatusCode, resp1.Status, digest, err)
58+
}
6659
}
67-
upload.Header.Set("Content-Type", "application/octet-stream")
68-
upload.Header.Set("Content-Range", "0-0")
69-
upload.Header.Set("Content-Length", "0")
70-
if getBody != nil {
71-
upload.GetBody = getBody
60+
if resp1.StatusCode != 202 {
61+
return fmt.Errorf("unexpected PATCH response while uploading layer to %s: %v %v: digest: %s", repository, resp1.StatusCode, resp1.Status, digest)
7262
}
7363

74-
resp, err = registry.Client.Do(upload)
64+
uploadStep2, err := http.NewRequest("PUT", uploadUrl.String(), nil)
7565
if err != nil {
7666
return err
7767
}
78-
if resp.StatusCode != 201 {
79-
buf := new(bytes.Buffer)
80-
buf.ReadFrom(resp.Body)
81-
return errors.Errorf("retrieving %+v returned %v response: %s", uploadUrl, resp.Status, buf.String())
68+
uploadStep2.Header.Set("Content-Type", "application/octet-stream")
69+
if getBody != nil {
70+
uploadStep2.GetBody = getBody
8271
}
8372

84-
_ = resp.Body.Close()
85-
86-
return nil
73+
_, err = registry.Client.Do(uploadStep2)
74+
return err
8775
}
8876

8977
// UploadBlob can be used to upload an FS layer or an image config file into the given repository.

0 commit comments

Comments
 (0)