Make configMap marshaling code aware of quotes.
A value in a configMap that is a map itself (a key:value string separated by commas) may include commans inside quotes (i.e. search_path:"public,"$user"). The changes make marshaling code process such cases correctly.
This commit is contained in:
		
							parent
							
								
									2352fc9a39
								
							
						
					
					
						commit
						e95f80e351
					
				|  | @ -141,7 +141,10 @@ func processField(value string, field reflect.Value) error { | ||||||
| 		} | 		} | ||||||
| 		field.Set(sl) | 		field.Set(sl) | ||||||
| 	case reflect.Map: | 	case reflect.Map: | ||||||
| 		pairs := strings.Split(value, ",") | 		pairs, err := getMapPairsFromString(value) | ||||||
|  | 		if err != nil { | ||||||
|  | 			return fmt.Errorf("could not split value %q into map items: %v", value, err) | ||||||
|  | 		} | ||||||
| 		mp := reflect.MakeMap(typ) | 		mp := reflect.MakeMap(typ) | ||||||
| 		for _, pair := range pairs { | 		for _, pair := range pairs { | ||||||
| 			kvpair := strings.Split(pair, ":") | 			kvpair := strings.Split(pair, ":") | ||||||
|  | @ -166,6 +169,56 @@ func processField(value string, field reflect.Value) error { | ||||||
| 	return nil | 	return nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
|  | type parserState int | ||||||
|  | const ( | ||||||
|  | 	Plain parserState  = iota | ||||||
|  | 	DoubleQuoted | ||||||
|  | 	SingleQuoted | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | // Split the pair candidates by commas not located inside open quotes
 | ||||||
|  | // Escape characters are not supported for simplicity, as we don't
 | ||||||
|  | // expect to find them inside the map values for our use cases
 | ||||||
|  | func getMapPairsFromString(value string) (pairs []string , err error) { | ||||||
|  | 	pairs = make([]string, 0) | ||||||
|  | 	state := Plain | ||||||
|  | 	var start, quote int | ||||||
|  | 
 | ||||||
|  | 	if value == "" { | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  | 	for i, ch := range(strings.Split(value, "")) { | ||||||
|  | 		if ch == `"` { | ||||||
|  | 			if state == Plain { | ||||||
|  | 				state = DoubleQuoted | ||||||
|  | 				quote = i | ||||||
|  | 			} else if state == DoubleQuoted { | ||||||
|  | 				state = Plain | ||||||
|  | 				quote = 0 | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 		if ch == "'" { | ||||||
|  | 			if state == Plain { | ||||||
|  | 				state = SingleQuoted | ||||||
|  | 				quote = i | ||||||
|  | 			} else if state == SingleQuoted { | ||||||
|  | 				state = Plain | ||||||
|  | 				quote = 0 | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 		if ch == "," && state == Plain { | ||||||
|  | 			pairs = append(pairs, value[start:i]) | ||||||
|  | 			start = i | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	if state != Plain { | ||||||
|  | 		err = fmt.Errorf("unclosed quote starting at position %d", quote) | ||||||
|  | 	} | ||||||
|  | 	pairs = append(pairs, value[start:]) | ||||||
|  | 	return | ||||||
|  | } | ||||||
|  | 
 | ||||||
| func (f *stringTemplate) Decode(value string) error { | func (f *stringTemplate) Decode(value string) error { | ||||||
| 	*f = stringTemplate(value) | 	*f = stringTemplate(value) | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue