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:
akwizgran
2011-08-19 20:10:14 +02:00
parent 0132c1eff4
commit 3b32aee6be
2 changed files with 23 additions and 9 deletions

View File

@@ -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;

View File

@@ -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