@@ -10,6 +10,7 @@ import (
10
10
"crypto/tls"
11
11
"encoding/base64"
12
12
"encoding/hex"
13
+ "encoding/json"
13
14
"fmt"
14
15
"net"
15
16
"net/http"
@@ -41,6 +42,7 @@ const (
41
42
EnvVaultClientCert = "VAULT_CLIENT_CERT"
42
43
EnvVaultClientKey = "VAULT_CLIENT_KEY"
43
44
EnvVaultClientTimeout = "VAULT_CLIENT_TIMEOUT"
45
+ EnvVaultHeaders = "VAULT_HEADERS"
44
46
EnvVaultSRVLookup = "VAULT_SRV_LOOKUP"
45
47
EnvVaultSkipVerify = "VAULT_SKIP_VERIFY"
46
48
EnvVaultNamespace = "VAULT_NAMESPACE"
@@ -665,6 +667,30 @@ func NewClient(c *Config) (*Client, error) {
665
667
client .setNamespace (namespace )
666
668
}
667
669
670
+ if envHeaders := os .Getenv (EnvVaultHeaders ); envHeaders != "" {
671
+ var result map [string ]any
672
+ err := json .Unmarshal ([]byte (envHeaders ), & result )
673
+ if err != nil {
674
+ return nil , fmt .Errorf ("could not unmarshal environment-supplied headers" )
675
+ }
676
+ var forbiddenHeaders []string
677
+ for key , value := range result {
678
+ if strings .HasPrefix (key , "X-Vault-" ) {
679
+ forbiddenHeaders = append (forbiddenHeaders , key )
680
+ continue
681
+ }
682
+
683
+ value , ok := value .(string )
684
+ if ! ok {
685
+ return nil , fmt .Errorf ("environment-supplied headers include non-string values" )
686
+ }
687
+ client .AddHeader (key , value )
688
+ }
689
+ if len (forbiddenHeaders ) > 0 {
690
+ return nil , fmt .Errorf ("failed to setup Headers[%s]: Header starting by 'X-Vault-' are for internal usage only" , strings .Join (forbiddenHeaders , ", " ))
691
+ }
692
+ }
693
+
668
694
return client , nil
669
695
}
670
696
@@ -705,7 +731,7 @@ func (c *Client) SetAddress(addr string) error {
705
731
706
732
parsedAddr , err := c .config .ParseAddress (addr )
707
733
if err != nil {
708
- return errwrap . Wrapf ("failed to set address: {{err}} " , err )
734
+ return fmt . Errorf ("failed to set address: %w " , err )
709
735
}
710
736
711
737
c .addr = parsedAddr
0 commit comments