| ... | ... |
@@ -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 {
|