11package registry
22
33import (
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
1413func (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