mirror of
https://github.com/caddyserver/caddy.git
synced 2024-12-16 21:56:40 -05:00
fix: unwrap adapter modules to get underlying modules
This commit is contained in:
parent
119e8794bc
commit
3cbbd1b62e
2 changed files with 22 additions and 3 deletions
|
@ -135,4 +135,11 @@ func (am adapterModule) CaddyModule() caddy.ModuleInfo {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// UnwrapAdapter return the original Adapter, this method must be exported
|
||||||
|
// to be type-assertable 🤷
|
||||||
|
// hack, https://github.com/caddyserver/caddy/issues/5621
|
||||||
|
func (am adapterModule) UnwrapAdapter() any {
|
||||||
|
return am.Adapter
|
||||||
|
}
|
||||||
|
|
||||||
var configAdapters = make(map[string]Adapter)
|
var configAdapters = make(map[string]Adapter)
|
||||||
|
|
|
@ -174,6 +174,13 @@ func upgradeBuild(pluginPkgs map[string]struct{}, fl Flags) (int, error) {
|
||||||
return caddy.ExitCodeSuccess, nil
|
return caddy.ExitCodeSuccess, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func getModPkgPath(iface any) string {
|
||||||
|
if rv := reflect.ValueOf(iface); rv.Kind() == reflect.Ptr {
|
||||||
|
iface = reflect.New(reflect.TypeOf(iface).Elem()).Elem().Interface()
|
||||||
|
}
|
||||||
|
return reflect.TypeOf(iface).PkgPath()
|
||||||
|
}
|
||||||
|
|
||||||
func getModules() (standard, nonstandard, unknown []moduleInfo, err error) {
|
func getModules() (standard, nonstandard, unknown []moduleInfo, err error) {
|
||||||
bi, ok := debug.ReadBuildInfo()
|
bi, ok := debug.ReadBuildInfo()
|
||||||
if !ok {
|
if !ok {
|
||||||
|
@ -195,10 +202,15 @@ func getModules() (standard, nonstandard, unknown []moduleInfo, err error) {
|
||||||
// not sure why), and since New() should return a pointer
|
// not sure why), and since New() should return a pointer
|
||||||
// value, we need to dereference it first
|
// value, we need to dereference it first
|
||||||
iface := any(modInfo.New())
|
iface := any(modInfo.New())
|
||||||
if rv := reflect.ValueOf(iface); rv.Kind() == reflect.Ptr {
|
modPkgPath := getModPkgPath(iface)
|
||||||
iface = reflect.New(reflect.TypeOf(iface).Elem()).Elem().Interface()
|
|
||||||
|
// Unwrap config adapters to get the underlying adapter modules, as config adapter modules are hacks anyway. https://github.com/caddyserver/caddy/issues/5621
|
||||||
|
// this method will only be called if it's from the built-in module to prevent abuse
|
||||||
|
if strings.HasPrefix(modPkgPath, caddy.ImportPath) {
|
||||||
|
if unwrapper, ok := iface.(interface{ UnwrapAdapter() any }); ok {
|
||||||
|
modPkgPath = getModPkgPath(unwrapper.UnwrapAdapter())
|
||||||
|
}
|
||||||
}
|
}
|
||||||
modPkgPath := reflect.TypeOf(iface).PkgPath()
|
|
||||||
|
|
||||||
// now we find the Go module that the Caddy module's package
|
// now we find the Go module that the Caddy module's package
|
||||||
// belongs to; we assume the Caddy module package path will
|
// belongs to; we assume the Caddy module package path will
|
||||||
|
|
Loading…
Reference in a new issue