Browse code

Use additional decorator in RequestFactory to pass meta headers to registry

shin- authored on 2013/08/23 04:15:31
Showing 4 changed files
... ...
@@ -101,7 +101,7 @@ func postAuth(srv *Server, version float64, w http.ResponseWriter, r *http.Reque
101 101
 	if err != nil {
102 102
 		return err
103 103
 	}
104
-	status, err := auth.Login(authConfig, srv.HTTPRequestFactory())
104
+	status, err := auth.Login(authConfig, srv.HTTPRequestFactory(nil))
105 105
 	if err != nil {
106 106
 		return err
107 107
 	}
... ...
@@ -399,7 +399,13 @@ func postImagesCreate(srv *Server, version float64, w http.ResponseWriter, r *ht
399 399
 	}
400 400
 	sf := utils.NewStreamFormatter(version > 1.0)
401 401
 	if image != "" { //pull
402
-		if err := srv.ImagePull(image, tag, w, sf, &auth.AuthConfig{}, version > 1.3); err != nil {
402
+		metaHeaders := map[string][]string{}
403
+		for k, v := range r.Header {
404
+			if strings.HasPrefix(k, "X-Meta-") {
405
+				metaHeaders[k] = v
406
+			}
407
+		}
408
+		if err := srv.ImagePull(image, tag, w, sf, &auth.AuthConfig{}, metaHeaders, version > 1.3); err != nil {
403 409
 			if sf.Used() {
404 410
 				w.Write(sf.FormatError(err))
405 411
 				return nil
... ...
@@ -468,6 +474,12 @@ func postImagesInsert(srv *Server, version float64, w http.ResponseWriter, r *ht
468 468
 
469 469
 func postImagesPush(srv *Server, version float64, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
470 470
 	authConfig := &auth.AuthConfig{}
471
+	metaHeaders := map[string][]string{}
472
+	for k, v := range r.Header {
473
+		if strings.HasPrefix(k, "X-Meta-") {
474
+			metaHeaders[k] = v
475
+		}
476
+	}
471 477
 	if err := json.NewDecoder(r.Body).Decode(authConfig); err != nil {
472 478
 		return err
473 479
 	}
... ...
@@ -483,7 +495,7 @@ func postImagesPush(srv *Server, version float64, w http.ResponseWriter, r *http
483 483
 		w.Header().Set("Content-Type", "application/json")
484 484
 	}
485 485
 	sf := utils.NewStreamFormatter(version > 1.0)
486
-	if err := srv.ImagePush(name, w, sf, authConfig); err != nil {
486
+	if err := srv.ImagePush(name, w, sf, authConfig, metaHeaders); err != nil {
487 487
 		if sf.Used() {
488 488
 			w.Write(sf.FormatError(err))
489 489
 			return nil
... ...
@@ -56,7 +56,7 @@ func (b *buildFile) CmdFrom(name string) error {
56 56
 	if err != nil {
57 57
 		if b.runtime.graph.IsNotExist(err) {
58 58
 			remote, tag := utils.ParseRepositoryTag(name)
59
-			if err := b.srv.ImagePull(remote, tag, b.out, utils.NewStreamFormatter(false), nil, true); err != nil {
59
+			if err := b.srv.ImagePull(remote, tag, b.out, utils.NewStreamFormatter(false), nil, nil, true); err != nil {
60 60
 				return err
61 61
 			}
62 62
 			image, err = b.runtime.repositories.LookupImage(name)
... ...
@@ -102,7 +102,7 @@ func (srv *Server) ContainerExport(name string, out io.Writer) error {
102 102
 }
103 103
 
104 104
 func (srv *Server) ImagesSearch(term string) ([]APISearch, error) {
105
-	r, err := registry.NewRegistry(srv.runtime.root, nil, srv.HTTPRequestFactory())
105
+	r, err := registry.NewRegistry(srv.runtime.root, nil, srv.HTTPRequestFactory(nil))
106 106
 	if err != nil {
107 107
 		return nil, err
108 108
 	}
... ...
@@ -632,8 +632,8 @@ func (srv *Server) poolRemove(kind, key string) error {
632 632
 	return nil
633 633
 }
634 634
 
635
-func (srv *Server) ImagePull(localName string, tag string, out io.Writer, sf *utils.StreamFormatter, authConfig *auth.AuthConfig, parallel bool) error {
636
-	r, err := registry.NewRegistry(srv.runtime.root, authConfig, srv.HTTPRequestFactory())
635
+func (srv *Server) ImagePull(localName string, tag string, out io.Writer, sf *utils.StreamFormatter, authConfig *auth.AuthConfig, metaHeaders map[string][]string, parallel bool) error {
636
+	r, err := registry.NewRegistry(srv.runtime.root, authConfig, srv.HTTPRequestFactory(metaHeaders))
637 637
 	if err != nil {
638 638
 		return err
639 639
 	}
... ...
@@ -780,7 +780,7 @@ func (srv *Server) pushImage(r *registry.Registry, out io.Writer, remote, imgID,
780 780
 }
781 781
 
782 782
 // FIXME: Allow to interrupt current push when new push of same image is done.
783
-func (srv *Server) ImagePush(localName string, out io.Writer, sf *utils.StreamFormatter, authConfig *auth.AuthConfig) error {
783
+func (srv *Server) ImagePush(localName string, out io.Writer, sf *utils.StreamFormatter, authConfig *auth.AuthConfig, metaHeaders map[string][]string) error {
784 784
 	if err := srv.poolAdd("push", localName); err != nil {
785 785
 		return err
786 786
 	}
... ...
@@ -794,7 +794,7 @@ func (srv *Server) ImagePush(localName string, out io.Writer, sf *utils.StreamFo
794 794
 
795 795
 	out = utils.NewWriteFlusher(out)
796 796
 	img, err := srv.runtime.graph.Get(localName)
797
-	r, err2 := registry.NewRegistry(srv.runtime.root, authConfig, srv.HTTPRequestFactory())
797
+	r, err2 := registry.NewRegistry(srv.runtime.root, authConfig, srv.HTTPRequestFactory(metaHeaders))
798 798
 	if err2 != nil {
799 799
 		return err2
800 800
 	}
... ...
@@ -1267,10 +1267,13 @@ func NewServer(flGraphPath string, autoRestart, enableCors bool, dns ListOpts) (
1267 1267
 	return srv, nil
1268 1268
 }
1269 1269
 
1270
-func (srv *Server) HTTPRequestFactory() *utils.HTTPRequestFactory {
1270
+func (srv *Server) HTTPRequestFactory(metaHeaders map[string][]string) *utils.HTTPRequestFactory {
1271 1271
 	if srv.reqFactory == nil {
1272 1272
 		ud := utils.NewHTTPUserAgentDecorator(srv.versionInfos()...)
1273
-		factory := utils.NewHTTPRequestFactory(ud)
1273
+		md := &utils.HTTPMetaHeadersDecorator{
1274
+			Headers: metaHeaders,
1275
+		}
1276
+		factory := utils.NewHTTPRequestFactory(ud, md)
1274 1277
 		srv.reqFactory = factory
1275 1278
 	}
1276 1279
 	return srv.reqFactory
... ...
@@ -93,6 +93,20 @@ func (self *HTTPUserAgentDecorator) ChangeRequest(req *http.Request) (newReq *ht
93 93
 	return req, nil
94 94
 }
95 95
 
96
+type HTTPMetaHeadersDecorator struct {
97
+	Headers map[string][]string
98
+}
99
+
100
+func (self *HTTPMetaHeadersDecorator) ChangeRequest(req *http.Request) (newReq *http.Request, err error) {
101
+	if self.Headers == nil {
102
+		return req, nil
103
+	}
104
+	for k, v := range self.Headers {
105
+		req.Header[k] = v
106
+	}
107
+	return req, nil
108
+}
109
+
96 110
 // HTTPRequestFactory creates an HTTP request
97 111
 // and applies a list of decorators on the request.
98 112
 type HTTPRequestFactory struct {