diff --git a/src/main/java/ru/serega6531/packmate/service/PatternMatcher.java b/src/main/java/ru/serega6531/packmate/service/PatternMatcher.java index 5c7e2a0..288777c 100644 --- a/src/main/java/ru/serega6531/packmate/service/PatternMatcher.java +++ b/src/main/java/ru/serega6531/packmate/service/PatternMatcher.java @@ -4,7 +4,7 @@ import org.apache.commons.lang3.StringUtils; import org.springframework.security.crypto.codec.Hex; import ru.serega6531.packmate.model.FoundPattern; import ru.serega6531.packmate.model.Pattern; -import ru.serega6531.packmate.utils.Bytes; +import ru.serega6531.packmate.utils.BytesUtils; import java.util.*; import java.util.regex.Matcher; @@ -80,7 +80,7 @@ class PatternMatcher { final byte[] value = Hex.decode(pattern.getValue()); while (true) { - int start = Bytes.indexOf(contentBytes, value, startSearch, contentBytes.length); + int start = BytesUtils.indexOf(contentBytes, value, startSearch, contentBytes.length); if (start == -1) { return; diff --git a/src/main/java/ru/serega6531/packmate/service/optimization/HttpChunksProcessor.java b/src/main/java/ru/serega6531/packmate/service/optimization/HttpChunksProcessor.java index 79fcbcb..c9ecb53 100644 --- a/src/main/java/ru/serega6531/packmate/service/optimization/HttpChunksProcessor.java +++ b/src/main/java/ru/serega6531/packmate/service/optimization/HttpChunksProcessor.java @@ -1,10 +1,11 @@ package ru.serega6531.packmate.service.optimization; +import com.google.common.primitives.Bytes; import lombok.RequiredArgsConstructor; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; import ru.serega6531.packmate.model.Packet; -import ru.serega6531.packmate.utils.Bytes; +import ru.serega6531.packmate.utils.BytesUtils; import ru.serega6531.packmate.utils.PacketUtils; import java.io.ByteArrayOutputStream; @@ -57,7 +58,7 @@ public class HttpChunksProcessor { } private void checkCompleteChunk(List packets, int start) { - boolean end = Bytes.endsWith(packets.get(packets.size() - 1).getContent(), "\r\n0\r\n\r\n".getBytes()); + boolean end = BytesUtils.endsWith(packets.get(packets.size() - 1).getContent(), "\r\n0\r\n\r\n".getBytes()); if (end) { processChunk(packets, start); diff --git a/src/main/java/ru/serega6531/packmate/service/optimization/HttpGzipProcessor.java b/src/main/java/ru/serega6531/packmate/service/optimization/HttpGzipProcessor.java index 85fd303..1ab260a 100644 --- a/src/main/java/ru/serega6531/packmate/service/optimization/HttpGzipProcessor.java +++ b/src/main/java/ru/serega6531/packmate/service/optimization/HttpGzipProcessor.java @@ -1,11 +1,11 @@ package ru.serega6531.packmate.service.optimization; -import lombok.AllArgsConstructor; +import com.google.common.primitives.Bytes; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.io.IOUtils; import org.apache.commons.lang3.ArrayUtils; import ru.serega6531.packmate.model.Packet; -import ru.serega6531.packmate.utils.Bytes; import ru.serega6531.packmate.utils.PacketUtils; import java.io.ByteArrayInputStream; @@ -17,13 +17,16 @@ import java.util.zip.GZIPInputStream; import java.util.zip.ZipException; @Slf4j -@AllArgsConstructor +@RequiredArgsConstructor public class HttpGzipProcessor { private static final byte[] GZIP_HEADER = {0x1f, (byte) 0x8b, 0x08}; private final List packets; + boolean gzipStarted = false; + private int position; + /** * Попытаться распаковать GZIP из исходящих http пакетов.
* GZIP поток начинается на найденном HTTP пакете с заголовком Content-Encoding: gzip @@ -32,19 +35,13 @@ public class HttpGzipProcessor { * при смене стороны передачи или при окончании всего стрима */ public void unpackGzip() { - boolean gzipStarted = false; int gzipStartPacket = 0; - int gzipEndPacket; - for (int i = 0; i < packets.size(); i++) { - Packet packet = packets.get(i); + for (position = 0; position < packets.size(); position++) { + Packet packet = packets.get(position); if (packet.isIncoming() && gzipStarted) { // поток gzip закончился - gzipEndPacket = i - 1; - if (extractGzip(gzipStartPacket, gzipEndPacket)) { - gzipStarted = false; - i = gzipStartPacket + 1; // продвигаем указатель на следующий после склеенного блок - } + extractGzip(gzipStartPacket, position - 1); } else if (!packet.isIncoming()) { String content = packet.getContentString(); @@ -52,11 +49,7 @@ public class HttpGzipProcessor { boolean http = content.startsWith("HTTP/"); if (http && gzipStarted) { // начался новый http пакет, заканчиваем старый gzip поток - gzipEndPacket = i - 1; - if (extractGzip(gzipStartPacket, gzipEndPacket)) { - gzipStarted = false; - i = gzipStartPacket + 1; // продвигаем указатель на следующий после склеенного блок - } + extractGzip(gzipStartPacket, position - 1); } if (contentPos != -1) { // начало body @@ -64,7 +57,7 @@ public class HttpGzipProcessor { boolean gziped = headers.contains("Content-Encoding: gzip\r\n"); if (gziped) { gzipStarted = true; - gzipStartPacket = i; + gzipStartPacket = position; } } } @@ -77,20 +70,18 @@ public class HttpGzipProcessor { /** * Попытаться распаковать кусок пакетов с gzip body и вставить результат на их место - * - * @return получилось ли распаковать */ - private boolean extractGzip(int gzipStartPacket, int gzipEndPacket) { + private void extractGzip(int gzipStartPacket, int gzipEndPacket) { List cut = packets.subList(gzipStartPacket, gzipEndPacket + 1); Packet decompressed = decompressGzipPackets(cut); if (decompressed != null) { packets.removeAll(cut); packets.add(gzipStartPacket, decompressed); - return true; - } - return false; + gzipStarted = false; + position = gzipStartPacket + 1; // продвигаем указатель на следующий после склеенного блок + } } private Packet decompressGzipPackets(List cut) { diff --git a/src/main/java/ru/serega6531/packmate/utils/Bytes.java b/src/main/java/ru/serega6531/packmate/utils/BytesUtils.java similarity index 82% rename from src/main/java/ru/serega6531/packmate/utils/Bytes.java rename to src/main/java/ru/serega6531/packmate/utils/BytesUtils.java index c3509c6..2d08bce 100644 --- a/src/main/java/ru/serega6531/packmate/utils/Bytes.java +++ b/src/main/java/ru/serega6531/packmate/utils/BytesUtils.java @@ -3,15 +3,7 @@ package ru.serega6531.packmate.utils; import lombok.experimental.UtilityClass; @UtilityClass -public class Bytes { - - /** - * @param array где ищем - * @param target что ищем - */ - public int indexOf(byte[] array, byte[] target) { - return indexOf(array, target, 0, array.length); - } +public class BytesUtils { /** * @param array где ищем