mirror of
https://code.briarproject.org/briar/briar.git
synced 2026-02-18 21:59:54 +01:00
Slightly modified ConnectionWriterImpl to write a full-size frame as
soon as possible, rather than waiting for the next write.
This commit is contained in:
@@ -13,6 +13,10 @@ import javax.crypto.Mac;
|
|||||||
import net.sf.briar.api.transport.ConnectionWriter;
|
import net.sf.briar.api.transport.ConnectionWriter;
|
||||||
import net.sf.briar.util.ByteUtils;
|
import net.sf.briar.util.ByteUtils;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A ConnectionWriter that buffers its input and writes a frame whenever there
|
||||||
|
* is a full-size frame to write or the flush() method is called.
|
||||||
|
*/
|
||||||
class ConnectionWriterImpl extends FilterOutputStream
|
class ConnectionWriterImpl extends FilterOutputStream
|
||||||
implements ConnectionWriter {
|
implements ConnectionWriter {
|
||||||
|
|
||||||
@@ -45,8 +49,8 @@ implements ConnectionWriter {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void write(int b) throws IOException {
|
public void write(int b) throws IOException {
|
||||||
if(buf.size() == maxPayloadLength) writeFrame();
|
|
||||||
buf.write(b);
|
buf.write(b);
|
||||||
|
if(buf.size() == maxPayloadLength) writeFrame();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -57,7 +61,7 @@ implements ConnectionWriter {
|
|||||||
@Override
|
@Override
|
||||||
public void write(byte[] b, int off, int len) throws IOException {
|
public void write(byte[] b, int off, int len) throws IOException {
|
||||||
int available = maxPayloadLength - buf.size();
|
int available = maxPayloadLength - buf.size();
|
||||||
while(available < len) {
|
while(available <= len) {
|
||||||
buf.write(b, off, available);
|
buf.write(b, off, available);
|
||||||
writeFrame();
|
writeFrame();
|
||||||
off += available;
|
off += available;
|
||||||
|
|||||||
@@ -45,21 +45,31 @@ public class ConnectionWriterImplTest extends TransportTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testFrameIsWrittenAtMaxLength() throws Exception {
|
public void testWriteByteToMaxLengthWritesFrame() throws Exception {
|
||||||
ByteArrayOutputStream out = new ByteArrayOutputStream();
|
ByteArrayOutputStream out = new ByteArrayOutputStream();
|
||||||
ConnectionEncrypter e = new NullConnectionEncrypter(out);
|
ConnectionEncrypter e = new NullConnectionEncrypter(out);
|
||||||
ConnectionWriter w = new ConnectionWriterImpl(e, mac);
|
ConnectionWriter w = new ConnectionWriterImpl(e, mac);
|
||||||
OutputStream out1 = w.getOutputStream();
|
OutputStream out1 = w.getOutputStream();
|
||||||
// The first maxPayloadLength bytes should be buffered
|
// The first maxPayloadLength - 1 bytes should be buffered
|
||||||
for(int i = 0; i < maxPayloadLength; i++) out1.write(0);
|
for(int i = 0; i < maxPayloadLength - 1; i++) out1.write(0);
|
||||||
assertEquals(0, out.size());
|
assertEquals(0, out.size());
|
||||||
// The next byte should trigger the writing of a frame
|
// The next byte should trigger the writing of a frame
|
||||||
out1.write(0);
|
out1.write(0);
|
||||||
assertEquals(MAX_FRAME_LENGTH, out.size());
|
assertEquals(MAX_FRAME_LENGTH, out.size());
|
||||||
// Flushing the stream should write a single-byte frame
|
}
|
||||||
out1.flush();
|
|
||||||
assertEquals(MAX_FRAME_LENGTH + headerLength + 1 + macLength,
|
@Test
|
||||||
out.size());
|
public void testWriteArrayToMaxLengthWritesFrame() throws Exception {
|
||||||
|
ByteArrayOutputStream out = new ByteArrayOutputStream();
|
||||||
|
ConnectionEncrypter e = new NullConnectionEncrypter(out);
|
||||||
|
ConnectionWriter w = new ConnectionWriterImpl(e, mac);
|
||||||
|
OutputStream out1 = w.getOutputStream();
|
||||||
|
// The first maxPayloadLength - 1 bytes should be buffered
|
||||||
|
out1.write(new byte[maxPayloadLength - 1]);
|
||||||
|
assertEquals(0, out.size());
|
||||||
|
// The next maxPayloadLength + 1 bytes should trigger two frames
|
||||||
|
out1.write(new byte[maxPayloadLength + 1]);
|
||||||
|
assertEquals(MAX_FRAME_LENGTH * 2, out.size());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
|||||||
Reference in New Issue
Block a user