From ad411c477fab6c903e89ce759b22611ce3a11d2b Mon Sep 17 00:00:00 2001 From: serega6531 Date: Mon, 23 Sep 2019 20:58:28 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=BE=20=D1=81=D0=BE=D1=85=D1=80=D0=B0=D0=BD=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D0=B5=20user=20agent?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ru/serega6531/packmate/model/Stream.java | 2 ++ .../packmate/service/StreamService.java | 25 ++++++++++++++++++- 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/src/main/java/ru/serega6531/packmate/model/Stream.java b/src/main/java/ru/serega6531/packmate/model/Stream.java index fcce62f..6ec9842 100644 --- a/src/main/java/ru/serega6531/packmate/model/Stream.java +++ b/src/main/java/ru/serega6531/packmate/model/Stream.java @@ -47,4 +47,6 @@ public class Stream { private byte ttl; + private String userAgentHash; + } diff --git a/src/main/java/ru/serega6531/packmate/service/StreamService.java b/src/main/java/ru/serega6531/packmate/service/StreamService.java index eae6f14..69c7b35 100644 --- a/src/main/java/ru/serega6531/packmate/service/StreamService.java +++ b/src/main/java/ru/serega6531/packmate/service/StreamService.java @@ -17,6 +17,7 @@ import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.util.*; +import java.util.regex.Matcher; import java.util.zip.GZIPInputStream; import java.util.zip.ZipException; @@ -35,6 +36,7 @@ public class StreamService { private final boolean ignoreEmptyPackets; private final byte[] GZIP_HEADER = {0x1f, (byte) 0x8b, 0x08}; + private final java.util.regex.Pattern userAgentPattern = java.util.regex.Pattern.compile("User-Agent: (.+)\\n"); @Autowired public StreamService(StreamRepository repository, @@ -96,7 +98,6 @@ public class StreamService { if(unpackGzippedHttp) { boolean gzipStarted = false; - //byte[] gzipContent = null; int gzipStartPacket = 0; int gzipEndPacket; @@ -157,6 +158,20 @@ public class StreamService { } } + String ua = null; + for (Packet packet : packets) { + String content = new String(packet.getContent()); + final Matcher matcher = userAgentPattern.matcher(content); + if(matcher.find()) { + ua = matcher.group(1); + break; + } + } + + if(ua != null) { + stream.setUserAgentHash(calculateUserAgentHash(ua)); + } + Stream savedStream = save(stream); List savedPackets = new ArrayList<>(); @@ -177,6 +192,7 @@ public class StreamService { } private Packet decompressGzipPackets(List packets) { + //noinspection OptionalGetWithoutIsPresent final byte[] content = packets.stream() .map(Packet::getContent) .reduce(ArrayUtils::addAll) @@ -225,6 +241,13 @@ public class StreamService { return repository.findById(id); } + private String calculateUserAgentHash(String ua) { + char[] alphabet = "abcdefghijklmnopqrstuvwxyz0123456789".toCharArray(); + int l = alphabet.length; + final int hash = Math.abs(ua.hashCode()) % (l * l * l); + return "" + alphabet[hash % l] + alphabet[(hash / l) % l] + alphabet[(hash / (l * l)) % l]; + } + @Transactional public void setFavorite(long id, boolean favorite) { final Optional streamOptional = repository.findById(id);