Skip to content

Commit b4cae07

Browse files
vicbbcoe
andauthored
fix!: encoding of empty Buffers (#1514)
closes #1500 fixes #885 Co-authored-by: Benjamin E. Coe <[email protected]>
1 parent 52d4f00 commit b4cae07

File tree

4 files changed

+25
-9
lines changed

4 files changed

+25
-9
lines changed

src/converter.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ function genValuePartial_fromObject(gen, field, fieldIndex, prop) {
7171
case "bytes": gen
7272
("if(typeof d%s===\"string\")", prop)
7373
("util.base64.decode(d%s,m%s=util.newBuffer(util.base64.length(d%s)),0)", prop, prop, prop)
74-
("else if(d%s.length)", prop)
74+
("else if(d%s.length >= 0)", prop)
7575
("m%s=d%s", prop, prop);
7676
break;
7777
case "string": gen

tests/api_converters.js

+18-2
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ tape.test("converters", function(test) {
1212

1313
test.test(test.name + " - Message#toObject", function(test) {
1414

15-
test.plan(5);
15+
test.plan(6);
1616

1717
test.test(test.name + " - called with defaults = true", function(test) {
1818
var obj = Message.toObject(Message.create(), { defaults: true });
@@ -23,7 +23,7 @@ tape.test("converters", function(test) {
2323
test.same(obj.uint64Val, { low: 0, high: 0, unsigned: true }, "should set uint64Val");
2424
test.same(obj.uint64Repeated, [], "should set uint64Repeated");
2525

26-
test.same(obj.bytesVal, [], "should set bytesVal");
26+
test.same(obj.bytesVal, protobuf.util.newBuffer(0), "should set bytesVal");
2727
test.same(obj.bytesRepeated, [], "should set bytesRepeated");
2828

2929
test.equal(obj.enumVal, 1, "should set enumVal to the first defined value");
@@ -131,6 +131,22 @@ tape.test("converters", function(test) {
131131
test.end();
132132
});
133133

134+
test.test(test.name + " - Message.toObject with empty buffers", function(test) {
135+
var msg = Message.create({
136+
bytesVal: protobuf.util.newBuffer(0),
137+
});
138+
139+
test.equal(Message.toObject(msg, { bytes: String }).bytesVal, "", "bytes to base64 strings");
140+
141+
if (protobuf.util.isNode) {
142+
const bytesVal = Message.toObject(msg, { bytes: Buffer }).bytesVal;
143+
test.ok(Buffer.isBuffer(bytesVal), "bytes to buffers");
144+
test.equal(bytesVal.length, 0, "empty buffer");
145+
}
146+
147+
test.end();
148+
});
149+
134150
});
135151

136152
test.test(test.name + " - Message.fromObject", function(test) {

tests/data/convert.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -412,7 +412,7 @@ $root.Message = (function() {
412412
if (object.bytesVal != null)
413413
if (typeof object.bytesVal === "string")
414414
$util.base64.decode(object.bytesVal, message.bytesVal = $util.newBuffer($util.base64.length(object.bytesVal)), 0);
415-
else if (object.bytesVal.length)
415+
else if (object.bytesVal.length >= 0)
416416
message.bytesVal = object.bytesVal;
417417
if (object.bytesRepeated) {
418418
if (!Array.isArray(object.bytesRepeated))
@@ -421,7 +421,7 @@ $root.Message = (function() {
421421
for (var i = 0; i < object.bytesRepeated.length; ++i)
422422
if (typeof object.bytesRepeated[i] === "string")
423423
$util.base64.decode(object.bytesRepeated[i], message.bytesRepeated[i] = $util.newBuffer($util.base64.length(object.bytesRepeated[i])), 0);
424-
else if (object.bytesRepeated[i].length)
424+
else if (object.bytesRepeated[i].length >= 0)
425425
message.bytesRepeated[i] = object.bytesRepeated[i];
426426
}
427427
switch (object.enumVal) {

tests/data/test.js

+4-4
Original file line numberDiff line numberDiff line change
@@ -3522,7 +3522,7 @@ $root.jspb = (function() {
35223522
if (object.bytesField != null)
35233523
if (typeof object.bytesField === "string")
35243524
$util.base64.decode(object.bytesField, message.bytesField = $util.newBuffer($util.base64.length(object.bytesField)), 0);
3525-
else if (object.bytesField.length)
3525+
else if (object.bytesField.length >= 0)
35263526
message.bytesField = object.bytesField;
35273527
return message;
35283528
};
@@ -4261,7 +4261,7 @@ $root.jspb = (function() {
42614261
if (object.bytesField != null)
42624262
if (typeof object.bytesField === "string")
42634263
$util.base64.decode(object.bytesField, message.bytesField = $util.newBuffer($util.base64.length(object.bytesField)), 0);
4264-
else if (object.bytesField.length)
4264+
else if (object.bytesField.length >= 0)
42654265
message.bytesField = object.bytesField;
42664266
if (object.unused != null)
42674267
message.unused = String(object.unused);
@@ -6701,7 +6701,7 @@ $root.jspb = (function() {
67016701
if (object.data != null)
67026702
if (typeof object.data === "string")
67036703
$util.base64.decode(object.data, message.data = $util.newBuffer($util.base64.length(object.data)), 0);
6704-
else if (object.data.length)
6704+
else if (object.data.length >= 0)
67056705
message.data = object.data;
67066706
return message;
67076707
};
@@ -14741,7 +14741,7 @@ $root.google = (function() {
1474114741
if (object.stringValue != null)
1474214742
if (typeof object.stringValue === "string")
1474314743
$util.base64.decode(object.stringValue, message.stringValue = $util.newBuffer($util.base64.length(object.stringValue)), 0);
14744-
else if (object.stringValue.length)
14744+
else if (object.stringValue.length >= 0)
1474514745
message.stringValue = object.stringValue;
1474614746
if (object.aggregateValue != null)
1474714747
message.aggregateValue = String(object.aggregateValue);

0 commit comments

Comments
 (0)