Back in the before time, the best practices surrounding usage of Context weren't quite worked out. We defined our own type to make usage easier. As this packaged was used elsewhere, it make it more and more challenging to integrate with the forked `Context` type. Now that it is available in the standard library, we can just use that one directly. To make usage more consistent, we now use `dcontext` when referring to the distribution context package. Signed-off-by: Stephen J Day <stephen.day@docker.com>
50 lines
1.4 KiB
Go
50 lines
1.4 KiB
Go
package middleware
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"net/url"
|
|
|
|
storagedriver "github.com/docker/distribution/registry/storage/driver"
|
|
storagemiddleware "github.com/docker/distribution/registry/storage/driver/middleware"
|
|
)
|
|
|
|
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")
|
|
}
|
|
u, err := url.Parse(b)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("unable to parse redirect baseurl: %s", b)
|
|
}
|
|
if u.Scheme == "" {
|
|
return nil, fmt.Errorf("no scheme specified for redirect baseurl")
|
|
}
|
|
if u.Host == "" {
|
|
return nil, fmt.Errorf("no host specified for redirect baseurl")
|
|
}
|
|
|
|
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))
|
|
}
|