mirror of
https://github.com/genuinetools/reg.git
synced 2024-09-19 16:51:01 -04:00
51 lines
1.4 KiB
Go
51 lines
1.4 KiB
Go
|
package middleware
|
||
|
|
||
|
import (
|
||
|
"fmt"
|
||
|
"net/url"
|
||
|
|
||
|
"github.com/docker/distribution/context"
|
||
|
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))
|
||
|
}
|