package com.netifera.platform.net.daemon.sniffing.modules; import java.nio.ByteBuffer; import com.netifera.platform.net.daemon.sniffing.IStreamModuleContext; import com.netifera.platform.net.daemon.sniffing.ITCPBlockSniffer; import com.netifera.platform.net.sniffing.IPacketFilter; import com.netifera.platform.net.sniffing.stream.IBlockSnifferConfig; import com.netifera.platform.util.HexDump; public class BlockTest implements ITCPBlockSniffer { private final HexDump hex = new HexDump(); public IPacketFilter getFilter() { return null; } public String getName() { return "Block Sniffing Test"; } public void handleBlock(IStreamModuleContext ctx, ByteBuffer clientData, ByteBuffer serverData) { ctx.printOutput("New TCP (block) Session: " + ctx.getKey() + "\n"); ctx.printOutput("Client --> Server: " + clientData.remaining() + " bytes\n"); print(ctx, clientData); ctx.printOutput("Server -> Client:" + serverData.remaining() + " bytes\n"); print(ctx, serverData); } public void initialize(IBlockSnifferConfig config) { config.setTotalLimit(1024); } private void print(IStreamModuleContext ctx, ByteBuffer data) { int idx = firstNonAscii(data); if(idx == -1) { byte[] dataBytes = new byte[data.remaining()]; data.get(dataBytes); ctx.printOutput(new String(dataBytes)); } else if(idx == 0) { ctx.printOutput(hex.bufferDump(data)); } else { byte[] dataBytes = new byte[idx]; data.get(dataBytes, 0, idx); ctx.printOutput(new String(dataBytes) + "\n"); hex.setInitialOffset(idx); ctx.printOutput(hex.bufferDump(data)); hex.setInitialOffset(0); } ctx.printOutput("\n"); } private int firstNonAscii(ByteBuffer data) { int idx = 0; while(data.hasRemaining()) { int c = data.get() & 0xFF; if((c & 0x80) != 0 || (c < 0x20 && !(c == 0x0a || c == 0x0d))) { data.rewind(); return idx; } idx++; } data.rewind(); return -1; } }