aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/node
diff options
context:
space:
mode:
authorGravatar murgatroid99 <mlumish@google.com>2015-08-27 13:48:25 -0700
committerGravatar murgatroid99 <mlumish@google.com>2015-08-27 13:48:25 -0700
commit047f20d302f48c5ffafc58a5278e27d7edfba80f (patch)
tree28f5a483af4826cf7f52568e9cec47af9f3336f8 /src/node
parent6f1e2ea7b241cef9c2a3178bb19c4c646ef7f6f6 (diff)
Make single-response calls emit INTERNAL status for unparseable responses
Diffstat (limited to 'src/node')
-rw-r--r--src/node/src/client.js74
1 files changed, 55 insertions, 19 deletions
diff --git a/src/node/src/client.js b/src/node/src/client.js
index e1bed3512e..2323caecc0 100644
--- a/src/node/src/client.js
+++ b/src/node/src/client.js
@@ -142,7 +142,13 @@ function _read(size) {
return;
}
var data = event.read;
- if (self.push(self.deserialize(data)) && data !== null) {
+ var deserialized;
+ try {
+ deserialized = self.deserialize(data);
+ } catch (e) {
+ self.cancel();
+ }
+ if (self.push(deserialized) && data !== null) {
var read_batch = {};
read_batch[grpc.opType.RECV_MESSAGE] = true;
self.call.startBatch(read_batch, readCallback);
@@ -296,23 +302,38 @@ function makeUnaryRequestFunction(method, serialize, deserialize) {
call.startBatch(client_batch, function(err, response) {
response.status.metadata = Metadata._fromCoreRepresentation(
response.status.metadata);
- emitter.emit('status', response.status);
- if (response.status.code !== grpc.status.OK) {
- var error = new Error(response.status.details);
- error.code = response.status.code;
- error.metadata = response.status.metadata;
- callback(error);
- return;
- } else {
+ var status = response.status;
+ var error;
+ var deserialized;
+ if (status.code === grpc.status.OK) {
if (err) {
// Got a batch error, but OK status. Something went wrong
callback(err);
return;
+ } else {
+ try {
+ deserialized = deserialize(response.read);
+ } catch (e) {
+ /* Change status to indicate bad server response. This will result
+ * in passing an error to the callback */
+ status = {
+ code: grpc.status.INTERNAL,
+ details: 'Failed to parse server response'
+ };
+ }
}
}
+ if (status.code !== grpc.status.OK) {
+ error = new Error(response.status.details);
+ error.code = status.code;
+ error.metadata = status.metadata;
+ callback(error);
+ } else {
+ callback(null, deserialized);
+ }
+ emitter.emit('status', status);
emitter.emit('metadata', Metadata._fromCoreRepresentation(
response.metadata));
- callback(null, deserialize(response.read));
});
});
return emitter;
@@ -374,21 +395,36 @@ function makeClientStreamRequestFunction(method, serialize, deserialize) {
call.startBatch(client_batch, function(err, response) {
response.status.metadata = Metadata._fromCoreRepresentation(
response.status.metadata);
- stream.emit('status', response.status);
- if (response.status.code !== grpc.status.OK) {
- var error = new Error(response.status.details);
- error.code = response.status.code;
- error.metadata = response.status.metadata;
- callback(error);
- return;
- } else {
+ var status = response.status;
+ var error;
+ var deserialized;
+ if (status.code === grpc.status.OK) {
if (err) {
// Got a batch error, but OK status. Something went wrong
callback(err);
return;
+ } else {
+ try {
+ deserialized = deserialize(response.read);
+ } catch (e) {
+ /* Change status to indicate bad server response. This will result
+ * in passing an error to the callback */
+ status = {
+ code: grpc.status.INTERNAL,
+ details: 'Failed to parse server response'
+ };
+ }
}
}
- callback(null, deserialize(response.read));
+ if (status.code !== grpc.status.OK) {
+ error = new Error(response.status.details);
+ error.code = status.code;
+ error.metadata = status.metadata;
+ callback(error);
+ } else {
+ callback(null, deserialized);
+ }
+ stream.emit('status', status);
});
});
return stream;