From 617db003d40469d6b2d7847a85e1d96a787c3c16 Mon Sep 17 00:00:00 2001 From: Asim Aslam Date: Thu, 17 Jan 2019 09:40:49 +0000 Subject: [PATCH] Copy metadata --- metadata/metadata.go | 8 ++++++++ metadata/metadata_test.go | 15 +++++++++++++++ wrapper.go | 12 ++++-------- 3 files changed, 27 insertions(+), 8 deletions(-) diff --git a/metadata/metadata.go b/metadata/metadata.go index 63284bcc..3ae6ba85 100644 --- a/metadata/metadata.go +++ b/metadata/metadata.go @@ -12,6 +12,14 @@ type metaKey struct{} // from Transport headers. type Metadata map[string]string +func Copy(md Metadata) Metadata { + cmd := make(Metadata) + for k, v := range md { + cmd[k] = v + } + return cmd +} + func FromContext(ctx context.Context) (Metadata, bool) { md, ok := ctx.Value(metaKey{}).(Metadata) return md, ok diff --git a/metadata/metadata_test.go b/metadata/metadata_test.go index 4a6fd2c4..9b5545eb 100644 --- a/metadata/metadata_test.go +++ b/metadata/metadata_test.go @@ -5,6 +5,21 @@ import ( "testing" ) +func TestMetadataCopy(t *testing.T) { + md := Metadata{ + "foo": "bar", + "bar": "baz", + } + + cp := Copy(md) + + for k, v := range md { + if cv := cp[k]; cv != v { + t.Fatalf("Got %s:%s for %s:%s", k, cv, k, v) + } + } +} + func TestMetadataContext(t *testing.T) { md := Metadata{ "foo": "bar", diff --git a/wrapper.go b/wrapper.go index b7c59f04..e4977397 100644 --- a/wrapper.go +++ b/wrapper.go @@ -13,15 +13,11 @@ type clientWrapper struct { } func (c *clientWrapper) setHeaders(ctx context.Context) context.Context { - md := make(metadata.Metadata) - - if mda, ok := metadata.FromContext(ctx); ok { - // make copy of metadata - for k, v := range mda { - md[k] = v - } - } + // copy metadata + mda, _ := metadata.FromContext(ctx) + md := metadata.Copy(mda) + // set headers for k, v := range c.headers { if _, ok := md[k]; !ok { md[k] = v