prepare to map[string]string
This commit is contained in:
		| @@ -1,6 +1,6 @@ | ||||
| //go:build exclude | ||||
|  | ||||
| //TODO need compare with micro metadata | ||||
| // TODO need compare with micro metadata | ||||
| package metadata | ||||
|  | ||||
| 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 | ||||
| // 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. | ||||
| // | ||||
| @@ -36,7 +36,7 @@ func New(m map[string]string) MD { | ||||
| 	md := make(MD, len(m)) | ||||
| 	for k, val := range m { | ||||
| 		key := strings.ToLower(k) | ||||
| 		md[key] = append(md[key], val) | ||||
| 		md[key] = val | ||||
| 	} | ||||
| 	return md | ||||
| } | ||||
| @@ -61,7 +61,7 @@ func Pairs(kv ...string) MD { | ||||
| 	md := make(MD, len(kv)/2) | ||||
| 	for i := 0; i < len(kv); i += 2 { | ||||
| 		key := strings.ToLower(kv[i]) | ||||
| 		md[key] = append(md[key], kv[i+1]) | ||||
| 		md[key] = kv[i+1] | ||||
| 	} | ||||
| 	return md | ||||
| } | ||||
| @@ -75,7 +75,7 @@ func (md MD) Len() int { | ||||
| func (md MD) Copy() MD { | ||||
| 	out := make(MD, len(md)) | ||||
| 	for k, v := range md { | ||||
| 		out[k] = copyOf(v) | ||||
| 		out[k] = v | ||||
| 	} | ||||
| 	return out | ||||
| } | ||||
| @@ -83,7 +83,7 @@ func (md MD) Copy() MD { | ||||
| // Get obtains the values for a given key. | ||||
| // | ||||
| // 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) | ||||
| 	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. | ||||
| // | ||||
| // 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 { | ||||
| 		return | ||||
| 	} | ||||
| @@ -103,12 +103,12 @@ func (md MD) Set(k string, vals ...string) { | ||||
| // that key. | ||||
| // | ||||
| // 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 { | ||||
| 		return | ||||
| 	} | ||||
| 	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 | ||||
| @@ -126,7 +126,7 @@ func Join(mds ...MD) MD { | ||||
| 	out := MD{} | ||||
| 	for _, md := range mds { | ||||
| 		for k, v := range md { | ||||
| 			out[k] = append(out[k], v...) | ||||
| 			out[k] = v | ||||
| 		} | ||||
| 	} | ||||
| 	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))) | ||||
| 	} | ||||
| 	md, _ := ctx.Value(mdOutgoingKey{}).(rawMD) | ||||
| 	added := make([][]string, len(md.added)+1) | ||||
| 	copy(added, md.added) | ||||
|  | ||||
| 	kvCopy := make([]string, 0, len(kv)) | ||||
| 	for i := 0; i < len(kv); i += 2 { | ||||
| 		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. | ||||
| @@ -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 | ||||
| 		// created using our helper functions. | ||||
| 		key := strings.ToLower(k) | ||||
| 		out[key] = copyOf(v) | ||||
| 		out[key] = v | ||||
| 	} | ||||
| 	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. | ||||
| // | ||||
| // 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 | ||||
| // the extra kv pairs (AppendToOutgoingContext doesn't turn them into | ||||
| // lowercase). | ||||
| func fromOutgoingContextRaw(ctx context.Context) (MD, [][]string, bool) { | ||||
| func fromOutgoingContextRaw(ctx context.Context) (MD, bool) { | ||||
| 	raw, ok := ctx.Value(mdOutgoingKey{}).(rawMD) | ||||
| 	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. | ||||
| @@ -239,33 +209,18 @@ func FromOutgoingContext(ctx context.Context) (MD, bool) { | ||||
| 		return nil, false | ||||
| 	} | ||||
|  | ||||
| 	mdSize := len(raw.md) | ||||
| 	for i := range raw.added { | ||||
| 		mdSize += len(raw.added[i]) / 2 | ||||
| 	} | ||||
|  | ||||
| 	out := make(MD, mdSize) | ||||
| 	out := make(MD, len(raw.md)) | ||||
| 	for k, v := range raw.md { | ||||
| 		// 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 | ||||
| 		// created using our helper functions. | ||||
| 		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 | ||||
| } | ||||
|  | ||||
| type rawMD struct { | ||||
| 	md    MD | ||||
| 	added [][]string | ||||
| 	md MD | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user