mirror of
				https://github.com/traefik/traefik.git
				synced 2025-10-31 16:31:16 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			116 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			116 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package ingressnginx
 | |
| 
 | |
| import (
 | |
| 	"errors"
 | |
| 	"reflect"
 | |
| 	"strconv"
 | |
| 	"strings"
 | |
| 
 | |
| 	netv1 "k8s.io/api/networking/v1"
 | |
| )
 | |
| 
 | |
| type ingressConfig struct {
 | |
| 	AuthType       *string `annotation:"nginx.ingress.kubernetes.io/auth-type"`
 | |
| 	AuthSecret     *string `annotation:"nginx.ingress.kubernetes.io/auth-secret"`
 | |
| 	AuthRealm      *string `annotation:"nginx.ingress.kubernetes.io/auth-realm"`
 | |
| 	AuthSecretType *string `annotation:"nginx.ingress.kubernetes.io/auth-secret-type"`
 | |
| 
 | |
| 	AuthURL             *string `annotation:"nginx.ingress.kubernetes.io/auth-url"`
 | |
| 	AuthResponseHeaders *string `annotation:"nginx.ingress.kubernetes.io/auth-response-headers"`
 | |
| 
 | |
| 	ForceSSLRedirect *bool `annotation:"nginx.ingress.kubernetes.io/force-ssl-redirect"`
 | |
| 	SSLRedirect      *bool `annotation:"nginx.ingress.kubernetes.io/ssl-redirect"`
 | |
| 
 | |
| 	SSLPassthrough *bool `annotation:"nginx.ingress.kubernetes.io/ssl-passthrough"`
 | |
| 
 | |
| 	UseRegex *bool `annotation:"nginx.ingress.kubernetes.io/use-regex"`
 | |
| 
 | |
| 	Affinity              *string `annotation:"nginx.ingress.kubernetes.io/affinity"`
 | |
| 	SessionCookieName     *string `annotation:"nginx.ingress.kubernetes.io/session-cookie-name"`
 | |
| 	SessionCookieSecure   *bool   `annotation:"nginx.ingress.kubernetes.io/session-cookie-secure"`
 | |
| 	SessionCookiePath     *string `annotation:"nginx.ingress.kubernetes.io/session-cookie-path"`
 | |
| 	SessionCookieDomain   *string `annotation:"nginx.ingress.kubernetes.io/session-cookie-domain"`
 | |
| 	SessionCookieSameSite *string `annotation:"nginx.ingress.kubernetes.io/session-cookie-samesite"`
 | |
| 	SessionCookieMaxAge   *int    `annotation:"nginx.ingress.kubernetes.io/session-cookie-max-age"`
 | |
| 
 | |
| 	ServiceUpstream *bool `annotation:"nginx.ingress.kubernetes.io/service-upstream"`
 | |
| 
 | |
| 	BackendProtocol *string `annotation:"nginx.ingress.kubernetes.io/backend-protocol"`
 | |
| 
 | |
| 	ProxySSLSecret     *string `annotation:"nginx.ingress.kubernetes.io/proxy-ssl-secret"`
 | |
| 	ProxySSLVerify     *string `annotation:"nginx.ingress.kubernetes.io/proxy-ssl-verify"`
 | |
| 	ProxySSLName       *string `annotation:"nginx.ingress.kubernetes.io/proxy-ssl-name"`
 | |
| 	ProxySSLServerName *string `annotation:"nginx.ingress.kubernetes.io/proxy-ssl-server-name"`
 | |
| 
 | |
| 	EnableCORS                 *bool     `annotation:"nginx.ingress.kubernetes.io/enable-cors"`
 | |
| 	EnableCORSAllowCredentials *bool     `annotation:"nginx.ingress.kubernetes.io/cors-allow-credentials"`
 | |
| 	CORSExposeHeaders          *[]string `annotation:"nginx.ingress.kubernetes.io/cors-expose-headers"`
 | |
| 	CORSAllowHeaders           *[]string `annotation:"nginx.ingress.kubernetes.io/cors-allow-headers"`
 | |
| 	CORSAllowMethods           *[]string `annotation:"nginx.ingress.kubernetes.io/cors-allow-methods"`
 | |
| 	CORSAllowOrigin            *[]string `annotation:"nginx.ingress.kubernetes.io/cors-allow-origin"`
 | |
| 	CORSMaxAge                 *int      `annotation:"nginx.ingress.kubernetes.io/cors-max-age"`
 | |
| }
 | |
| 
 | |
| // parseIngressConfig parses the annotations from an Ingress object into an ingressConfig struct.
 | |
| func parseIngressConfig(ing *netv1.Ingress) (ingressConfig, error) {
 | |
| 	cfg := ingressConfig{}
 | |
| 	cfgType := reflect.TypeOf(cfg)
 | |
| 	cfgValue := reflect.ValueOf(&cfg).Elem()
 | |
| 
 | |
| 	for i := range cfgType.NumField() {
 | |
| 		field := cfgType.Field(i)
 | |
| 		annotation := field.Tag.Get("annotation")
 | |
| 		if annotation == "" {
 | |
| 			continue
 | |
| 		}
 | |
| 
 | |
| 		val, ok := ing.GetAnnotations()[annotation]
 | |
| 		if !ok {
 | |
| 			continue
 | |
| 		}
 | |
| 
 | |
| 		switch field.Type.Elem().Kind() {
 | |
| 		case reflect.String:
 | |
| 			cfgValue.Field(i).Set(reflect.ValueOf(&val))
 | |
| 		case reflect.Bool:
 | |
| 			parsed, err := strconv.ParseBool(val)
 | |
| 			if err == nil {
 | |
| 				cfgValue.Field(i).Set(reflect.ValueOf(&parsed))
 | |
| 			}
 | |
| 		case reflect.Int:
 | |
| 			parsed, err := strconv.Atoi(val)
 | |
| 			if err == nil {
 | |
| 				cfgValue.Field(i).Set(reflect.ValueOf(&parsed))
 | |
| 			}
 | |
| 		case reflect.Slice:
 | |
| 			if field.Type.Elem().Elem().Kind() == reflect.String {
 | |
| 				// Handle slice of strings
 | |
| 				var slice []string
 | |
| 				elements := strings.Split(val, ",")
 | |
| 				for _, elt := range elements {
 | |
| 					slice = append(slice, strings.TrimSpace(elt))
 | |
| 				}
 | |
| 				cfgValue.Field(i).Set(reflect.ValueOf(&slice))
 | |
| 			} else {
 | |
| 				return cfg, errors.New("unsupported slice type in annotations")
 | |
| 			}
 | |
| 		default:
 | |
| 			return cfg, errors.New("unsupported kind")
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	return cfg, nil
 | |
| }
 | |
| 
 | |
| // parseBackendProtocol parses the backend protocol annotation and returns the corresponding protocol string.
 | |
| func parseBackendProtocol(bp string) string {
 | |
| 	switch strings.ToUpper(bp) {
 | |
| 	case "HTTPS", "GRPCS":
 | |
| 		return "https"
 | |
| 	case "GRPC":
 | |
| 		return "h2c"
 | |
| 	default:
 | |
| 		return "http"
 | |
| 	}
 | |
| }
 |