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 92fb696ae54eae284083b10a2dcf37864ed206dd..12aac514ca3b67d68622eef507e2b9985a6bd115 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 281b3c6382c1257e48140dbdaa83c3afe168a461..ec9f5c0c026746652c537838f47db7fa4451b614 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); }