gitee.com/zhaochuninhefei/gmgo@v0.0.31-0.20240209061119-069254a02979/go-grpc-middleware/tracing/opentracing/metadata.go (about)

     1  // Copyright 2017 Michal Witkowski. All Rights Reserved.
     2  // See LICENSE for licensing terms.
     3  
     4  package grpc_opentracing
     5  
     6  import (
     7  	"encoding/base64"
     8  	"strings"
     9  
    10  	"gitee.com/zhaochuninhefei/gmgo/grpc/metadata"
    11  )
    12  
    13  const (
    14  	binHdrSuffix = "-bin"
    15  )
    16  
    17  // metadataTextMap extends a metadata.MD to be an opentracing textmap
    18  type metadataTextMap metadata.MD
    19  
    20  // Set is a opentracing.TextMapReader interface that extracts values.
    21  func (m metadataTextMap) Set(key, val string) {
    22  	// gRPC allows for complex binary values to be written.
    23  	encodedKey, encodedVal := encodeKeyValue(key, val)
    24  	// The metadata object is a multimap, and previous values may exist, but for opentracing headers, we do not append
    25  	// we just override.
    26  	m[encodedKey] = []string{encodedVal}
    27  }
    28  
    29  // ForeachKey is a opentracing.TextMapReader interface that extracts values.
    30  func (m metadataTextMap) ForeachKey(callback func(key, val string) error) error {
    31  	for k, vv := range m {
    32  		for _, v := range vv {
    33  			// metadata.DecodeKeyValue is deprecated, use k and v directly instead.
    34  			//if decodedKey, decodedVal, err := metadata.DecodeKeyValue(k, v); err == nil {
    35  			//	if err = callback(decodedKey, decodedVal); err != nil {
    36  			//		return err
    37  			//	}
    38  			//} else {
    39  			//	return fmt.Errorf("failed decoding opentracing from gRPC metadata: %v", err)
    40  			//}
    41  			if err := callback(k, v); err != nil {
    42  				return err
    43  			}
    44  		}
    45  	}
    46  	return nil
    47  }
    48  
    49  // encodeKeyValue encodes key and value qualified for transmission via gRPC.
    50  // note: copy pasted from private values of grpc.metadata
    51  func encodeKeyValue(k, v string) (string, string) {
    52  	k = strings.ToLower(k)
    53  	if strings.HasSuffix(k, binHdrSuffix) {
    54  		val := base64.StdEncoding.EncodeToString([]byte(v))
    55  		v = val
    56  	}
    57  	return k, v
    58  }