diff --git a/cli/packages/cmd/agent.go b/cli/packages/cmd/agent.go index 9af3bd4cd..b8fc6ed7b 100644 --- a/cli/packages/cmd/agent.go +++ b/cli/packages/cmd/agent.go @@ -513,7 +513,10 @@ type NewAgentMangerOptions struct { } func NewAgentManager(options NewAgentMangerOptions) *AgentManager { - + customHeaders, err := util.GetInfisicalCustomHeadersMap() + if err != nil { + util.HandleError(err, "Unable to get custom headers") + } return &AgentManager{ filePaths: options.FileDeposits, templates: options.Templates, @@ -528,7 +531,7 @@ func NewAgentManager(options NewAgentMangerOptions) *AgentManager { SiteUrl: config.INFISICAL_URL, UserAgent: api.USER_AGENT, // ? Should we perhaps use a different user agent for the Agent for better analytics? AutoTokenRefresh: false, - CustomHeaders: os.Getenv("INFISICAL_CUSTOM_HEADERS"), + CustomHeaders: customHeaders, }), } diff --git a/cli/packages/cmd/dynamic_secrets.go b/cli/packages/cmd/dynamic_secrets.go index 847fb36d6..60f356185 100644 --- a/cli/packages/cmd/dynamic_secrets.go +++ b/cli/packages/cmd/dynamic_secrets.go @@ -6,7 +6,6 @@ package cmd import ( "context" "fmt" - "os" "github.com/Infisical/infisical-merge/packages/api" "github.com/Infisical/infisical-merge/packages/config" @@ -88,11 +87,16 @@ func getDynamicSecretList(cmd *cobra.Command, args []string) { httpClient.SetAuthToken(infisicalToken) + customHeaders, err := util.GetInfisicalCustomHeadersMap() + if err != nil { + util.HandleError(err, "Unable to get custom headers") + } + infisicalClient := infisicalSdk.NewInfisicalClient(context.Background(), infisicalSdk.Config{ SiteUrl: config.INFISICAL_URL, UserAgent: api.USER_AGENT, AutoTokenRefresh: false, - CustomHeaders: os.Getenv("INFISICAL_CUSTOM_HEADERS"), + CustomHeaders: customHeaders, }) infisicalClient.Auth().SetAccessToken(infisicalToken) @@ -200,11 +204,16 @@ func createDynamicSecretLeaseByName(cmd *cobra.Command, args []string) { httpClient.SetAuthToken(infisicalToken) + customHeaders, err := util.GetInfisicalCustomHeadersMap() + if err != nil { + util.HandleError(err, "Unable to get custom headers") + } + infisicalClient := infisicalSdk.NewInfisicalClient(context.Background(), infisicalSdk.Config{ SiteUrl: config.INFISICAL_URL, UserAgent: api.USER_AGENT, AutoTokenRefresh: false, - CustomHeaders: os.Getenv("INFISICAL_CUSTOM_HEADERS"), + CustomHeaders: customHeaders, }) infisicalClient.Auth().SetAccessToken(infisicalToken) @@ -326,11 +335,16 @@ func renewDynamicSecretLeaseByName(cmd *cobra.Command, args []string) { httpClient.SetAuthToken(infisicalToken) + customHeaders, err := util.GetInfisicalCustomHeadersMap() + if err != nil { + util.HandleError(err, "Unable to get custom headers") + } + infisicalClient := infisicalSdk.NewInfisicalClient(context.Background(), infisicalSdk.Config{ SiteUrl: config.INFISICAL_URL, UserAgent: api.USER_AGENT, AutoTokenRefresh: false, - CustomHeaders: os.Getenv("INFISICAL_CUSTOM_HEADERS"), + CustomHeaders: customHeaders, }) infisicalClient.Auth().SetAccessToken(infisicalToken) @@ -428,11 +442,16 @@ func revokeDynamicSecretLeaseByName(cmd *cobra.Command, args []string) { httpClient.SetAuthToken(infisicalToken) + customHeaders, err := util.GetInfisicalCustomHeadersMap() + if err != nil { + util.HandleError(err, "Unable to get custom headers") + } + infisicalClient := infisicalSdk.NewInfisicalClient(context.Background(), infisicalSdk.Config{ SiteUrl: config.INFISICAL_URL, UserAgent: api.USER_AGENT, AutoTokenRefresh: false, - CustomHeaders: os.Getenv("INFISICAL_CUSTOM_HEADERS"), + CustomHeaders: customHeaders, }) infisicalClient.Auth().SetAccessToken(infisicalToken) @@ -529,11 +548,16 @@ func listDynamicSecretLeaseByName(cmd *cobra.Command, args []string) { httpClient.SetAuthToken(infisicalToken) + customHeaders, err := util.GetInfisicalCustomHeadersMap() + if err != nil { + util.HandleError(err, "Unable to get custom headers") + } + infisicalClient := infisicalSdk.NewInfisicalClient(context.Background(), infisicalSdk.Config{ SiteUrl: config.INFISICAL_URL, UserAgent: api.USER_AGENT, AutoTokenRefresh: false, - CustomHeaders: os.Getenv("INFISICAL_CUSTOM_HEADERS"), + CustomHeaders: customHeaders, }) infisicalClient.Auth().SetAccessToken(infisicalToken) diff --git a/cli/packages/cmd/login.go b/cli/packages/cmd/login.go index fdcf93b98..b1c868d8c 100644 --- a/cli/packages/cmd/login.go +++ b/cli/packages/cmd/login.go @@ -177,11 +177,16 @@ var loginCmd = &cobra.Command{ return } + customHeaders, err := util.GetInfisicalCustomHeadersMap() + if err != nil { + util.HandleError(err, "Unable to get custom headers") + } + infisicalClient := infisicalSdk.NewInfisicalClient(context.Background(), infisicalSdk.Config{ SiteUrl: config.INFISICAL_URL, UserAgent: api.USER_AGENT, AutoTokenRefresh: false, - CustomHeaders: os.Getenv("INFISICAL_CUSTOM_HEADERS"), + CustomHeaders: customHeaders, }) loginMethod, err := cmd.Flags().GetString("method") diff --git a/cli/packages/cmd/ssh.go b/cli/packages/cmd/ssh.go index a4b8f809e..a3d10fc91 100644 --- a/cli/packages/cmd/ssh.go +++ b/cli/packages/cmd/ssh.go @@ -315,11 +315,16 @@ func issueCredentials(cmd *cobra.Command, args []string) { } } + customHeaders, err := util.GetInfisicalCustomHeadersMap() + if err != nil { + util.HandleError(err, "Unable to get custom headers") + } + infisicalClient := infisicalSdk.NewInfisicalClient(context.Background(), infisicalSdk.Config{ SiteUrl: config.INFISICAL_URL, UserAgent: api.USER_AGENT, AutoTokenRefresh: false, - CustomHeaders: os.Getenv("INFISICAL_CUSTOM_HEADERS"), + CustomHeaders: customHeaders, }) infisicalClient.Auth().SetAccessToken(infisicalToken) @@ -556,11 +561,16 @@ func signKey(cmd *cobra.Command, args []string) { signedKeyPath = outFilePath } + customHeaders, err := util.GetInfisicalCustomHeadersMap() + if err != nil { + util.HandleError(err, "Unable to get custom headers") + } + infisicalClient := infisicalSdk.NewInfisicalClient(context.Background(), infisicalSdk.Config{ SiteUrl: config.INFISICAL_URL, UserAgent: api.USER_AGENT, AutoTokenRefresh: false, - CustomHeaders: os.Getenv("INFISICAL_CUSTOM_HEADERS"), + CustomHeaders: customHeaders, }) infisicalClient.Auth().SetAccessToken(infisicalToken) diff --git a/cli/packages/util/common.go b/cli/packages/util/common.go index 04c0296ce..07618ae87 100644 --- a/cli/packages/util/common.go +++ b/cli/packages/util/common.go @@ -35,69 +35,83 @@ func GetRestyClientWithCustomHeaders() (*resty.Client, error) { httpClient := resty.New() customHeaders := os.Getenv("INFISICAL_CUSTOM_HEADERS") if customHeaders != "" { - headers := map[string]string{} - - pos := 0 - for pos < len(customHeaders) { - for pos < len(customHeaders) && unicode.IsSpace(rune(customHeaders[pos])) { - pos++ - } - - if pos >= len(customHeaders) { - break - } - - keyStart := pos - for pos < len(customHeaders) && customHeaders[pos] != '=' && !unicode.IsSpace(rune(customHeaders[pos])) { - pos++ - } - - if pos >= len(customHeaders) || customHeaders[pos] != '=' { - return nil, fmt.Errorf("invalid custom header format. Expected \"headerKey1=value1 headerKey2=value2 ....\" but got %v", customHeaders) - } - - key := customHeaders[keyStart:pos] - pos++ - - for pos < len(customHeaders) && unicode.IsSpace(rune(customHeaders[pos])) { - pos++ - } - - var value string - - if pos < len(customHeaders) { - if customHeaders[pos] == '"' || customHeaders[pos] == '\'' { - quoteChar := customHeaders[pos] - pos++ - valueStart := pos - - for pos < len(customHeaders) && - (customHeaders[pos] != quoteChar || - (pos > 0 && customHeaders[pos-1] == '\\')) { - pos++ - } - - if pos < len(customHeaders) { - value = customHeaders[valueStart:pos] - pos++ - } else { - value = customHeaders[valueStart:] - } - } else { - valueStart := pos - for pos < len(customHeaders) && !unicode.IsSpace(rune(customHeaders[pos])) { - pos++ - } - value = customHeaders[valueStart:pos] - } - } - - if key != "" && !strings.EqualFold(key, "User-Agent") && !strings.EqualFold(key, "Accept") { - headers[key] = value - } + headers, err := GetInfisicalCustomHeadersMap() + if err != nil { + return nil, err } httpClient.SetHeaders(headers) } return httpClient, nil } + +func GetInfisicalCustomHeadersMap() (map[string]string, error) { + customHeaders := os.Getenv("INFISICAL_CUSTOM_HEADERS") + if customHeaders == "" { + return nil, nil + } + + headers := map[string]string{} + + pos := 0 + for pos < len(customHeaders) { + for pos < len(customHeaders) && unicode.IsSpace(rune(customHeaders[pos])) { + pos++ + } + + if pos >= len(customHeaders) { + break + } + + keyStart := pos + for pos < len(customHeaders) && customHeaders[pos] != '=' && !unicode.IsSpace(rune(customHeaders[pos])) { + pos++ + } + + if pos >= len(customHeaders) || customHeaders[pos] != '=' { + return nil, fmt.Errorf("invalid custom header format. Expected \"headerKey1=value1 headerKey2=value2 ....\" but got %v", customHeaders) + } + + key := customHeaders[keyStart:pos] + pos++ + + for pos < len(customHeaders) && unicode.IsSpace(rune(customHeaders[pos])) { + pos++ + } + + var value string + + if pos < len(customHeaders) { + if customHeaders[pos] == '"' || customHeaders[pos] == '\'' { + quoteChar := customHeaders[pos] + pos++ + valueStart := pos + + for pos < len(customHeaders) && + (customHeaders[pos] != quoteChar || + (pos > 0 && customHeaders[pos-1] == '\\')) { + pos++ + } + + if pos < len(customHeaders) { + value = customHeaders[valueStart:pos] + pos++ + } else { + value = customHeaders[valueStart:] + } + } else { + valueStart := pos + for pos < len(customHeaders) && !unicode.IsSpace(rune(customHeaders[pos])) { + pos++ + } + value = customHeaders[valueStart:pos] + } + } + + if key != "" && !strings.EqualFold(key, "User-Agent") && !strings.EqualFold(key, "Accept") { + headers[key] = value + } + } + + return headers, nil +} diff --git a/docs/sdks/languages/go.mdx b/docs/sdks/languages/go.mdx index 390ef4310..47bc9a9ea 100644 --- a/docs/sdks/languages/go.mdx +++ b/docs/sdks/languages/go.mdx @@ -100,8 +100,8 @@ client := infisical.NewInfisicalClient(context.Background(), infisical.Config{ Defines how long certain responses should be cached in memory, in seconds. When set to a positive value, responses from specific methods (like secret fetching) will be cached for this duration. Set to 0 to disable caching. - - Allows you to pass custom headers to the HTTP requests made by the SDK. Expected format is `Header1=Value1 Header2="Value 2"`. + + Allows you to pass custom headers to the HTTP requests made by the SDK. Expected format is a map of `Header1: Value1, Header2: Value 2`.