From 4ad400341e624947abbd08dd8ab8f06a6610b7e5 Mon Sep 17 00:00:00 2001
From: murgatroid99 <mlumish@google.com>
Date: Thu, 27 Aug 2015 10:02:24 -0700
Subject: [PATCH] Fixed handling of binary metadata values

---
 src/node/ext/call.cc     | 23 ++++++++++++-----------
 src/node/src/metadata.js |  4 +++-
 2 files changed, 15 insertions(+), 12 deletions(-)

diff --git a/src/node/ext/call.cc b/src/node/ext/call.cc
index 18858fa334..fddc1e214f 100644
--- a/src/node/ext/call.cc
+++ b/src/node/ext/call.cc
@@ -111,17 +111,19 @@ bool CreateMetadataArray(Handle<Object> metadata, grpc_metadata_array *array,
           NanAssignPersistent(*handle, value);
           resources->handles.push_back(unique_ptr<PersistentHolder>(
               new PersistentHolder(handle)));
-          continue;
+        } else {
+          return false;
         }
-      }
-      if (value->IsString()) {
-        Handle<String> string_value = value->ToString();
-        NanUtf8String *utf8_value = new NanUtf8String(string_value);
-        resources->strings.push_back(unique_ptr<NanUtf8String>(utf8_value));
-        current->value = **utf8_value;
-        current->value_length = string_value->Length();
       } else {
-        return false;
+        if (value->IsString()) {
+          Handle<String> string_value = value->ToString();
+          NanUtf8String *utf8_value = new NanUtf8String(string_value);
+          resources->strings.push_back(unique_ptr<NanUtf8String>(utf8_value));
+          current->value = **utf8_value;
+          current->value_length = string_value->Length();
+        } else {
+          return false;
+        }
       }
       array->count += 1;
     }
@@ -156,8 +158,7 @@ Handle<Value> ParseMetadata(const grpc_metadata_array *metadata_array) {
     }
     if (EndsWith(elem->key, "-bin")) {
       array->Set(index_map[elem->key],
-                 MakeFastBuffer(
-                     NanNewBufferHandle(elem->value, elem->value_length)));
+                 NanNewBufferHandle(elem->value, elem->value_length));
     } else {
       array->Set(index_map[elem->key], NanNew(elem->value));
     }
diff --git a/src/node/src/metadata.js b/src/node/src/metadata.js
index 65fd91f367..c1da70b197 100644
--- a/src/node/src/metadata.js
+++ b/src/node/src/metadata.js
@@ -147,7 +147,9 @@ Metadata.prototype.getMap = function() {
  */
 Metadata.prototype.clone = function() {
   var copy = new Metadata();
-  copy._internal_repr = _.cloneDeep(this._internal_repr);
+  _.forOwn(this._internal_repr, function(value, key) {
+    copy._internal_repr[key] = _.clone(value);
+  });
   return copy;
 };
 
-- 
GitLab