github.com/gofiber/fiber/v2@v2.47.0/middleware/envvar/envvar.go (about)

     1  package envvar
     2  
     3  import (
     4  	"os"
     5  	"strings"
     6  
     7  	"github.com/gofiber/fiber/v2"
     8  )
     9  
    10  // Config defines the config for middleware.
    11  type Config struct {
    12  	// ExportVars specifies the environment variables that should export
    13  	ExportVars map[string]string
    14  	// ExcludeVars specifies the environment variables that should not export
    15  	ExcludeVars map[string]string
    16  }
    17  
    18  type EnvVar struct {
    19  	Vars map[string]string `json:"vars"`
    20  }
    21  
    22  func (envVar *EnvVar) set(key, val string) {
    23  	envVar.Vars[key] = val
    24  }
    25  
    26  func New(config ...Config) fiber.Handler {
    27  	var cfg Config
    28  	if len(config) > 0 {
    29  		cfg = config[0]
    30  	}
    31  
    32  	return func(c *fiber.Ctx) error {
    33  		if c.Method() != fiber.MethodGet {
    34  			return fiber.ErrMethodNotAllowed
    35  		}
    36  
    37  		envVar := newEnvVar(cfg)
    38  		varsByte, err := c.App().Config().JSONEncoder(envVar)
    39  		if err != nil {
    40  			return c.Status(fiber.StatusInternalServerError).SendString(err.Error())
    41  		}
    42  		c.Set(fiber.HeaderContentType, fiber.MIMEApplicationJSONCharsetUTF8)
    43  		return c.Send(varsByte)
    44  	}
    45  }
    46  
    47  func newEnvVar(cfg Config) *EnvVar {
    48  	vars := &EnvVar{Vars: make(map[string]string)}
    49  
    50  	if len(cfg.ExportVars) > 0 {
    51  		for key, defaultVal := range cfg.ExportVars {
    52  			vars.set(key, defaultVal)
    53  			if envVal, exists := os.LookupEnv(key); exists {
    54  				vars.set(key, envVal)
    55  			}
    56  		}
    57  	} else {
    58  		const numElems = 2
    59  		for _, envVal := range os.Environ() {
    60  			keyVal := strings.SplitN(envVal, "=", numElems)
    61  			if _, exists := cfg.ExcludeVars[keyVal[0]]; !exists {
    62  				vars.set(keyVal[0], keyVal[1])
    63  			}
    64  		}
    65  	}
    66  
    67  	return vars
    68  }