prepare to map[string]string
This commit is contained in:
		| @@ -1,6 +1,6 @@ | |||||||
| //go:build exclude | //go:build exclude | ||||||
|  |  | ||||||
| //TODO need compare with micro metadata | // TODO need compare with micro metadata | ||||||
| package metadata | package metadata | ||||||
|  |  | ||||||
| import ( | import ( | ||||||
| @@ -18,7 +18,7 @@ func DecodeKeyValue(k, v string) (string, string, error) { | |||||||
|  |  | ||||||
| // MD is a mapping from metadata keys to values. Users should use the following | // MD is a mapping from metadata keys to values. Users should use the following | ||||||
| // two convenience functions New and Pairs to generate MD. | // two convenience functions New and Pairs to generate MD. | ||||||
| type MD map[string][]string | type MD map[string]string | ||||||
|  |  | ||||||
| // New creates an MD from a given key-value map. | // New creates an MD from a given key-value map. | ||||||
| // | // | ||||||
| @@ -36,7 +36,7 @@ func New(m map[string]string) MD { | |||||||
| 	md := make(MD, len(m)) | 	md := make(MD, len(m)) | ||||||
| 	for k, val := range m { | 	for k, val := range m { | ||||||
| 		key := strings.ToLower(k) | 		key := strings.ToLower(k) | ||||||
| 		md[key] = append(md[key], val) | 		md[key] = val | ||||||
| 	} | 	} | ||||||
| 	return md | 	return md | ||||||
| } | } | ||||||
| @@ -61,7 +61,7 @@ func Pairs(kv ...string) MD { | |||||||
| 	md := make(MD, len(kv)/2) | 	md := make(MD, len(kv)/2) | ||||||
| 	for i := 0; i < len(kv); i += 2 { | 	for i := 0; i < len(kv); i += 2 { | ||||||
| 		key := strings.ToLower(kv[i]) | 		key := strings.ToLower(kv[i]) | ||||||
| 		md[key] = append(md[key], kv[i+1]) | 		md[key] = kv[i+1] | ||||||
| 	} | 	} | ||||||
| 	return md | 	return md | ||||||
| } | } | ||||||
| @@ -75,7 +75,7 @@ func (md MD) Len() int { | |||||||
| func (md MD) Copy() MD { | func (md MD) Copy() MD { | ||||||
| 	out := make(MD, len(md)) | 	out := make(MD, len(md)) | ||||||
| 	for k, v := range md { | 	for k, v := range md { | ||||||
| 		out[k] = copyOf(v) | 		out[k] = v | ||||||
| 	} | 	} | ||||||
| 	return out | 	return out | ||||||
| } | } | ||||||
| @@ -83,7 +83,7 @@ func (md MD) Copy() MD { | |||||||
| // Get obtains the values for a given key. | // Get obtains the values for a given key. | ||||||
| // | // | ||||||
| // k is converted to lowercase before searching in md. | // k is converted to lowercase before searching in md. | ||||||
| func (md MD) Get(k string) []string { | func (md MD) Get(k string) string { | ||||||
| 	k = strings.ToLower(k) | 	k = strings.ToLower(k) | ||||||
| 	return md[k] | 	return md[k] | ||||||
| } | } | ||||||
| @@ -91,7 +91,7 @@ func (md MD) Get(k string) []string { | |||||||
| // Set sets the value of a given key with a slice of values. | // Set sets the value of a given key with a slice of values. | ||||||
| // | // | ||||||
| // k is converted to lowercase before storing in md. | // k is converted to lowercase before storing in md. | ||||||
| func (md MD) Set(k string, vals ...string) { | func (md MD) Set(k string, vals string) { | ||||||
| 	if len(vals) == 0 { | 	if len(vals) == 0 { | ||||||
| 		return | 		return | ||||||
| 	} | 	} | ||||||
| @@ -103,12 +103,12 @@ func (md MD) Set(k string, vals ...string) { | |||||||
| // that key. | // that key. | ||||||
| // | // | ||||||
| // k is converted to lowercase before storing in md. | // k is converted to lowercase before storing in md. | ||||||
| func (md MD) Append(k string, vals ...string) { | func (md MD) Append(k string, vals string) { | ||||||
| 	if len(vals) == 0 { | 	if len(vals) == 0 { | ||||||
| 		return | 		return | ||||||
| 	} | 	} | ||||||
| 	k = strings.ToLower(k) | 	k = strings.ToLower(k) | ||||||
| 	md[k] = append(md[k], vals...) | 	md[k] = vals | ||||||
| } | } | ||||||
|  |  | ||||||
| // Delete removes the values for a given key k which is converted to lowercase | // Delete removes the values for a given key k which is converted to lowercase | ||||||
| @@ -126,7 +126,7 @@ func Join(mds ...MD) MD { | |||||||
| 	out := MD{} | 	out := MD{} | ||||||
| 	for _, md := range mds { | 	for _, md := range mds { | ||||||
| 		for k, v := range md { | 		for k, v := range md { | ||||||
| 			out[k] = append(out[k], v...) | 			out[k] = v | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 	return out | 	return out | ||||||
| @@ -157,14 +157,13 @@ func AppendToOutgoingContext(ctx context.Context, kv ...string) context.Context | |||||||
| 		panic(fmt.Sprintf("metadata: AppendToOutgoingContext got an odd number of input pairs for metadata: %d", len(kv))) | 		panic(fmt.Sprintf("metadata: AppendToOutgoingContext got an odd number of input pairs for metadata: %d", len(kv))) | ||||||
| 	} | 	} | ||||||
| 	md, _ := ctx.Value(mdOutgoingKey{}).(rawMD) | 	md, _ := ctx.Value(mdOutgoingKey{}).(rawMD) | ||||||
| 	added := make([][]string, len(md.added)+1) |  | ||||||
| 	copy(added, md.added) |  | ||||||
| 	kvCopy := make([]string, 0, len(kv)) | 	kvCopy := make([]string, 0, len(kv)) | ||||||
| 	for i := 0; i < len(kv); i += 2 { | 	for i := 0; i < len(kv); i += 2 { | ||||||
| 		kvCopy = append(kvCopy, strings.ToLower(kv[i]), kv[i+1]) | 		kvCopy = append(kvCopy, strings.ToLower(kv[i]), kv[i+1]) | ||||||
| 	} | 	} | ||||||
| 	added[len(added)-1] = kvCopy |  | ||||||
| 	return context.WithValue(ctx, mdOutgoingKey{}, rawMD{md: md.md, added: added}) | 	return context.WithValue(ctx, mdOutgoingKey{}, rawMD{md: md.md}) | ||||||
| } | } | ||||||
|  |  | ||||||
| // FromIncomingContext returns the incoming metadata in ctx if it exists. | // FromIncomingContext returns the incoming metadata in ctx if it exists. | ||||||
| @@ -181,53 +180,24 @@ func FromIncomingContext(ctx context.Context) (MD, bool) { | |||||||
| 		// map, and there's no guarantee that the MD attached to the context is | 		// map, and there's no guarantee that the MD attached to the context is | ||||||
| 		// created using our helper functions. | 		// created using our helper functions. | ||||||
| 		key := strings.ToLower(k) | 		key := strings.ToLower(k) | ||||||
| 		out[key] = copyOf(v) | 		out[key] = v | ||||||
| 	} | 	} | ||||||
| 	return out, true | 	return out, true | ||||||
| } | } | ||||||
|  |  | ||||||
| // ValueFromIncomingContext returns the metadata value corresponding to the metadata |  | ||||||
| // key from the incoming metadata if it exists. Keys are matched in a case insensitive |  | ||||||
| // manner. |  | ||||||
| func ValueFromIncomingContext(ctx context.Context, key string) []string { |  | ||||||
| 	md, ok := ctx.Value(mdIncomingKey{}).(MD) |  | ||||||
| 	if !ok { |  | ||||||
| 		return nil |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	if v, ok := md[key]; ok { |  | ||||||
| 		return copyOf(v) |  | ||||||
| 	} |  | ||||||
| 	for k, v := range md { |  | ||||||
| 		// Case insensitive comparison: MD is a map, and there's no guarantee |  | ||||||
| 		// that the MD attached to the context is created using our helper |  | ||||||
| 		// functions. |  | ||||||
| 		if strings.EqualFold(k, key) { |  | ||||||
| 			return copyOf(v) |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 	return nil |  | ||||||
| } |  | ||||||
|  |  | ||||||
| func copyOf(v []string) []string { |  | ||||||
| 	vals := make([]string, len(v)) |  | ||||||
| 	copy(vals, v) |  | ||||||
| 	return vals |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // fromOutgoingContextRaw returns the un-merged, intermediary contents of rawMD. | // fromOutgoingContextRaw returns the un-merged, intermediary contents of rawMD. | ||||||
| // | // | ||||||
| // Remember to perform strings.ToLower on the keys, for both the returned MD (MD | // Remember to perform strings.ToLower on the keys, for both the returned MD (MD | ||||||
| // is a map, there's no guarantee it's created using our helper functions) and | // is a map, there's no guarantee it's created using our helper functions) and | ||||||
| // the extra kv pairs (AppendToOutgoingContext doesn't turn them into | // the extra kv pairs (AppendToOutgoingContext doesn't turn them into | ||||||
| // lowercase). | // lowercase). | ||||||
| func fromOutgoingContextRaw(ctx context.Context) (MD, [][]string, bool) { | func fromOutgoingContextRaw(ctx context.Context) (MD, bool) { | ||||||
| 	raw, ok := ctx.Value(mdOutgoingKey{}).(rawMD) | 	raw, ok := ctx.Value(mdOutgoingKey{}).(rawMD) | ||||||
| 	if !ok { | 	if !ok { | ||||||
| 		return nil, nil, false | 		return nil, false | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	return raw.md, raw.added, true | 	return raw.md, true | ||||||
| } | } | ||||||
|  |  | ||||||
| // FromOutgoingContext returns the outgoing metadata in ctx if it exists. | // FromOutgoingContext returns the outgoing metadata in ctx if it exists. | ||||||
| @@ -239,33 +209,18 @@ func FromOutgoingContext(ctx context.Context) (MD, bool) { | |||||||
| 		return nil, false | 		return nil, false | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	mdSize := len(raw.md) | 	out := make(MD, len(raw.md)) | ||||||
| 	for i := range raw.added { |  | ||||||
| 		mdSize += len(raw.added[i]) / 2 |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	out := make(MD, mdSize) |  | ||||||
| 	for k, v := range raw.md { | 	for k, v := range raw.md { | ||||||
| 		// We need to manually convert all keys to lower case, because MD is a | 		// We need to manually convert all keys to lower case, because MD is a | ||||||
| 		// map, and there's no guarantee that the MD attached to the context is | 		// map, and there's no guarantee that the MD attached to the context is | ||||||
| 		// created using our helper functions. | 		// created using our helper functions. | ||||||
| 		key := strings.ToLower(k) | 		key := strings.ToLower(k) | ||||||
| 		out[key] = copyOf(v) | 		out[key] = v | ||||||
| 	} |  | ||||||
| 	for _, added := range raw.added { |  | ||||||
| 		if len(added)%2 == 1 { |  | ||||||
| 			panic(fmt.Sprintf("metadata: FromOutgoingContext got an odd number of input pairs for metadata: %d", len(added))) |  | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 		for i := 0; i < len(added); i += 2 { |  | ||||||
| 			key := strings.ToLower(added[i]) |  | ||||||
| 			out[key] = append(out[key], added[i+1]) |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 	return out, ok | 	return out, ok | ||||||
| } | } | ||||||
|  |  | ||||||
| type rawMD struct { | type rawMD struct { | ||||||
| 	md MD | 	md MD | ||||||
| 	added [][]string |  | ||||||
| } | } | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user