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

Commit

Permalink
merging uploadLayer from kispaljr/docker-registry-client
Browse files Browse the repository at this point in the history
  • Loading branch information
christianjoun committed Jul 3, 2019
1 parent 64f0c4b commit cd8eb23
Showing 1 changed file with 27 additions and 39 deletions.
66 changes: 27 additions & 39 deletions registry/blob.go
Original file line number Diff line number Diff line change
@@ -1,14 +1,13 @@
package registry

import (
"bytes"
"fmt"
"io"
"net/http"
"net/url"

"github.com/docker/distribution"
digest "github.com/opencontainers/go-digest"
"github.com/pkg/errors"
)

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

registry.Logf("registry.blob.chunkedUpload url=%s repository=%s digest=%s", uploadUrl, repository, digest)
registry.Logf("registry.layer.upload url=%s repository=%s digest=%s", uploadUrl, repository, digest)

upload, err := http.NewRequest("PATCH", uploadUrl.String(), content)
uploadStep1, err := http.NewRequest("PATCH", uploadUrl.String(), content)
if err != nil {
return err
}
upload.Header.Set("Content-Type", "application/octet-stream")
uploadStep1.Header.Set("Content-Type", "application/octet-stream")
if getBody != nil {
upload.GetBody = getBody
}

resp, err := registry.Client.Do(upload)
if err != nil {
return err
uploadStep1.GetBody = getBody
}
if resp.StatusCode != 202 {
buf := new(bytes.Buffer)
buf.ReadFrom(resp.Body)
return errors.Errorf("retrieving %+v returned %v response: %s", uploadUrl, resp.Status, buf.String())
resp1, err := registry.Client.Do(uploadStep1)
if resp1 != nil {
defer resp1.Body.Close()
}
_ = resp.Body.Close()

q := uploadUrl.Query()
q.Set("digest", digest.String())
uploadUrl.RawQuery = q.Encode()

upload, err = http.NewRequest("PUT", uploadUrl.String(), nil) //sending zero length body

registry.Logf("registry.blob.completeChunkedUpload url=%s repository=%s digest=%s", uploadUrl, repository, digest)

// TODO: retry upload more than 0 bytes were successfully transferred
// (HEAD upload UUID, adn check the Range header)
if err != nil {
return err
if resp1 == nil {
return fmt.Errorf("error while uploading layer to %s, digest: %s: %s", repository, digest, err)

} else {
return fmt.Errorf("error while uploading layer to %s: %v %v: digest: %s: %s", repository, resp1.StatusCode, resp1.Status, digest, err)
}
}
upload.Header.Set("Content-Type", "application/octet-stream")
upload.Header.Set("Content-Range", "0-0")
upload.Header.Set("Content-Length", "0")
if getBody != nil {
upload.GetBody = getBody
if resp1.StatusCode != 202 {
return fmt.Errorf("unexpected PATCH response while uploading layer to %s: %v %v: digest: %s", repository, resp1.StatusCode, resp1.Status, digest)
}

resp, err = registry.Client.Do(upload)
uploadStep2, err := http.NewRequest("PUT", uploadUrl.String(), nil)
if err != nil {
return err
}
if resp.StatusCode != 201 {
buf := new(bytes.Buffer)
buf.ReadFrom(resp.Body)
return errors.Errorf("retrieving %+v returned %v response: %s", uploadUrl, resp.Status, buf.String())
uploadStep2.Header.Set("Content-Type", "application/octet-stream")
if getBody != nil {
uploadStep2.GetBody = getBody
}

_ = resp.Body.Close()

return nil
_, err = registry.Client.Do(uploadStep2)
return err
}

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

0 comments on commit cd8eb23

Please sign in to comment.