2020-04-20 19:36:34 +03:00
package middleware
import (
2023-07-20 16:02:07 +03:00
"context"
2020-04-20 19:36:34 +03:00
"errors"
2023-07-20 16:02:07 +03:00
"net/http"
2020-04-20 19:36:34 +03:00
2023-07-20 16:02:07 +03:00
"github.com/opentracing/opentracing-go/ext"
2020-09-16 16:46:04 +03:00
"github.com/traefik/traefik/v2/pkg/config/dynamic"
"github.com/traefik/traefik/v2/pkg/plugins"
2023-07-20 16:02:07 +03:00
"github.com/traefik/traefik/v2/pkg/tracing"
2020-04-20 19:36:34 +03:00
)
2020-09-07 14:58:03 +03:00
// PluginsBuilder the plugin's builder interface.
type PluginsBuilder interface {
Build ( pName string , config map [ string ] interface { } , middlewareName string ) ( plugins . Constructor , error )
}
2020-04-20 19:36:34 +03:00
func findPluginConfig ( rawConfig map [ string ] dynamic . PluginConf ) ( string , map [ string ] interface { } , error ) {
if len ( rawConfig ) != 1 {
2021-05-11 17:14:10 +03:00
return "" , nil , errors . New ( "invalid configuration: no configuration or too many plugin definition" )
2020-04-20 19:36:34 +03:00
}
var pluginType string
var rawPluginConfig map [ string ] interface { }
for pType , pConfig := range rawConfig {
pluginType = pType
rawPluginConfig = pConfig
}
if pluginType == "" {
2021-05-11 17:14:10 +03:00
return "" , nil , errors . New ( "missing plugin type" )
2020-04-20 19:36:34 +03:00
}
return pluginType , rawPluginConfig , nil
}
2023-07-20 16:02:07 +03:00
type traceablePlugin struct {
name string
h http . Handler
}
func newTraceablePlugin ( ctx context . Context , name string , plug plugins . Constructor , next http . Handler ) ( * traceablePlugin , error ) {
h , err := plug ( ctx , next )
if err != nil {
return nil , err
}
return & traceablePlugin { name : name , h : h } , nil
}
func ( s * traceablePlugin ) ServeHTTP ( rw http . ResponseWriter , req * http . Request ) {
s . h . ServeHTTP ( rw , req )
}
func ( s * traceablePlugin ) GetTracingInformation ( ) ( string , ext . SpanKindEnum ) {
return s . name , tracing . SpanKindNoneEnum
}