Files
0xb00b5-packmate/src/main/java/ru/serega6531/packmate/service/optimization/StreamOptimizer.java

98 lines
2.7 KiB
Java

package ru.serega6531.packmate.service.optimization;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import ru.serega6531.packmate.model.CtfService;
import ru.serega6531.packmate.model.Packet;
import java.util.List;
@AllArgsConstructor
@Slf4j
public class StreamOptimizer {
private final RsaKeysHolder keysHolder;
private final CtfService service;
private List<Packet> packets;
private final PacketsMerger merger = new PacketsMerger();
private final HttpUrldecodeProcessor urldecodeProcessor = new HttpUrldecodeProcessor();
private final HttpProcessor httpProcessor = new HttpProcessor();
/**
* Вызвать для выполнения оптимизаций на переданном списке пакетов.
*/
public List<Packet> optimizeStream() {
if (service.isDecryptTls()) {
try {
decryptTls();
} catch (Exception e) {
log.warn("Error optimizing stream (tls)", e);
return packets;
}
}
if (service.isParseWebSockets()) {
try {
parseWebSockets();
} catch (Exception e) {
log.warn("Error optimizing stream (websockets)", e);
return packets;
}
}
if (service.isUrldecodeHttpRequests()) {
try {
urldecodeProcessor.urldecodeRequests(packets);
} catch (Exception e) {
log.warn("Error optimizing stream (urldecode)", e);
return packets;
}
}
if (service.isMergeAdjacentPackets() || service.isHttp()) {
try {
merger.mergeAdjacentPackets(packets);
} catch (Exception e) {
log.warn("Error optimizing stream (adjacent)", e);
return packets;
}
}
if (service.isHttp()) {
try {
httpProcessor.process(packets);
} catch (Exception e) {
log.warn("Error optimizing stream (http)", e);
return packets;
}
}
return packets;
}
private void decryptTls() {
final TlsDecryptor tlsDecryptor = new TlsDecryptor(packets, keysHolder);
tlsDecryptor.decryptTls();
if (tlsDecryptor.isParsed()) {
packets = tlsDecryptor.getParsedPackets();
}
}
private void parseWebSockets() {
if (!packets.get(0).getContentString().contains("HTTP/")) {
return;
}
final WebSocketsParser parser = new WebSocketsParser(packets);
if (!parser.isParsed()) {
return;
}
packets = parser.getParsedPackets();
}
}