7 "google.golang.org/grpc/metadata"
10 type metaContext string
13 correlationID metaContext = "correlation-id"
14 responseHDR metaContext = "my-response-header"
15 responseTRLR metaContext = "my-response-trailer"
16 correlationIDTRLR metaContext = "correlation-id-consumed"
19 /* client before functions */
21 func injectCorrelationID(ctx context.Context, md *metadata.MD) context.Context {
22 if hdr, ok := ctx.Value(correlationID).(string); ok {
23 fmt.Printf("\tClient found correlationID %q in context, set metadata header\n", hdr)
24 (*md)[string(correlationID)] = append((*md)[string(correlationID)], hdr)
29 func displayClientRequestHeaders(ctx context.Context, md *metadata.MD) context.Context {
31 fmt.Println("\tClient >> Request Headers:")
32 for key, val := range *md {
33 fmt.Printf("\t\t%s: %s\n", key, val[len(val)-1])
39 /* server before functions */
41 func extractCorrelationID(ctx context.Context, md metadata.MD) context.Context {
42 if hdr, ok := md[string(correlationID)]; ok {
43 cID := hdr[len(hdr)-1]
44 ctx = context.WithValue(ctx, correlationID, cID)
45 fmt.Printf("\tServer received correlationID %q in metadata header, set context\n", cID)
50 func displayServerRequestHeaders(ctx context.Context, md metadata.MD) context.Context {
52 fmt.Println("\tServer << Request Headers:")
53 for key, val := range md {
54 fmt.Printf("\t\t%s: %s\n", key, val[len(val)-1])
60 /* server after functions */
62 func injectResponseHeader(ctx context.Context, md *metadata.MD, _ *metadata.MD) context.Context {
63 *md = metadata.Join(*md, metadata.Pairs(string(responseHDR), "has-a-value"))
67 func displayServerResponseHeaders(ctx context.Context, md *metadata.MD, _ *metadata.MD) context.Context {
69 fmt.Println("\tServer >> Response Headers:")
70 for key, val := range *md {
71 fmt.Printf("\t\t%s: %s\n", key, val[len(val)-1])
77 func injectResponseTrailer(ctx context.Context, _ *metadata.MD, md *metadata.MD) context.Context {
78 *md = metadata.Join(*md, metadata.Pairs(string(responseTRLR), "has-a-value-too"))
82 func injectConsumedCorrelationID(ctx context.Context, _ *metadata.MD, md *metadata.MD) context.Context {
83 if hdr, ok := ctx.Value(correlationID).(string); ok {
84 fmt.Printf("\tServer found correlationID %q in context, set consumed trailer\n", hdr)
85 *md = metadata.Join(*md, metadata.Pairs(string(correlationIDTRLR), hdr))
90 func displayServerResponseTrailers(ctx context.Context, _ *metadata.MD, md *metadata.MD) context.Context {
92 fmt.Println("\tServer >> Response Trailers:")
93 for key, val := range *md {
94 fmt.Printf("\t\t%s: %s\n", key, val[len(val)-1])
100 /* client after functions */
102 func displayClientResponseHeaders(ctx context.Context, md metadata.MD, _ metadata.MD) context.Context {
104 fmt.Println("\tClient << Response Headers:")
105 for key, val := range md {
106 fmt.Printf("\t\t%s: %s\n", key, val[len(val)-1])
112 func displayClientResponseTrailers(ctx context.Context, _ metadata.MD, md metadata.MD) context.Context {
114 fmt.Println("\tClient << Response Trailers:")
115 for key, val := range md {
116 fmt.Printf("\t\t%s: %s\n", key, val[len(val)-1])
122 func extractConsumedCorrelationID(ctx context.Context, _ metadata.MD, md metadata.MD) context.Context {
123 if hdr, ok := md[string(correlationIDTRLR)]; ok {
124 fmt.Printf("\tClient received consumed correlationID %q in metadata trailer, set context\n", hdr[len(hdr)-1])
125 ctx = context.WithValue(ctx, correlationIDTRLR, hdr[len(hdr)-1])
130 /* CorrelationID context handlers */
132 func SetCorrelationID(ctx context.Context, v string) context.Context {
133 return context.WithValue(ctx, correlationID, v)
136 func GetConsumedCorrelationID(ctx context.Context) string {
137 if trlr, ok := ctx.Value(correlationIDTRLR).(string); ok {