From 9444e8ce37cc63e899713001dbe1b92eb2b7ae8f Mon Sep 17 00:00:00 2001 From: Adam Date: Sun, 26 Mar 2017 12:10:00 -0400 Subject: [PATCH] cache: fix cache server to buffer stream socket data, this works with vanilla client --- .../cache/server/CacheServerHandler.java | 54 ++++++++++++++----- .../net/runelite/cache/fs/StoreLoadTest.java | 25 ++++++--- .../cache/server/CacheServerTest.java | 15 ++++++ 3 files changed, 74 insertions(+), 20 deletions(-) diff --git a/cache/src/main/java/net/runelite/cache/server/CacheServerHandler.java b/cache/src/main/java/net/runelite/cache/server/CacheServerHandler.java index 41e0e6f92e..83c304ae45 100644 --- a/cache/src/main/java/net/runelite/cache/server/CacheServerHandler.java +++ b/cache/src/main/java/net/runelite/cache/server/CacheServerHandler.java @@ -49,6 +49,7 @@ public class CacheServerHandler extends SimpleChannelInboundHandler private final Store store; private ClientState state = ClientState.HANDSHAKING; + private final ByteBuf buffer = Unpooled.buffer(); public CacheServerHandler(CacheServer server) { @@ -61,22 +62,37 @@ public class CacheServerHandler extends SimpleChannelInboundHandler { System.out.println(ByteBufUtil.prettyHexDump(buf)); - switch (state) + buffer.writeBytes(buf); + + int last = -1; + while (buffer.readableBytes() != last) { - case HANDSHAKING: - handshake(ctx, buf); - break; - case CONNECTING: - connecting(ctx, buf); - break; - case CONNECTED: - connected(ctx, buf); - break; + last = buffer.readableBytes(); + + switch (state) + { + case HANDSHAKING: + handshake(ctx, buffer); + break; + case CONNECTING: + connecting(ctx, buffer); + break; + case CONNECTED: + connected(ctx, buffer); + break; + } } + + buffer.discardReadBytes(); } private void handshake(ChannelHandlerContext ctx, ByteBuf buf) { + if (buf.readableBytes() < 5) + { + return; + } + byte type = buf.readByte(); if (type != 15) { @@ -105,6 +121,11 @@ public class CacheServerHandler extends SimpleChannelInboundHandler private void connecting(ChannelHandlerContext ctx, ByteBuf buf) { + if (buf.readableBytes() < 4) + { + return; + } + ConnectionInfo cinfo = new ConnectionInfo(); cinfo.setType(buf.readByte()); cinfo.setPadding(buf.readMedium()); @@ -121,13 +142,18 @@ public class CacheServerHandler extends SimpleChannelInboundHandler // byte[1] = index // byte[2-3] = archive id + if (buf.readableBytes() < 4) + { + return; + } + byte requesting255 = buf.readByte(); int index = buf.readByte() & 0xFF; int archiveId = buf.readShort() & 0xFFFF; - if (requesting255 != 0) + if (index == 255) { - handle255(ctx, index, archiveId); + handle255(ctx, requesting255, index, archiveId); } else { @@ -135,9 +161,9 @@ public class CacheServerHandler extends SimpleChannelInboundHandler } } - private void handle255(ChannelHandlerContext ctx, int index, int archiveId) + private void handle255(ChannelHandlerContext ctx, byte requesting255, int index, int archiveId) { - logger.info("Client {} requests 255, index {}, archive {}", ctx.channel().remoteAddress(), index, archiveId); + logger.info("Client {} requests 255 {}, index {}, archive {}", ctx.channel().remoteAddress(), requesting255, index, archiveId); if (archiveId == 255) { diff --git a/cache/src/test/java/net/runelite/cache/fs/StoreLoadTest.java b/cache/src/test/java/net/runelite/cache/fs/StoreLoadTest.java index 1e9a3d06c3..37691b7908 100644 --- a/cache/src/test/java/net/runelite/cache/fs/StoreLoadTest.java +++ b/cache/src/test/java/net/runelite/cache/fs/StoreLoadTest.java @@ -89,14 +89,27 @@ public class StoreLoadTest @Ignore public void loadTree() throws IOException { - Store store = new Store(folder.newFolder()); - store.loadTree(new java.io.File("C:\\rs\\temp\\tree")); - - try (Store store2 = new Store(StoreLocation.LOCATION)) + try (Store store = new Store(folder.newFolder())) { - store2.load(); + store.loadTree(new java.io.File("C:\\rs\\temp\\tree")); + + try (Store store2 = new Store(StoreLocation.LOCATION)) + { + store2.load(); - Assert.assertEquals(store, store2); + Assert.assertEquals(store, store2); + } + } + } + + @Test + @Ignore + public void saveTree() throws IOException + { + try (Store store = new Store(new java.io.File("d:/rs/07/temp/cache"))) + { + store.load(); + store.saveTree(new java.io.File("d:/rs/07/temp/tree")); } } } diff --git a/cache/src/test/java/net/runelite/cache/server/CacheServerTest.java b/cache/src/test/java/net/runelite/cache/server/CacheServerTest.java index 1177d28fc9..a4d598e6fb 100644 --- a/cache/src/test/java/net/runelite/cache/server/CacheServerTest.java +++ b/cache/src/test/java/net/runelite/cache/server/CacheServerTest.java @@ -45,6 +45,21 @@ public class CacheServerTest @Rule public TemporaryFolder folder = StoreLocation.getTemporaryFolder(); + @Test + @Ignore + public void run() throws Exception + { + try (Store store = new Store(new java.io.File("D:\\rs\\07\\temp\\cache139")); + CacheServer server = new CacheServer(store, REVISION)) + { + store.load(); + store.rebuildCrc(); + + server.start(); + server.waitForClose(); + } + } + @Test @Ignore public void testDownload() throws Exception