Рефакторинг
This commit is contained in:
@@ -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;
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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 где ищем
|
||||||
Reference in New Issue
Block a user