Skip to content

Commit cf28209

Browse files
committed
msgpack#105 Add MessageUnpacker.readPayloadAsReference
1 parent bd82e49 commit cf28209

File tree

2 files changed

+50
-1
lines changed

2 files changed

+50
-1
lines changed

msgpack-core/src/main/java/org/msgpack/core/MessageUnpacker.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -202,6 +202,9 @@ private MessageBuffer takeNextBuffer() throws IOException {
202202
* @throws IOException
203203
*/
204204
private boolean ensure(int byteSizeToRead) throws IOException {
205+
if(byteSizeToRead == 0)
206+
return true;
207+
205208
if(!ensureBuffer())
206209
return false;
207210

@@ -1016,6 +1019,16 @@ public void readPayload(byte[] dst, int off, int len) throws IOException {
10161019
}
10171020
}
10181021

1022+
public MessageBuffer readPayloadAsReference(int length) throws IOException {
1023+
checkArgument(length >= 0);
1024+
if(!ensure(length))
1025+
throw new EOFException();
1026+
1027+
MessageBuffer ref = buffer.slice(position, length);
1028+
position += length;
1029+
return ref;
1030+
}
1031+
10191032

10201033
private int readNextLength8() throws IOException {
10211034
byte u8 = readByte();

msgpack-core/src/test/scala/org/msgpack/core/MessageUnpackerTest.scala

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -445,11 +445,47 @@ class MessageUnpackerTest extends MessagePackSpec {
445445
}
446446
unpacker.close()
447447
}
448-
}
449448

449+
block("v7-ref") {
450+
val unpacker = new MessageUnpacker(new ByteArrayInputStream(b))
451+
var i = 0
452+
while(i < R) {
453+
val len = unpacker.unpackBinaryHeader()
454+
val out = unpacker.readPayloadAsReference(len)
455+
i += 1
456+
}
457+
unpacker.close()
458+
}
459+
}
450460
}
451461

462+
"read payload as a reference" taggedAs("ref") in {
463+
464+
val dataSizes = Seq(0, 1, 5, 8, 16, 32, 128, 256, 1024, 2000, 10000, 100000)
465+
466+
for(s <- dataSizes) {
467+
When(f"data size is $s%,d")
468+
val data = new Array[Byte](s)
469+
Random.nextBytes(data)
470+
val b = new ByteArrayOutputStream()
471+
val packer = new MessagePacker(b)
472+
packer.packBinaryHeader(s)
473+
packer.writePayload(data)
474+
packer.close()
475+
476+
val unpacker = new MessageUnpacker(b.toByteArray)
477+
val len = unpacker.unpackBinaryHeader()
478+
len shouldBe s
479+
val ref = unpacker.readPayloadAsReference(len)
480+
unpacker.close()
481+
ref.size() shouldBe s
482+
val stored = new Array[Byte](len)
483+
ref.getBytes(0, stored, 0, len)
484+
485+
stored shouldBe data
486+
}
452487

488+
}
453489

454490
}
455491

0 commit comments

Comments
 (0)