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