From c3e4742bfed9b06e38234c79f6be407e674123b9 Mon Sep 17 00:00:00 2001
From: akwizgran <michael@briarproject.org>
Date: Fri, 27 Apr 2018 22:36:31 +0100
Subject: [PATCH] Use buffers for record headers. No need to buffer payloads.

---
 .../bramble/record/RecordReaderImpl.java        | 13 ++++++++-----
 .../bramble/record/RecordWriterImpl.java        | 17 ++++++++++-------
 2 files changed, 18 insertions(+), 12 deletions(-)

diff --git a/bramble-core/src/main/java/org/briarproject/bramble/record/RecordReaderImpl.java b/bramble-core/src/main/java/org/briarproject/bramble/record/RecordReaderImpl.java
index 92fb696ae5..12aac514ca 100644
--- a/bramble-core/src/main/java/org/briarproject/bramble/record/RecordReaderImpl.java
+++ b/bramble-core/src/main/java/org/briarproject/bramble/record/RecordReaderImpl.java
@@ -4,8 +4,8 @@ import org.briarproject.bramble.api.FormatException;
 import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
 import org.briarproject.bramble.api.record.Record;
 import org.briarproject.bramble.api.record.RecordReader;
+import org.briarproject.bramble.util.ByteUtils;
 
-import java.io.BufferedInputStream;
 import java.io.DataInputStream;
 import java.io.IOException;
 import java.io.InputStream;
@@ -13,22 +13,25 @@ import java.io.InputStream;
 import javax.annotation.concurrent.NotThreadSafe;
 
 import static org.briarproject.bramble.api.record.Record.MAX_RECORD_PAYLOAD_BYTES;
+import static org.briarproject.bramble.api.record.Record.RECORD_HEADER_BYTES;
 
 @NotThreadSafe
 @NotNullByDefault
 class RecordReaderImpl implements RecordReader {
 
 	private final DataInputStream in;
+	private final byte[] header = new byte[RECORD_HEADER_BYTES];
 
 	RecordReaderImpl(InputStream in) {
-		this.in = new DataInputStream(new BufferedInputStream(in, 1024));
+		this.in = new DataInputStream(in);
 	}
 
 	@Override
 	public Record readRecord() throws IOException {
-		byte protocolVersion = in.readByte();
-		byte recordType = in.readByte();
-		int payloadLength = in.readShort() & 0xFFFF; // Convert to unsigned
+		in.readFully(header);
+		byte protocolVersion = header[0];
+		byte recordType = header[1];
+		int payloadLength = ByteUtils.readUint16(header, 2);
 		if (payloadLength < 0 || payloadLength > MAX_RECORD_PAYLOAD_BYTES)
 			throw new FormatException();
 		byte[] payload = new byte[payloadLength];
diff --git a/bramble-core/src/main/java/org/briarproject/bramble/record/RecordWriterImpl.java b/bramble-core/src/main/java/org/briarproject/bramble/record/RecordWriterImpl.java
index 281b3c6382..ec9f5c0c02 100644
--- a/bramble-core/src/main/java/org/briarproject/bramble/record/RecordWriterImpl.java
+++ b/bramble-core/src/main/java/org/briarproject/bramble/record/RecordWriterImpl.java
@@ -3,30 +3,33 @@ package org.briarproject.bramble.record;
 import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
 import org.briarproject.bramble.api.record.Record;
 import org.briarproject.bramble.api.record.RecordWriter;
+import org.briarproject.bramble.util.ByteUtils;
 
-import java.io.BufferedOutputStream;
-import java.io.DataOutputStream;
 import java.io.IOException;
 import java.io.OutputStream;
 
 import javax.annotation.concurrent.NotThreadSafe;
 
+import static org.briarproject.bramble.api.record.Record.RECORD_HEADER_BYTES;
+
 @NotThreadSafe
 @NotNullByDefault
 class RecordWriterImpl implements RecordWriter {
 
-	private final DataOutputStream out;
+	private final OutputStream out;
+	private final byte[] header = new byte[RECORD_HEADER_BYTES];
 
 	RecordWriterImpl(OutputStream out) {
-		this.out = new DataOutputStream(new BufferedOutputStream(out, 1024));
+		this.out = out;
 	}
 
 	@Override
 	public void writeRecord(Record r) throws IOException {
-		out.write(r.getProtocolVersion());
-		out.write(r.getRecordType());
 		byte[] payload = r.getPayload();
-		out.writeShort(payload.length);
+		header[0] = r.getProtocolVersion();
+		header[1] = r.getRecordType();
+		ByteUtils.writeUint16(payload.length, header, 2);
+		out.write(header);
 		out.write(payload);
 	}
 
-- 
GitLab