add middleware storage driver for redirect
Signed-off-by: Andrew Hsu <andrewhsu@acm.org> (github: andrewhsu)master
							parent
							
								
									cd27f179f2
								
							
						
					
					
						commit
						4b217ccbf5
					
				| 
						 | 
					@ -0,0 +1,47 @@
 | 
				
			||||||
 | 
					package middleware
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"fmt"
 | 
				
			||||||
 | 
						"github.com/docker/distribution/context"
 | 
				
			||||||
 | 
						storagedriver "github.com/docker/distribution/registry/storage/driver"
 | 
				
			||||||
 | 
						storagemiddleware "github.com/docker/distribution/registry/storage/driver/middleware"
 | 
				
			||||||
 | 
						"net/url"
 | 
				
			||||||
 | 
						"strings"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type redirectStorageMiddleware struct {
 | 
				
			||||||
 | 
						storagedriver.StorageDriver
 | 
				
			||||||
 | 
						scheme string
 | 
				
			||||||
 | 
						host   string
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					var _ storagedriver.StorageDriver = &redirectStorageMiddleware{}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func newRedirectStorageMiddleware(sd storagedriver.StorageDriver, options map[string]interface{}) (storagedriver.StorageDriver, error) {
 | 
				
			||||||
 | 
						o, ok := options["baseurl"]
 | 
				
			||||||
 | 
						if !ok {
 | 
				
			||||||
 | 
							return nil, fmt.Errorf("no baseurl provided")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						b, ok := o.(string)
 | 
				
			||||||
 | 
						if !ok {
 | 
				
			||||||
 | 
							return nil, fmt.Errorf("baseurl must be a string")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if !strings.Contains(b, "://") {
 | 
				
			||||||
 | 
							b = "https://" + b
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						u, err := url.Parse(b)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, fmt.Errorf("invalid baseurl: %v", err)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return &redirectStorageMiddleware{StorageDriver: sd, scheme: u.Scheme, host: u.Host}, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (r *redirectStorageMiddleware) URLFor(ctx context.Context, path string, options map[string]interface{}) (string, error) {
 | 
				
			||||||
 | 
						u := &url.URL{Scheme: r.scheme, Host: r.host, Path: path}
 | 
				
			||||||
 | 
						return u.String(), nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func init() {
 | 
				
			||||||
 | 
						storagemiddleware.Register("redirect", storagemiddleware.InitFunc(newRedirectStorageMiddleware))
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,62 @@
 | 
				
			||||||
 | 
					package middleware
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						check "gopkg.in/check.v1"
 | 
				
			||||||
 | 
						"testing"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func Test(t *testing.T) { check.TestingT(t) }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type MiddlewareSuite struct{}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					var _ = check.Suite(&MiddlewareSuite{})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (s *MiddlewareSuite) TestNoConfig(c *check.C) {
 | 
				
			||||||
 | 
						options := make(map[string]interface{})
 | 
				
			||||||
 | 
						_, err := newRedirectStorageMiddleware(nil, options)
 | 
				
			||||||
 | 
						c.Assert(err, check.ErrorMatches, "no baseurl provided")
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (s *MiddlewareSuite) TestDefaultScheme(c *check.C) {
 | 
				
			||||||
 | 
						options := make(map[string]interface{})
 | 
				
			||||||
 | 
						options["baseurl"] = "example.com"
 | 
				
			||||||
 | 
						middleware, err := newRedirectStorageMiddleware(nil, options)
 | 
				
			||||||
 | 
						c.Assert(err, check.Equals, nil)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						m, ok := middleware.(*redirectStorageMiddleware)
 | 
				
			||||||
 | 
						c.Assert(ok, check.Equals, true)
 | 
				
			||||||
 | 
						c.Assert(m.scheme, check.Equals, "https")
 | 
				
			||||||
 | 
						c.Assert(m.host, check.Equals, "example.com")
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (s *MiddlewareSuite) TestHTTPS(c *check.C) {
 | 
				
			||||||
 | 
						options := make(map[string]interface{})
 | 
				
			||||||
 | 
						options["baseurl"] = "https://example.com"
 | 
				
			||||||
 | 
						middleware, err := newRedirectStorageMiddleware(nil, options)
 | 
				
			||||||
 | 
						c.Assert(err, check.Equals, nil)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						m, ok := middleware.(*redirectStorageMiddleware)
 | 
				
			||||||
 | 
						c.Assert(ok, check.Equals, true)
 | 
				
			||||||
 | 
						c.Assert(m.scheme, check.Equals, "https")
 | 
				
			||||||
 | 
						c.Assert(m.host, check.Equals, "example.com")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						url, err := middleware.URLFor(nil, "/rick/data", nil)
 | 
				
			||||||
 | 
						c.Assert(err, check.Equals, nil)
 | 
				
			||||||
 | 
						c.Assert(url, check.Equals, "https://example.com/rick/data")
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (s *MiddlewareSuite) TestHTTP(c *check.C) {
 | 
				
			||||||
 | 
						options := make(map[string]interface{})
 | 
				
			||||||
 | 
						options["baseurl"] = "http://example.com"
 | 
				
			||||||
 | 
						middleware, err := newRedirectStorageMiddleware(nil, options)
 | 
				
			||||||
 | 
						c.Assert(err, check.Equals, nil)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						m, ok := middleware.(*redirectStorageMiddleware)
 | 
				
			||||||
 | 
						c.Assert(ok, check.Equals, true)
 | 
				
			||||||
 | 
						c.Assert(m.scheme, check.Equals, "http")
 | 
				
			||||||
 | 
						c.Assert(m.host, check.Equals, "example.com")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						url, err := middleware.URLFor(nil, "morty/data", nil)
 | 
				
			||||||
 | 
						c.Assert(err, check.Equals, nil)
 | 
				
			||||||
 | 
						c.Assert(url, check.Equals, "http://example.com/morty/data")
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
		Loading…
	
		Reference in New Issue