@@ -100,13 +100,6 @@ func ResolveRepositoryName(reposName string) (string, string, error) {
100100 return endpoint , reposName , err
101101}
102102
103- // VersionInfo is used to model entities which has a version.
104- // It is basically a tupple with name and version.
105- type VersionInfo interface {
106- Name () string
107- Version () string
108- }
109-
110103func doWithCookies (c * http.Client , req * http.Request ) (* http.Response , error ) {
111104 for _ , cookie := range c .Jar .Cookies (req .URL ) {
112105 req .AddCookie (cookie )
@@ -121,29 +114,14 @@ func doWithCookies(c *http.Client, req *http.Request) (*http.Response, error) {
121114 return res , err
122115}
123116
124- // Set the user agent field in the header based on the versions provided
125- // in NewRegistry() and extra.
126- func (r * Registry ) setUserAgent (req * http.Request , extra ... VersionInfo ) {
127- if len (r .baseVersions )+ len (extra ) == 0 {
128- return
129- }
130- if len (extra ) == 0 {
131- req .Header .Set ("User-Agent" , r .baseVersionsStr )
132- } else {
133- req .Header .Set ("User-Agent" , appendVersions (r .baseVersionsStr , extra ... ))
134- }
135- return
136- }
137-
138117// Retrieve the history of a given image from the Registry.
139118// Return a list of the parent's json (requested image included)
140119func (r * Registry ) GetRemoteHistory (imgID , registry string , token []string ) ([]string , error ) {
141- req , err := http .NewRequest ("GET" , registry + "images/" + imgID + "/ancestry" , nil )
120+ req , err := r . reqFactory .NewRequest ("GET" , registry + "images/" + imgID + "/ancestry" , nil )
142121 if err != nil {
143122 return nil , err
144123 }
145124 req .Header .Set ("Authorization" , "Token " + strings .Join (token , ", " ))
146- r .setUserAgent (req )
147125 res , err := doWithCookies (r .client , req )
148126 if err != nil || res .StatusCode != 200 {
149127 if res != nil {
@@ -170,7 +148,7 @@ func (r *Registry) GetRemoteHistory(imgID, registry string, token []string) ([]s
170148func (r * Registry ) LookupRemoteImage (imgID , registry string , token []string ) bool {
171149 rt := & http.Transport {Proxy : http .ProxyFromEnvironment }
172150
173- req , err := http .NewRequest ("GET" , registry + "images/" + imgID + "/json" , nil )
151+ req , err := r . reqFactory .NewRequest ("GET" , registry + "images/" + imgID + "/json" , nil )
174152 if err != nil {
175153 return false
176154 }
@@ -185,12 +163,11 @@ func (r *Registry) LookupRemoteImage(imgID, registry string, token []string) boo
185163// Retrieve an image from the Registry.
186164func (r * Registry ) GetRemoteImageJSON (imgID , registry string , token []string ) ([]byte , int , error ) {
187165 // Get the JSON
188- req , err := http .NewRequest ("GET" , registry + "images/" + imgID + "/json" , nil )
166+ req , err := r . reqFactory .NewRequest ("GET" , registry + "images/" + imgID + "/json" , nil )
189167 if err != nil {
190168 return nil , - 1 , fmt .Errorf ("Failed to download json: %s" , err )
191169 }
192170 req .Header .Set ("Authorization" , "Token " + strings .Join (token , ", " ))
193- r .setUserAgent (req )
194171 res , err := doWithCookies (r .client , req )
195172 if err != nil {
196173 return nil , - 1 , fmt .Errorf ("Failed to download json: %s" , err )
@@ -213,12 +190,11 @@ func (r *Registry) GetRemoteImageJSON(imgID, registry string, token []string) ([
213190}
214191
215192func (r * Registry ) GetRemoteImageLayer (imgID , registry string , token []string ) (io.ReadCloser , error ) {
216- req , err := http .NewRequest ("GET" , registry + "images/" + imgID + "/layer" , nil )
193+ req , err := r . reqFactory .NewRequest ("GET" , registry + "images/" + imgID + "/layer" , nil )
217194 if err != nil {
218195 return nil , fmt .Errorf ("Error while getting from the server: %s\n " , err )
219196 }
220197 req .Header .Set ("Authorization" , "Token " + strings .Join (token , ", " ))
221- r .setUserAgent (req )
222198 res , err := doWithCookies (r .client , req )
223199 if err != nil {
224200 return nil , err
@@ -239,7 +215,6 @@ func (r *Registry) GetRemoteTags(registries []string, repository string, token [
239215 return nil , err
240216 }
241217 req .Header .Set ("Authorization" , "Token " + strings .Join (token , ", " ))
242- r .setUserAgent (req )
243218 res , err := doWithCookies (r .client , req )
244219 if err != nil {
245220 return nil , err
@@ -281,7 +256,6 @@ func (r *Registry) GetRepositoryData(indexEp, remote string) (*RepositoryData, e
281256 req .SetBasicAuth (r .authConfig .Username , r .authConfig .Password )
282257 }
283258 req .Header .Set ("X-Docker-Token" , "true" )
284- r .setUserAgent (req )
285259
286260 res , err := r .client .Do (req )
287261 if err != nil {
@@ -339,7 +313,7 @@ func (r *Registry) PushImageChecksumRegistry(imgData *ImgData, registry string,
339313
340314 utils .Debugf ("[registry] Calling PUT %s" , registry + "images/" + imgData .ID + "/checksum" )
341315
342- req , err := http .NewRequest ("PUT" , registry + "images/" + imgData .ID + "/checksum" , nil )
316+ req , err := r . reqFactory .NewRequest ("PUT" , registry + "images/" + imgData .ID + "/checksum" , nil )
343317 if err != nil {
344318 return err
345319 }
@@ -375,13 +349,12 @@ func (r *Registry) PushImageJSONRegistry(imgData *ImgData, jsonRaw []byte, regis
375349
376350 utils .Debugf ("[registry] Calling PUT %s" , registry + "images/" + imgData .ID + "/json" )
377351
378- req , err := http .NewRequest ("PUT" , registry + "images/" + imgData .ID + "/json" , bytes .NewReader (jsonRaw ))
352+ req , err := r . reqFactory .NewRequest ("PUT" , registry + "images/" + imgData .ID + "/json" , bytes .NewReader (jsonRaw ))
379353 if err != nil {
380354 return err
381355 }
382356 req .Header .Add ("Content-type" , "application/json" )
383357 req .Header .Set ("Authorization" , "Token " + strings .Join (token , "," ))
384- r .setUserAgent (req )
385358
386359 res , err := doWithCookies (r .client , req )
387360 if err != nil {
@@ -410,14 +383,13 @@ func (r *Registry) PushImageLayerRegistry(imgID string, layer io.Reader, registr
410383
411384 tarsumLayer := & utils.TarSum {Reader : layer }
412385
413- req , err := http .NewRequest ("PUT" , registry + "images/" + imgID + "/layer" , tarsumLayer )
386+ req , err := r . reqFactory .NewRequest ("PUT" , registry + "images/" + imgID + "/layer" , tarsumLayer )
414387 if err != nil {
415388 return "" , err
416389 }
417390 req .ContentLength = - 1
418391 req .TransferEncoding = []string {"chunked" }
419392 req .Header .Set ("Authorization" , "Token " + strings .Join (token , "," ))
420- r .setUserAgent (req )
421393 res , err := doWithCookies (r .client , req )
422394 if err != nil {
423395 return "" , fmt .Errorf ("Failed to upload layer: %s" , err )
@@ -435,7 +407,7 @@ func (r *Registry) PushImageLayerRegistry(imgID string, layer io.Reader, registr
435407}
436408
437409func (r * Registry ) opaqueRequest (method , urlStr string , body io.Reader ) (* http.Request , error ) {
438- req , err := http .NewRequest (method , urlStr , body )
410+ req , err := r . reqFactory .NewRequest (method , urlStr , body )
439411 if err != nil {
440412 return nil , err
441413 }
@@ -455,7 +427,6 @@ func (r *Registry) PushRegistryTag(remote, revision, tag, registry string, token
455427 }
456428 req .Header .Add ("Content-type" , "application/json" )
457429 req .Header .Set ("Authorization" , "Token " + strings .Join (token , "," ))
458- r .setUserAgent (req )
459430 req .ContentLength = int64 (len (revision ))
460431 res , err := doWithCookies (r .client , req )
461432 if err != nil {
@@ -500,7 +471,6 @@ func (r *Registry) PushImageJSONIndex(indexEp, remote string, imgList []*ImgData
500471 req .SetBasicAuth (r .authConfig .Username , r .authConfig .Password )
501472 req .ContentLength = int64 (len (imgListJSON ))
502473 req .Header .Set ("X-Docker-Token" , "true" )
503- r .setUserAgent (req )
504474 if validate {
505475 req .Header ["X-Docker-Endpoints" ] = regs
506476 }
@@ -521,7 +491,6 @@ func (r *Registry) PushImageJSONIndex(indexEp, remote string, imgList []*ImgData
521491 req .SetBasicAuth (r .authConfig .Username , r .authConfig .Password )
522492 req .ContentLength = int64 (len (imgListJSON ))
523493 req .Header .Set ("X-Docker-Token" , "true" )
524- r .setUserAgent (req )
525494 if validate {
526495 req .Header ["X-Docker-Endpoints" ] = regs
527496 }
@@ -576,7 +545,7 @@ func (r *Registry) PushImageJSONIndex(indexEp, remote string, imgList []*ImgData
576545
577546func (r * Registry ) SearchRepositories (term string ) (* SearchResults , error ) {
578547 u := auth .IndexServerAddress () + "search?q=" + url .QueryEscape (term )
579- req , err := http .NewRequest ("GET" , u , nil )
548+ req , err := r . reqFactory .NewRequest ("GET" , u , nil )
580549 if err != nil {
581550 return nil , err
582551 }
@@ -628,52 +597,12 @@ type ImgData struct {
628597}
629598
630599type Registry struct {
631- client * http.Client
632- authConfig * auth.AuthConfig
633- baseVersions []VersionInfo
634- baseVersionsStr string
600+ client * http.Client
601+ authConfig * auth.AuthConfig
602+ reqFactory * utils.HTTPRequestFactory
635603}
636604
637- func validVersion (version VersionInfo ) bool {
638- stopChars := " \t \r \n /"
639- if strings .ContainsAny (version .Name (), stopChars ) {
640- return false
641- }
642- if strings .ContainsAny (version .Version (), stopChars ) {
643- return false
644- }
645- return true
646- }
647-
648- // Convert versions to a string and append the string to the string base.
649- //
650- // Each VersionInfo will be converted to a string in the format of
651- // "product/version", where the "product" is get from the Name() method, while
652- // version is get from the Version() method. Several pieces of verson information
653- // will be concatinated and separated by space.
654- func appendVersions (base string , versions ... VersionInfo ) string {
655- if len (versions ) == 0 {
656- return base
657- }
658-
659- var buf bytes.Buffer
660- if len (base ) > 0 {
661- buf .Write ([]byte (base ))
662- }
663-
664- for _ , v := range versions {
665- if ! validVersion (v ) {
666- continue
667- }
668- buf .Write ([]byte (v .Name ()))
669- buf .Write ([]byte ("/" ))
670- buf .Write ([]byte (v .Version ()))
671- buf .Write ([]byte (" " ))
672- }
673- return buf .String ()
674- }
675-
676- func NewRegistry (root string , authConfig * auth.AuthConfig , baseVersions ... VersionInfo ) (r * Registry , err error ) {
605+ func NewRegistry (root string , authConfig * auth.AuthConfig , factory * utils.HTTPRequestFactory ) (r * Registry , err error ) {
677606 httpTransport := & http.Transport {
678607 DisableKeepAlives : true ,
679608 Proxy : http .ProxyFromEnvironment ,
@@ -689,7 +618,7 @@ func NewRegistry(root string, authConfig *auth.AuthConfig, baseVersions ...Versi
689618 if err != nil {
690619 return nil , err
691620 }
692- r . baseVersions = baseVersions
693- r .baseVersionsStr = appendVersions ( "" , baseVersions ... )
621+
622+ r .reqFactory = factory
694623 return r , nil
695624}
0 commit comments