support middleware cross referencing

This commit is contained in:
yusing 2025-01-09 05:15:18 +08:00
parent 642e6ebdc8
commit adb41a80c5
3 changed files with 33 additions and 7 deletions

View file

@ -94,9 +94,9 @@ func (m *Middleware) finalize() {
} }
func (m *Middleware) New(optsRaw OptionsRaw) (*Middleware, E.Error) { func (m *Middleware) New(optsRaw OptionsRaw) (*Middleware, E.Error) {
if m.construct == nil { if m.construct == nil { // likely a middleware from compose
if optsRaw != nil { if len(optsRaw) != 0 {
panic("bug: middleware already constructed") return nil, E.New("additional options not allowed for middleware ").Subject(m.name)
} }
return m, nil return m, nil
} }

View file

@ -61,17 +61,38 @@ func LoadComposeFiles() {
logger.Err(err).Msg("failed to list middleware definitions") logger.Err(err).Msg("failed to list middleware definitions")
return return
} }
for _, defFile := range middlewareDefs {
voidErrs := E.NewBuilder("") // ignore these errors, will be added in next step
mws := BuildMiddlewaresFromComposeFile(defFile, voidErrs)
if len(mws) == 0 {
continue
}
for name, m := range mws {
name = strutils.ToLowerNoSnake(name)
if _, ok := allMiddlewares[name]; ok {
errs.Add(ErrDuplicatedMiddleware.Subject(name))
continue
}
allMiddlewares[name] = m
logger.Info().
Str("src", path.Base(defFile)).
Str("name", name).
Msg("middleware loaded")
}
}
// build again to resolve cross references
for _, defFile := range middlewareDefs { for _, defFile := range middlewareDefs {
mws := BuildMiddlewaresFromComposeFile(defFile, errs) mws := BuildMiddlewaresFromComposeFile(defFile, errs)
if len(mws) == 0 { if len(mws) == 0 {
continue continue
} }
for name, m := range mws { for name, m := range mws {
name = strutils.ToLowerNoSnake(name)
if _, ok := allMiddlewares[name]; ok { if _, ok := allMiddlewares[name]; ok {
errs.Add(ErrDuplicatedMiddleware.Subject(name)) // already loaded above
continue continue
} }
allMiddlewares[strutils.ToLowerNoSnake(name)] = m allMiddlewares[name] = m
logger.Info(). logger.Info().
Str("src", path.Base(defFile)). Str("src", path.Base(defFile)).
Str("name", name). Str("name", name).

View file

@ -98,15 +98,20 @@ GoDoxy v0.8.2 expected changes
```` ````
- config reload will now cause all servers to fully restart (i.e. proxy, api, prometheus, etc) - config reload will now cause all servers to fully restart (i.e. proxy, api, prometheus, etc)
- multiline-string as list now treated as YAML list, which requires hyphen prefix `-`, i.e. - multiline-string as list now treated as YAML list, which requires hyphen prefix `-`, i.e.
```yaml ```yaml
proxy.app.middlewares.request.hide_headers: proxy.app.middlewares.request.hide_headers:
- X-Header1 - X-Header1
- X-Header2 - X-Header2
```` ````
- autocert now supports hot-reload - autocert now supports hot-reload
- middleware compose now supports cross-referencing, e.g.
```yaml
foo:
- use: RedirectHTTP
bar: # in the same file or different file
- use: foo@file
```
- Fixes - Fixes
- bug: cert renewal failure no longer causes renew schdueler to stuck forever - bug: cert renewal failure no longer causes renew schdueler to stuck forever