Рефакторинг

This commit is contained in:
serega6531
2020-04-16 00:48:39 +03:00
parent 85681947cd
commit 07affe3812
4 changed files with 21 additions and 37 deletions

View File

@@ -4,7 +4,7 @@ import org.apache.commons.lang3.StringUtils;
import org.springframework.security.crypto.codec.Hex; import org.springframework.security.crypto.codec.Hex;
import ru.serega6531.packmate.model.FoundPattern; import ru.serega6531.packmate.model.FoundPattern;
import ru.serega6531.packmate.model.Pattern; import ru.serega6531.packmate.model.Pattern;
import ru.serega6531.packmate.utils.Bytes; import ru.serega6531.packmate.utils.BytesUtils;
import java.util.*; import java.util.*;
import java.util.regex.Matcher; import java.util.regex.Matcher;
@@ -80,7 +80,7 @@ class PatternMatcher {
final byte[] value = Hex.decode(pattern.getValue()); final byte[] value = Hex.decode(pattern.getValue());
while (true) { while (true) {
int start = Bytes.indexOf(contentBytes, value, startSearch, contentBytes.length); int start = BytesUtils.indexOf(contentBytes, value, startSearch, contentBytes.length);
if (start == -1) { if (start == -1) {
return; return;

View File

@@ -1,10 +1,11 @@
package ru.serega6531.packmate.service.optimization; package ru.serega6531.packmate.service.optimization;
import com.google.common.primitives.Bytes;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.SneakyThrows; import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import ru.serega6531.packmate.model.Packet; 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 ru.serega6531.packmate.utils.PacketUtils;
import java.io.ByteArrayOutputStream; import java.io.ByteArrayOutputStream;
@@ -57,7 +58,7 @@ public class HttpChunksProcessor {
} }
private void checkCompleteChunk(List<Packet> packets, int start) { private void checkCompleteChunk(List<Packet> 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) { if (end) {
processChunk(packets, start); processChunk(packets, start);

View File

@@ -1,11 +1,11 @@
package ru.serega6531.packmate.service.optimization; package ru.serega6531.packmate.service.optimization;
import lombok.AllArgsConstructor; import com.google.common.primitives.Bytes;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.IOUtils; import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.lang3.ArrayUtils;
import ru.serega6531.packmate.model.Packet; import ru.serega6531.packmate.model.Packet;
import ru.serega6531.packmate.utils.Bytes;
import ru.serega6531.packmate.utils.PacketUtils; import ru.serega6531.packmate.utils.PacketUtils;
import java.io.ByteArrayInputStream; import java.io.ByteArrayInputStream;
@@ -17,13 +17,16 @@ import java.util.zip.GZIPInputStream;
import java.util.zip.ZipException; import java.util.zip.ZipException;
@Slf4j @Slf4j
@AllArgsConstructor @RequiredArgsConstructor
public class HttpGzipProcessor { public class HttpGzipProcessor {
private static final byte[] GZIP_HEADER = {0x1f, (byte) 0x8b, 0x08}; private static final byte[] GZIP_HEADER = {0x1f, (byte) 0x8b, 0x08};
private final List<Packet> packets; private final List<Packet> packets;
boolean gzipStarted = false;
private int position;
/** /**
* Попытаться распаковать GZIP из исходящих http пакетов. <br> * Попытаться распаковать GZIP из исходящих http пакетов. <br>
* GZIP поток начинается на найденном HTTP пакете с заголовком Content-Encoding: gzip * GZIP поток начинается на найденном HTTP пакете с заголовком Content-Encoding: gzip
@@ -32,19 +35,13 @@ public class HttpGzipProcessor {
* при смене стороны передачи или при окончании всего стрима * при смене стороны передачи или при окончании всего стрима
*/ */
public void unpackGzip() { public void unpackGzip() {
boolean gzipStarted = false;
int gzipStartPacket = 0; int gzipStartPacket = 0;
int gzipEndPacket;
for (int i = 0; i < packets.size(); i++) { for (position = 0; position < packets.size(); position++) {
Packet packet = packets.get(i); Packet packet = packets.get(position);
if (packet.isIncoming() && gzipStarted) { // поток gzip закончился if (packet.isIncoming() && gzipStarted) { // поток gzip закончился
gzipEndPacket = i - 1; extractGzip(gzipStartPacket, position - 1);
if (extractGzip(gzipStartPacket, gzipEndPacket)) {
gzipStarted = false;
i = gzipStartPacket + 1; // продвигаем указатель на следующий после склеенного блок
}
} else if (!packet.isIncoming()) { } else if (!packet.isIncoming()) {
String content = packet.getContentString(); String content = packet.getContentString();
@@ -52,11 +49,7 @@ public class HttpGzipProcessor {
boolean http = content.startsWith("HTTP/"); boolean http = content.startsWith("HTTP/");
if (http && gzipStarted) { // начался новый http пакет, заканчиваем старый gzip поток if (http && gzipStarted) { // начался новый http пакет, заканчиваем старый gzip поток
gzipEndPacket = i - 1; extractGzip(gzipStartPacket, position - 1);
if (extractGzip(gzipStartPacket, gzipEndPacket)) {
gzipStarted = false;
i = gzipStartPacket + 1; // продвигаем указатель на следующий после склеенного блок
}
} }
if (contentPos != -1) { // начало body if (contentPos != -1) { // начало body
@@ -64,7 +57,7 @@ public class HttpGzipProcessor {
boolean gziped = headers.contains("Content-Encoding: gzip\r\n"); boolean gziped = headers.contains("Content-Encoding: gzip\r\n");
if (gziped) { if (gziped) {
gzipStarted = true; gzipStarted = true;
gzipStartPacket = i; gzipStartPacket = position;
} }
} }
} }
@@ -77,20 +70,18 @@ public class HttpGzipProcessor {
/** /**
* Попытаться распаковать кусок пакетов с gzip body и вставить результат на их место * Попытаться распаковать кусок пакетов с gzip body и вставить результат на их место
*
* @return получилось ли распаковать
*/ */
private boolean extractGzip(int gzipStartPacket, int gzipEndPacket) { private void extractGzip(int gzipStartPacket, int gzipEndPacket) {
List<Packet> cut = packets.subList(gzipStartPacket, gzipEndPacket + 1); List<Packet> cut = packets.subList(gzipStartPacket, gzipEndPacket + 1);
Packet decompressed = decompressGzipPackets(cut); Packet decompressed = decompressGzipPackets(cut);
if (decompressed != null) { if (decompressed != null) {
packets.removeAll(cut); packets.removeAll(cut);
packets.add(gzipStartPacket, decompressed); packets.add(gzipStartPacket, decompressed);
return true;
}
return false; gzipStarted = false;
position = gzipStartPacket + 1; // продвигаем указатель на следующий после склеенного блок
}
} }
private Packet decompressGzipPackets(List<Packet> cut) { private Packet decompressGzipPackets(List<Packet> cut) {

View File

@@ -3,15 +3,7 @@ package ru.serega6531.packmate.utils;
import lombok.experimental.UtilityClass; import lombok.experimental.UtilityClass;
@UtilityClass @UtilityClass
public class Bytes { public class BytesUtils {
/**
* @param array где ищем
* @param target что ищем
*/
public int indexOf(byte[] array, byte[] target) {
return indexOf(array, target, 0, array.length);
}
/** /**
* @param array где ищем * @param array где ищем