Рефакторинг

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

View File

@@ -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<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) {
processChunk(packets, start);

View File

@@ -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<Packet> packets;
boolean gzipStarted = false;
private int position;
/**
* Попытаться распаковать GZIP из исходящих http пакетов. <br>
* 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<Packet> 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<Packet> cut) {

View File

@@ -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 где ищем