Fix -expand-headers Help String

Also fix all other PR feedback.
This commit is contained in:
jammerful 2019-09-26 12:28:51 -04:00
parent 45b5ae08a9
commit 9dad8ec412
3 changed files with 36 additions and 34 deletions

View File

@ -59,12 +59,13 @@ var (
rpcHeaders multiString rpcHeaders multiString
reflHeaders multiString reflHeaders multiString
expandHeaders = flags.Bool("expand-headers", false, prettify(` expandHeaders = flags.Bool("expand-headers", false, prettify(`
If set any environmental variables contained contained in any additional, rpc, If set, headers may use '${NAME}' syntax to reference environment variables.
or reflection header string will be substituted for by the value of the environmental These will be expanded to the actual environment variable value before
variable. For instance, for the header 'key: ${VALUE}' where VALUE="foo" sending to the server. For example, if there is an environment variable
will be expanded to 'key: foo'. Any undefined environmental variables defined like FOO=bar, then a header of 'key: ${FOO}' would expand to 'key: bar'.
will throw an error. Note that verbose mode shows that the headers are This applies to -H, -rpc-header, and -reflect-header options. No other
being expanded to. Escaping '${' is not supported.`)) expansion/escaping is performed. This can be used to supply
credentials/secrets without having to put them in command-line arguments.`))
authority = flags.String("authority", "", prettify(` authority = flags.String("authority", "", prettify(`
Value of :authority pseudo-header to be use with underlying HTTP/2 Value of :authority pseudo-header to be use with underlying HTTP/2
requests. It defaults to the given address.`)) requests. It defaults to the given address.`))
@ -324,15 +325,15 @@ func main() {
var err error var err error
addlHeaders, err = grpcurl.ExpandHeaders(addlHeaders) addlHeaders, err = grpcurl.ExpandHeaders(addlHeaders)
if err != nil { if err != nil {
fail(err, "Failed to expand additional headers, missing environmental variable") fail(err, "Failed to expand additional headers")
} }
rpcHeaders, err = grpcurl.ExpandHeaders(rpcHeaders) rpcHeaders, err = grpcurl.ExpandHeaders(rpcHeaders)
if err != nil { if err != nil {
fail(err, "Failed to expand rpc headers, missing environmental variable") fail(err, "Failed to expand rpc headers")
} }
reflHeaders, err = grpcurl.ExpandHeaders(reflHeaders) reflHeaders, err = grpcurl.ExpandHeaders(reflHeaders)
if err != nil { if err != nil {
fail(err, "Failed to expand reflection headers, missing environmental variable") fail(err, "Failed to expand reflection headers")
} }
} }

View File

@ -165,30 +165,30 @@ func MetadataFromHeaders(headers []string) metadata.MD {
var envVarRegex = regexp.MustCompile(`\${\w+}`) var envVarRegex = regexp.MustCompile(`\${\w+}`)
// ExpandHeaders expands environmental variables contained in the header string. // ExpandHeaders expands environment variables contained in the header string.
// If no corresponding environmental variable is found an error is thrown. // If no corresponding environment variable is found an error is returned.
// TODO: Add escaping for `${` // TODO: Add escaping for `${`
func ExpandHeaders(headers []string) ([]string, error) { func ExpandHeaders(headers []string) ([]string, error) {
expandedHeaders := make([]string, len(headers)) expandedHeaders := make([]string, len(headers))
for idx, header := range headers { for idx, header := range headers {
if header != "" { if header == "" {
continue
}
results := envVarRegex.FindAllString(header, -1) results := envVarRegex.FindAllString(header, -1)
if results != nil { if len(results) == 0 {
expandedHeaders[idx] = headers[idx]
continue
}
expandedHeader := header expandedHeader := header
for _, result := range results { for _, result := range results {
envVarName := result[2 : len(result)-1] envVarName := result[2 : len(result)-1] // strip leading `${` and trailing `}`
envVarValue := os.Getenv(envVarName) envVarValue, ok := os.LookupEnv(envVarName)
replacementValue := envVarValue if !ok {
if len(envVarValue) == 0 { return nil, fmt.Errorf("header %q refers to missing environment variable %q", header, envVarName)
return nil, fmt.Errorf("environmental variable '%s' is not set", envVarName)
} }
expandedHeader = strings.Replace(expandedHeader, result, replacementValue, -1) expandedHeader = strings.Replace(expandedHeader, result, envVarValue, -1)
} }
expandedHeaders[idx] = expandedHeader expandedHeaders[idx] = expandedHeader
} else {
expandedHeaders[idx] = headers[idx]
}
}
} }
return expandedHeaders, nil return expandedHeaders, nil
} }

View File

@ -301,13 +301,14 @@ func TestGetAllFiles(t *testing.T) {
} }
func TestExpandHeaders(t *testing.T) { func TestExpandHeaders(t *testing.T) {
inHeaders := []string{"", "key1: ${value}", "key2: bar", "key3: ${woo", "key4: woo}", "key5: ${TEST}", inHeaders := []string{"key1: ${value}", "key2: bar", "key3: ${woo", "key4: woo}", "key5: ${TEST}",
"key6: ${TEST_VAR}", "${TEST}: ${TEST_VAR}"} "key6: ${TEST_VAR}", "${TEST}: ${TEST_VAR}", "key8: ${EMPTY}"}
os.Setenv("value", "value") os.Setenv("value", "value")
os.Setenv("TEST", "value5") os.Setenv("TEST", "value5")
os.Setenv("TEST_VAR", "value6") os.Setenv("TEST_VAR", "value6")
expectedHeaders := map[string]bool{"": true, "key1: value": true, "key2: bar": true, "key3: ${woo": true, "key4: woo}": true, os.Setenv("EMPTY", "")
"key5: value5": true, "key6: value6": true, "value5: value6": true} expectedHeaders := map[string]bool{"key1: value": true, "key2: bar": true, "key3: ${woo": true, "key4: woo}": true,
"key5: value5": true, "key6: value6": true, "value5: value6": true, "key8: ": true}
outHeaders, err := ExpandHeaders(inHeaders) outHeaders, err := ExpandHeaders(inHeaders)
if err != nil { if err != nil {
@ -315,14 +316,14 @@ func TestExpandHeaders(t *testing.T) {
} }
for _, expandedHeader := range outHeaders { for _, expandedHeader := range outHeaders {
if _, ok := expectedHeaders[expandedHeader]; !ok { if _, ok := expectedHeaders[expandedHeader]; !ok {
t.Errorf("The ExpandHeaders function has generated an unexpected header. Recieved unexpected header %s", expandedHeader) t.Errorf("The ExpandHeaders function has returned an unexpected header. Received unexpected header %s", expandedHeader)
} }
} }
badHeaders := []string{"key: ${DNE}"} badHeaders := []string{"key: ${DNE}"}
_, err = ExpandHeaders(badHeaders) _, err = ExpandHeaders(badHeaders)
if err == nil { if err == nil {
t.Errorf("The ExpandHeaders function should generate an error for missing environmental variables %q", badHeaders) t.Errorf("The ExpandHeaders function should return an error for missing environment variables %q", badHeaders)
} }
} }