diff --git a/build.gradle b/build.gradle
index a3312d73..eda7456e 100644
--- a/build.gradle
+++ b/build.gradle
@@ -4,7 +4,7 @@ import org.gradle.plugins.ide.eclipse.model.AccessRule
buildscript {
dependencies {
- classpath 'com.bmuschko:gradle-izpack-plugin:3.0'
+ classpath 'com.bmuschko:gradle-izpack-plugin:3.2'
}
}
@@ -14,9 +14,9 @@ plugins {
id 'eclipse'
id 'me.champeau.jmh' version '0.7.3'
id 'com.bmuschko.izpack' version '3.2'
- id 'com.github.jk1.dependency-license-report' version '2.5'
+ id 'com.github.jk1.dependency-license-report' version '3.0.1'
id "de.undercouch.download" version "5.6.0"
- id "com.diffplug.spotless" version "7.1.0"
+ id "com.diffplug.spotless" version "8.1.0"
}
repositories {
@@ -30,50 +30,52 @@ dependencies {
annotationProcessor 'org.projectlombok:lombok:1.18.42'
testCompileOnly 'org.projectlombok:lombok:1.18.42'
testAnnotationProcessor 'org.projectlombok:lombok:1.18.42'
+ compileOnly 'org.jspecify:jspecify:0.3.0'
+ testCompileOnly 'org.jspecify:jspecify:0.3.0'
- testImplementation 'org.junit.jupiter:junit-jupiter:6.0.0'
- testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
- testImplementation 'org.assertj:assertj-core:3.23.1'
- testImplementation 'org.mockito:mockito-core:4.7.0'
+ testImplementation 'org.junit.jupiter:junit-jupiter:6.1.0-M1'
+ testRuntimeOnly 'org.junit.platform:junit-platform-launcher:6.1.0-M1'
+ testImplementation 'org.assertj:assertj-core:4.0.0-M1'
+ testImplementation 'org.mockito:mockito-core:5.21.0'
testImplementation 'org.projectlombok:lombok:1.18.42'
- implementation 'com.google.guava:guava:24.1-jre'
- implementation 'commons-codec:commons-codec:1.6'
- implementation 'commons-io:commons-io:2.4'
- implementation 'org.apache.commons:commons-lang3:3.1'
- implementation 'org.apache.commons:commons-collections4:4.0'
- implementation 'org.xerial:sqlite-jdbc:3.7.2'
- implementation 'com.j256.ormlite:ormlite-core:4.48'
- implementation 'com.j256.ormlite:ormlite-jdbc:4.48'
- implementation 'com.google.protobuf:protobuf-java:4.31.1'
- implementation 'org.slf4j:slf4j-api:1.7.14'
- implementation 'org.slf4j:slf4j-log4j12:1.7.25'
- implementation 'com.googlecode.java-diff-utils:diffutils:1.2.1'
- implementation 'com.google.re2j:re2j:1.1'
- implementation 'com.github.mobius-software-ltd:mqtt-parser:parser-1.0.3'
- implementation 'net.arnx:jsonic:1.3.0'
- implementation 'org.json:json:20180813'
- implementation 'com.fasterxml.jackson.dataformat:jackson-dataformat-cbor:2.10.0'
- implementation 'com.fasterxml.jackson.core:jackson-databind:2.10.0'
- implementation 'org.msgpack:jackson-dataformat-msgpack:0.8.18'
- implementation 'org.bouncycastle:bcpkix-jdk15on:1.64'
- implementation 'commons-net:commons-net:3.6'
+ implementation 'com.google.guava:guava:33.5.0-jre'
+ implementation 'commons-codec:commons-codec:1.20.0'
+ implementation 'commons-io:commons-io:2.21.0'
+ implementation 'org.apache.commons:commons-lang3:3.20.0'
+ implementation 'org.apache.commons:commons-collections4:4.5.0'
+ implementation 'org.xerial:sqlite-jdbc:3.51.1.0'
+ implementation 'com.j256.ormlite:ormlite-core:6.1'
+ implementation 'com.j256.ormlite:ormlite-jdbc:6.1'
+ implementation 'com.google.protobuf:protobuf-java:4.33.2'
+ implementation 'org.slf4j:slf4j-api:2.1.0-alpha1'
+ implementation 'org.slf4j:slf4j-log4j12:2.1.0-alpha1'
+ implementation 'io.github.java-diff-utils:java-diff-utils:4.16'
+ implementation 'com.google.re2j:re2j:1.8'
+ implementation 'com.github.mobius-software-ltd:mqtt-parser:parser-1.0.6'
+ implementation 'net.arnx:jsonic:1.3.10'
+ implementation 'org.json:json:20250517'
+ implementation 'com.fasterxml.jackson.dataformat:jackson-dataformat-cbor:2.20.1'
+ implementation 'com.fasterxml.jackson.core:jackson-databind:2.20.1'
+ implementation 'org.msgpack:jackson-dataformat-msgpack:0.9.10'
+ implementation 'org.bouncycastle:bcpkix-jdk18on:1.83'
+ implementation 'commons-net:commons-net:3.12.0'
implementation 'org.nanohttpd:nanohttpd:2.3.1'
- implementation 'com.google.code.gson:gson:2.13.1'
- implementation 'org.apache.commons:commons-math3:3.0'
- implementation 'org.jfree:jfreechart:1.5.3'
- implementation 'org.ejml:ejml-all:0.41'
- implementation 'at.favre.lib:hkdf:1.1.0'
- implementation 'org.eclipse.jetty.http2:http2-hpack:11.0.11'
- implementation 'org.eclipse.jetty.http3:http3-qpack:11.0.11'
- implementation 'com.github.docker-java:docker-java:3.3.0'
- implementation 'com.github.docker-java:docker-java-transport-httpclient5:3.3.0'
+ implementation 'com.google.code.gson:gson:2.13.2'
+ implementation 'org.apache.commons:commons-math3:3.6.1'
+ implementation 'org.jfree:jfreechart:1.5.6'
+ implementation 'org.ejml:ejml-all:0.44.0'
+ implementation 'at.favre.lib:hkdf:2.0.0'
+ implementation 'org.eclipse.jetty.http2:http2-hpack:11.0.26'
+ implementation 'org.eclipse.jetty.http3:http3-qpack:11.0.26'
+ implementation 'com.github.docker-java:docker-java:3.7.0'
+ implementation 'com.github.docker-java:docker-java-transport-httpclient5:3.7.0'
implementation 'org.apache.commons:commons-compress:1.28.0'
- implementation 'com.github.luben:zstd-jni:1.5.6-3'
+ implementation 'com.github.luben:zstd-jni:1.5.7-6'
implementation 'org.brotli:dec:0.1.2'
implementation files('libs/agent15.jar')
- izpack 'org.codehaus.izpack:izpack-dist:5.1.3'
+ izpack 'org.codehaus.izpack:izpack-dist:5.2.4'
// load additional dena modules if it exists
['dena/', 'denaN/', 'denaL/'].each { def dir ->
diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar
index 1b33c55b..f8e1ee31 100644
Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
index 2e111328..23449a2b 100644
--- a/gradle/wrapper/gradle-wrapper.properties
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -1,6 +1,6 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-9.1.0-bin.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-9.2.1-bin.zip
networkTimeout=10000
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME
diff --git a/gradlew b/gradlew
index 23d15a93..adff685a 100755
--- a/gradlew
+++ b/gradlew
@@ -1,7 +1,7 @@
#!/bin/sh
#
-# Copyright © 2015-2021 the original authors.
+# Copyright © 2015 the original authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -114,7 +114,6 @@ case "$( uname )" in #(
NONSTOP* ) nonstop=true ;;
esac
-CLASSPATH="\\\"\\\""
# Determine the Java command to use to start the JVM.
@@ -172,7 +171,6 @@ fi
# For Cygwin or MSYS, switch paths to Windows format before running java
if "$cygwin" || "$msys" ; then
APP_HOME=$( cygpath --path --mixed "$APP_HOME" )
- CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" )
JAVACMD=$( cygpath --unix "$JAVACMD" )
@@ -212,7 +210,6 @@ DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
set -- \
"-Dorg.gradle.appname=$APP_BASE_NAME" \
- -classpath "$CLASSPATH" \
-jar "$APP_HOME/gradle/wrapper/gradle-wrapper.jar" \
"$@"
diff --git a/gradlew.bat b/gradlew.bat
index 5eed7ee8..e509b2dd 100644
--- a/gradlew.bat
+++ b/gradlew.bat
@@ -70,11 +70,10 @@ goto fail
:execute
@rem Setup the command line
-set CLASSPATH=
@rem Execute Gradle
-"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %*
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %*
:end
@rem End local scope for the variables with windows NT shell
diff --git a/src/main/java/core/packetproxy/ProxyFactory.java b/src/main/java/core/packetproxy/ProxyFactory.java
index b34a7f35..33cf32ba 100644
--- a/src/main/java/core/packetproxy/ProxyFactory.java
+++ b/src/main/java/core/packetproxy/ProxyFactory.java
@@ -67,7 +67,8 @@ public static Proxy create(ListenPort listen_info) throws Exception {
listen_socket.setReuseAddress(true);
proxy = new ProxyXmppSSLForward(listen_socket, listen_info);
- } else { /* FORWARDER */
+ } else {
+ /* FORWARDER */
ServerSocket listen_socket = new ServerSocket(listen_info.getPort());
listen_socket.setReuseAddress(true);
diff --git a/src/main/java/core/packetproxy/common/MessagePack.java b/src/main/java/core/packetproxy/common/MessagePack.java
index 9a3e8a4c..a1a163ec 100644
--- a/src/main/java/core/packetproxy/common/MessagePack.java
+++ b/src/main/java/core/packetproxy/common/MessagePack.java
@@ -37,7 +37,7 @@ public class MessagePack {
// 元々のMessagePackの型情報を保持する
public static class Key {
- public static enum Type {
+ public enum Type {
Integer, UnsignedInteger, Float, Boolean, RawString, RawBinary, Map, Array, Extension, Nil, None;
public static Type fromString(String str) {
diff --git a/src/main/java/core/packetproxy/common/Protobuf3.java b/src/main/java/core/packetproxy/common/Protobuf3.java
index 8d80d1b0..8b1da4f8 100644
--- a/src/main/java/core/packetproxy/common/Protobuf3.java
+++ b/src/main/java/core/packetproxy/common/Protobuf3.java
@@ -37,7 +37,7 @@ public class Protobuf3 {
public static class Key {
- public static enum Type {
+ public enum Type {
Variant, Bit64, LengthDelimited, StartGroup, EndGroup, Bit32, None, Reserved
}
diff --git a/src/main/java/core/packetproxy/http2/FrameManager.java b/src/main/java/core/packetproxy/http2/FrameManager.java
index e2f3acdb..373657ff 100644
--- a/src/main/java/core/packetproxy/http2/FrameManager.java
+++ b/src/main/java/core/packetproxy/http2/FrameManager.java
@@ -29,7 +29,7 @@
public class FrameManager {
- private HpackEncoder hpackEncoder = new HpackEncoder(4096, 65536);
+ private HpackEncoder hpackEncoder = new HpackEncoder();
private HpackDecoder hpackDecoder;
private List headersDataFrames = new LinkedList<>();
private List controlFrames = new LinkedList<>();
@@ -40,6 +40,8 @@ public class FrameManager {
public FrameManager() throws Exception {
flowControlManager = new FlowControlManager();
+ hpackEncoder.setMaxTableCapacity(65536);
+ hpackEncoder.setTableCapacity(4096);
}
public HpackDecoder getHpackDecoder() {
@@ -87,7 +89,9 @@ private void analyzeFrame(Frame frame) throws Exception {
int header_table_size = settingsFrame.get(SettingsFrameType.SETTINGS_HEADER_TABLE_SIZE);
int header_list_size = settingsFrame.get(SettingsFrameType.SETTINGS_MAX_HEADER_LIST_SIZE);
- hpackDecoder = new HpackDecoder(header_table_size, header_list_size);
+ hpackDecoder = new HpackDecoder(header_list_size, System::nanoTime);
+ hpackDecoder.setMaxTableCapacity(header_table_size);
+ hpackDecoder.setMaxHeaderListSize(header_list_size);
flag_receive_peer_settings = true;
if (flag_send_end_settings == false && flag_send_settings == true) {
diff --git a/src/main/java/core/packetproxy/http2/frames/SettingsFrame.java b/src/main/java/core/packetproxy/http2/frames/SettingsFrame.java
index 97f4432a..ae612c40 100644
--- a/src/main/java/core/packetproxy/http2/frames/SettingsFrame.java
+++ b/src/main/java/core/packetproxy/http2/frames/SettingsFrame.java
@@ -23,7 +23,7 @@ public class SettingsFrame extends Frame {
protected static Type TYPE = Type.SETTINGS;
- public static enum SettingsFrameType {
+ public enum SettingsFrameType {
RESERVED, SETTINGS_HEADER_TABLE_SIZE, SETTINGS_ENABLE_PUSH, SETTINGS_MAX_CONCURRENT_STREAMS, SETTINGS_INITIAL_WINDOW_SIZE, SETTINGS_MAX_FRAME_SIZE, SETTINGS_MAX_HEADER_LIST_SIZE,
};
diff --git a/src/main/java/core/packetproxy/http3/service/Http3HeaderDecoder.java b/src/main/java/core/packetproxy/http3/service/Http3HeaderDecoder.java
index 5519bef6..7576f742 100644
--- a/src/main/java/core/packetproxy/http3/service/Http3HeaderDecoder.java
+++ b/src/main/java/core/packetproxy/http3/service/Http3HeaderDecoder.java
@@ -36,7 +36,10 @@ public class Http3HeaderDecoder {
final QpackDecoder decoder;
public Http3HeaderDecoder() {
- this.decoder = new QpackDecoder(instructions -> instructions.forEach(i -> i.encode(this.lease)), 1024 * 1024);
+ this.decoder = new QpackDecoder(instructions -> instructions.forEach(i -> i.encode(this.lease)));
+ this.decoder.setMaxHeadersSize(1024 * 1024);
+ this.decoder.setMaxTableCapacity(1024 * 1024);
+ this.decoder.setBeginNanoTimeSupplier(System::nanoTime);
}
/** デコーダに命令を入力する Note: デコーダの内部状態が変化します */
@@ -55,7 +58,7 @@ public byte[] getInstructions() {
/** エンコードされたヘッダをデコードする Note: デコーダの内部状態が変化します */
public List decode(long streamId, byte[] headerEncoded) throws QpackException {
List metaDataList = new ArrayList<>();
- this.decoder.decode(streamId, ByteBuffer.wrap(headerEncoded), (sid, metadata) -> {
+ this.decoder.decode(streamId, ByteBuffer.wrap(headerEncoded), (sid, metadata, wasBlocked) -> {
metaDataList.add(metadata);
});
return metaDataList;
diff --git a/src/main/java/core/packetproxy/http3/service/Http3HeaderEncoder.java b/src/main/java/core/packetproxy/http3/service/Http3HeaderEncoder.java
index ae4a703e..00986a4b 100644
--- a/src/main/java/core/packetproxy/http3/service/Http3HeaderEncoder.java
+++ b/src/main/java/core/packetproxy/http3/service/Http3HeaderEncoder.java
@@ -34,8 +34,9 @@ public class Http3HeaderEncoder {
final QpackEncoder encoder;
public Http3HeaderEncoder(long capacity) {
- this.encoder = new QpackEncoder(instructions -> instructions.forEach(i -> i.encode(this.lease)), 1024 * 1024);
- this.encoder.setCapacity((int) capacity);
+ this.encoder = new QpackEncoder(instructions -> instructions.forEach(i -> i.encode(this.lease)));
+ this.encoder.setMaxTableCapacity((int) capacity);
+ this.encoder.setTableCapacity((int) capacity);
}
/** エンコーダに命令を入力する Note: エンコーダの内部状態が変化します */
diff --git a/src/main/java/core/packetproxy/model/Database.java b/src/main/java/core/packetproxy/model/Database.java
index d8d73988..d3507703 100644
--- a/src/main/java/core/packetproxy/model/Database.java
+++ b/src/main/java/core/packetproxy/model/Database.java
@@ -23,7 +23,8 @@
import com.j256.ormlite.dao.Dao;
import com.j256.ormlite.dao.DaoManager;
import com.j256.ormlite.jdbc.JdbcConnectionSource;
-import com.j256.ormlite.logger.LocalLog;
+import com.j256.ormlite.logger.Level;
+import com.j256.ormlite.logger.Logger;
import com.j256.ormlite.support.ConnectionSource;
import com.j256.ormlite.support.DatabaseConnection;
import com.j256.ormlite.table.TableUtils;
@@ -74,9 +75,9 @@ private void createDB() throws Exception {
}
}
- System.setProperty(LocalLog.LOCAL_LOG_LEVEL_PROPERTY, "error");
+ Logger.setGlobalLogLevel(Level.ERROR);
source = new JdbcConnectionSource(getDatabaseURL());
- DatabaseConnection conn = source.getReadWriteConnection();
+ DatabaseConnection conn = source.getReadWriteConnection(null);
conn.executeStatement("pragma auto_vacuum = full", DatabaseConnection.DEFAULT_RESULT_FLAGS);
}
@@ -121,7 +122,7 @@ public void dropPacketTableFaster() throws Exception {
Path src = Paths.get(instance.databasePath.getParent().toAbsolutePath().toString() + "/tmp.sqlite3");
Path dst = instance.databasePath.toAbsolutePath();
firePropertyChange(DatabaseMessage.DISCONNECT_NOW);
- DatabaseConnection conn = source.getReadWriteConnection();
+ DatabaseConnection conn = source.getReadWriteConnection(null);
conn.close();
Files.move(dst, src, StandardCopyOption.REPLACE_EXISTING);
@@ -175,7 +176,7 @@ private static void migrateTableWithoutHistory(Path srcDBPath, Path dstDBPath) {
try {
ConnectionSource source = new JdbcConnectionSource("jdbc:sqlite:" + srcDBPath);
- DatabaseConnection conn = source.getReadWriteConnection();
+ DatabaseConnection conn = source.getReadWriteConnection(null);
conn.executeStatement("attach database '" + dstDBPath.toAbsolutePath() + "' as 'dstDB'",
DatabaseConnection.DEFAULT_RESULT_FLAGS);
conn.executeStatement("attach database '" + srcDBPath.toAbsolutePath() + "' as 'srcDB'",
@@ -260,7 +261,7 @@ public void saveWithoutLog(String path) throws Exception {
Path dest = FileSystems.getDefault().getPath(path);
Files.copy(src, dest, StandardCopyOption.REPLACE_EXISTING);
JdbcConnectionSource new_db = new JdbcConnectionSource("jdbc:sqlite:" + dest);
- DatabaseConnection conn = new_db.getReadWriteConnection();
+ DatabaseConnection conn = new_db.getReadWriteConnection(null);
conn.executeStatement("delete from packets", DatabaseConnection.DEFAULT_RESULT_FLAGS);
conn.close();
new_db.close();
diff --git a/src/main/java/core/packetproxy/model/Diff.java b/src/main/java/core/packetproxy/model/Diff.java
index 8636cb9a..fa86d30a 100644
--- a/src/main/java/core/packetproxy/model/Diff.java
+++ b/src/main/java/core/packetproxy/model/Diff.java
@@ -17,10 +17,11 @@
import static packetproxy.util.Logging.errWithStackTrace;
-import difflib.Chunk;
-import difflib.Delta;
-import difflib.DiffUtils;
-import difflib.Patch;
+import com.github.difflib.DiffUtils;
+import com.github.difflib.patch.AbstractDelta;
+import com.github.difflib.patch.Chunk;
+import com.github.difflib.patch.DeltaType;
+import com.github.difflib.patch.Patch;
import java.util.Arrays;
import java.util.List;
@@ -70,24 +71,24 @@ public static void diffPerCharacter(DiffSet set, DiffEventListener original_even
List listOrig = Arrays.asList(new String(set.getOriginal()).split(""));
List listTarg = Arrays.asList(new String(set.getTarget()).split(""));
- Patch diff = DiffUtils.diff(listOrig, listTarg);
+ Patch diff = DiffUtils.diff(listOrig, listTarg);
- List deltas = diff.getDeltas();
- for (Delta delta : deltas) {
+ List> deltas = diff.getDeltas();
+ for (AbstractDelta delta : deltas) {
- Chunk chunkOrig = delta.getOriginal();
- Chunk chunkTarg = delta.getRevised();
- if (delta.getType() == Delta.TYPE.CHANGE) {
+ Chunk chunkOrig = delta.getSource();
+ Chunk chunkTarg = delta.getTarget();
+ if (delta.getType() == DeltaType.CHANGE) {
original_event.foundChgDelta(chunkPositionPerCharacter(listOrig, chunkOrig),
chunkLengthPerCharacter(chunkOrig));
target_event.foundChgDelta(chunkPositionPerCharacter(listTarg, chunkTarg),
chunkLengthPerCharacter(chunkTarg));
- } else if (delta.getType() == Delta.TYPE.INSERT) {
+ } else if (delta.getType() == DeltaType.INSERT) {
target_event.foundInsDelta(chunkPositionPerCharacter(listTarg, chunkTarg),
chunkLengthPerCharacter(chunkTarg));
- } else if (delta.getType() == Delta.TYPE.DELETE) {
+ } else if (delta.getType() == DeltaType.DELETE) {
original_event.foundDelDelta(chunkPositionPerCharacter(listOrig, chunkOrig),
chunkLengthPerCharacter(chunkOrig));
@@ -106,24 +107,24 @@ public static void diffPerLine(DiffSet set, DiffEventListener original_event, Di
List listOrig = Arrays.asList(new String(set.getOriginal()).split("\n"));
List listTarg = Arrays.asList(new String(set.getTarget()).split("\n"));
- Patch diff = DiffUtils.diff(listOrig, listTarg);
+ Patch diff = DiffUtils.diff(listOrig, listTarg);
- List deltas = diff.getDeltas();
- for (Delta delta : deltas) {
+ List> deltas = diff.getDeltas();
+ for (AbstractDelta delta : deltas) {
- Chunk chunkOrig = delta.getOriginal();
- Chunk chunkTarg = delta.getRevised();
- if (delta.getType() == Delta.TYPE.CHANGE) {
+ Chunk chunkOrig = delta.getSource();
+ Chunk chunkTarg = delta.getTarget();
+ if (delta.getType() == DeltaType.CHANGE) {
original_event.foundChgDelta(chunkPositionPerLine(listOrig, chunkOrig),
chunkLengthPerLine(chunkOrig));
target_event.foundChgDelta(chunkPositionPerLine(listTarg, chunkTarg),
chunkLengthPerLine(chunkTarg));
- } else if (delta.getType() == Delta.TYPE.INSERT) {
+ } else if (delta.getType() == DeltaType.INSERT) {
target_event.foundInsDelta(chunkPositionPerLine(listTarg, chunkTarg),
chunkLengthPerLine(chunkTarg));
- } else if (delta.getType() == Delta.TYPE.DELETE) {
+ } else if (delta.getType() == DeltaType.DELETE) {
original_event.foundDelDelta(chunkPositionPerLine(listOrig, chunkOrig),
chunkLengthPerLine(chunkOrig));
diff --git a/src/main/java/core/packetproxy/model/DiffBase.java b/src/main/java/core/packetproxy/model/DiffBase.java
index 19b60fb0..87a7c3e7 100644
--- a/src/main/java/core/packetproxy/model/DiffBase.java
+++ b/src/main/java/core/packetproxy/model/DiffBase.java
@@ -15,7 +15,7 @@
*/
package packetproxy.model;
-import difflib.Chunk;
+import com.github.difflib.patch.Chunk;
import java.util.List;
import javax.swing.event.EventListenerList;
diff --git a/src/main/java/core/packetproxy/model/DiffBinary.java b/src/main/java/core/packetproxy/model/DiffBinary.java
index 38e3c7ec..88fc836f 100644
--- a/src/main/java/core/packetproxy/model/DiffBinary.java
+++ b/src/main/java/core/packetproxy/model/DiffBinary.java
@@ -17,11 +17,12 @@
import static packetproxy.util.Logging.errWithStackTrace;
+import com.github.difflib.DiffUtils;
+import com.github.difflib.patch.AbstractDelta;
+import com.github.difflib.patch.Chunk;
+import com.github.difflib.patch.DeltaType;
+import com.github.difflib.patch.Patch;
import com.google.common.primitives.Bytes;
-import difflib.Chunk;
-import difflib.Delta;
-import difflib.DiffUtils;
-import difflib.Patch;
import java.util.List;
public class DiffBinary extends DiffBase {
@@ -70,24 +71,24 @@ public static void diffPerCharacter(DiffSet set, DiffEventListener original_even
List listOrig = Bytes.asList(set.getOriginal());
List listTarg = Bytes.asList(set.getTarget());
- Patch diff = DiffUtils.diff(listOrig, listTarg);
+ Patch diff = DiffUtils.diff(listOrig, listTarg);
- List deltas = diff.getDeltas();
- for (Delta delta : deltas) {
+ List> deltas = diff.getDeltas();
+ for (AbstractDelta delta : deltas) {
- Chunk chunkOrig = delta.getOriginal();
- Chunk chunkTarg = delta.getRevised();
- if (delta.getType() == Delta.TYPE.CHANGE) {
+ Chunk chunkOrig = delta.getSource();
+ Chunk chunkTarg = delta.getTarget();
+ if (delta.getType() == DeltaType.CHANGE) {
original_event.foundChgDelta(chunkPositionPerByte(listOrig, chunkOrig),
chunkLengthPerByte(chunkOrig));
target_event.foundChgDelta(chunkPositionPerByte(listTarg, chunkTarg),
chunkLengthPerByte(chunkTarg));
- } else if (delta.getType() == Delta.TYPE.INSERT) {
+ } else if (delta.getType() == DeltaType.INSERT) {
target_event.foundInsDelta(chunkPositionPerByte(listTarg, chunkTarg),
chunkLengthPerByte(chunkTarg));
- } else if (delta.getType() == Delta.TYPE.DELETE) {
+ } else if (delta.getType() == DeltaType.DELETE) {
original_event.foundDelDelta(chunkPositionPerByte(listOrig, chunkOrig),
chunkLengthPerByte(chunkOrig));
diff --git a/src/main/java/core/packetproxy/model/DiffJson.java b/src/main/java/core/packetproxy/model/DiffJson.java
index c091f191..023bfcfd 100644
--- a/src/main/java/core/packetproxy/model/DiffJson.java
+++ b/src/main/java/core/packetproxy/model/DiffJson.java
@@ -17,10 +17,11 @@
import static packetproxy.util.Logging.errWithStackTrace;
-import difflib.Chunk;
-import difflib.Delta;
-import difflib.DiffUtils;
-import difflib.Patch;
+import com.github.difflib.DiffUtils;
+import com.github.difflib.patch.AbstractDelta;
+import com.github.difflib.patch.Chunk;
+import com.github.difflib.patch.DeltaType;
+import com.github.difflib.patch.Patch;
import java.util.Arrays;
import java.util.List;
@@ -70,24 +71,24 @@ public static void diffPerCharacter(DiffSet set, DiffEventListener original_even
List listOrig = Arrays.asList(new String(set.getOriginal()).split(""));
List listTarg = Arrays.asList(new String(set.getTarget()).split(""));
- Patch diff = DiffUtils.diff(listOrig, listTarg);
+ Patch diff = DiffUtils.diff(listOrig, listTarg);
- List deltas = diff.getDeltas();
- for (Delta delta : deltas) {
+ List> deltas = diff.getDeltas();
+ for (AbstractDelta delta : deltas) {
- Chunk chunkOrig = delta.getOriginal();
- Chunk chunkTarg = delta.getRevised();
- if (delta.getType() == Delta.TYPE.CHANGE) {
+ Chunk chunkOrig = delta.getSource();
+ Chunk chunkTarg = delta.getTarget();
+ if (delta.getType() == DeltaType.CHANGE) {
original_event.foundChgDelta(chunkPositionPerCharacter(listOrig, chunkOrig),
chunkLengthPerCharacter(chunkOrig));
target_event.foundChgDelta(chunkPositionPerCharacter(listTarg, chunkTarg),
chunkLengthPerCharacter(chunkTarg));
- } else if (delta.getType() == Delta.TYPE.INSERT) {
+ } else if (delta.getType() == DeltaType.INSERT) {
target_event.foundInsDelta(chunkPositionPerCharacter(listTarg, chunkTarg),
chunkLengthPerCharacter(chunkTarg));
- } else if (delta.getType() == Delta.TYPE.DELETE) {
+ } else if (delta.getType() == DeltaType.DELETE) {
original_event.foundDelDelta(chunkPositionPerCharacter(listOrig, chunkOrig),
chunkLengthPerCharacter(chunkOrig));
@@ -106,24 +107,24 @@ public static void diffPerLine(DiffSet set, DiffEventListener original_event, Di
List listOrig = Arrays.asList(new String(set.getOriginal()).split("\n"));
List listTarg = Arrays.asList(new String(set.getTarget()).split("\n"));
- Patch diff = DiffUtils.diff(listOrig, listTarg);
+ Patch diff = DiffUtils.diff(listOrig, listTarg);
- List deltas = diff.getDeltas();
- for (Delta delta : deltas) {
+ List> deltas = diff.getDeltas();
+ for (AbstractDelta delta : deltas) {
- Chunk chunkOrig = delta.getOriginal();
- Chunk chunkTarg = delta.getRevised();
- if (delta.getType() == Delta.TYPE.CHANGE) {
+ Chunk chunkOrig = delta.getSource();
+ Chunk chunkTarg = delta.getTarget();
+ if (delta.getType() == DeltaType.CHANGE) {
original_event.foundChgDelta(chunkPositionPerLine(listOrig, chunkOrig),
chunkLengthPerLine(chunkOrig));
target_event.foundChgDelta(chunkPositionPerLine(listTarg, chunkTarg),
chunkLengthPerLine(chunkTarg));
- } else if (delta.getType() == Delta.TYPE.INSERT) {
+ } else if (delta.getType() == DeltaType.INSERT) {
target_event.foundInsDelta(chunkPositionPerLine(listTarg, chunkTarg),
chunkLengthPerLine(chunkTarg));
- } else if (delta.getType() == Delta.TYPE.DELETE) {
+ } else if (delta.getType() == DeltaType.DELETE) {
original_event.foundDelDelta(chunkPositionPerLine(listOrig, chunkOrig),
chunkLengthPerLine(chunkOrig));
diff --git a/src/main/java/core/packetproxy/model/InterceptOption.java b/src/main/java/core/packetproxy/model/InterceptOption.java
index 3a16ddcf..e636b4ab 100644
--- a/src/main/java/core/packetproxy/model/InterceptOption.java
+++ b/src/main/java/core/packetproxy/model/InterceptOption.java
@@ -28,19 +28,19 @@ public class InterceptOption {
public static final int ALL_SERVER = -1;
- public static enum Type {
+ public enum Type {
REQUEST,
/* TODO HOST, URL,*/ };
- public static enum Direction {
+ public enum Direction {
REQUEST, RESPONSE, ALL_THE_OTHER_REQUESTS, ALL_THE_OTHER_RESPONSES
}; // 両方同じルールで捕まえたい事はないのでALLは無し
- public static enum Relationship {
+ public enum Relationship {
IS_INTERCEPTED_IF_IT_MATCHES, IS_INTERCEPTED_IF_REQUEST_WAS_INTERCEPTED, IS_NOT_INTERCEPTED_IF_IT_MATCHES, ARE_INTERCEPTED, ARE_NOT_INTERCEPTED
};
- public static enum Method {
+ public enum Method {
SIMPLE, REGEX, BINARY, UNDEFINED
};
diff --git a/src/main/java/core/packetproxy/quic/value/key/Key.java b/src/main/java/core/packetproxy/quic/value/key/Key.java
index 2b2c42ff..33802288 100644
--- a/src/main/java/core/packetproxy/quic/value/key/Key.java
+++ b/src/main/java/core/packetproxy/quic/value/key/Key.java
@@ -16,7 +16,7 @@
package packetproxy.quic.value.key;
-import at.favre.lib.crypto.HKDF;
+import at.favre.lib.hkdf.HKDF;
import java.nio.ByteBuffer;
import javax.crypto.Cipher;
import javax.crypto.spec.GCMParameterSpec;
diff --git a/src/main/java/core/packetproxy/quic/value/key/level/InitialKey.java b/src/main/java/core/packetproxy/quic/value/key/level/InitialKey.java
index 0393bc64..01c19f57 100644
--- a/src/main/java/core/packetproxy/quic/value/key/level/InitialKey.java
+++ b/src/main/java/core/packetproxy/quic/value/key/level/InitialKey.java
@@ -16,7 +16,7 @@
package packetproxy.quic.value.key.level;
-import at.favre.lib.crypto.HKDF;
+import at.favre.lib.hkdf.HKDF;
import lombok.EqualsAndHashCode;
import lombok.Value;
import packetproxy.quic.utils.Constants;
diff --git a/src/main/java/core/packetproxy/util/Throwing.java b/src/main/java/core/packetproxy/util/Throwing.java
index b680f476..f38193ab 100644
--- a/src/main/java/core/packetproxy/util/Throwing.java
+++ b/src/main/java/core/packetproxy/util/Throwing.java
@@ -1,33 +1,37 @@
package packetproxy.util;
+import java.io.UncheckedIOException;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Predicate;
-import javax.annotation.Nonnull;
public class Throwing {
private Throwing() {
}
- @Nonnull
- public static Consumer rethrow(@Nonnull final ThrowingConsumer consumer) {
+ public static Consumer rethrow(final ThrowingConsumer consumer) {
return consumer;
}
- @Nonnull
- public static Predicate rethrowP(@Nonnull final ThrowingPredicate predicate) {
+ public static Predicate rethrowP(final ThrowingPredicate predicate) {
return predicate;
}
- @Nonnull
- public static Function rethrowF(@Nonnull final ThrowingFunction function) {
+ public static Function rethrowF(final ThrowingFunction function) {
return function;
}
- @SuppressWarnings("unchecked")
- @Nonnull
- public static void sneakyThrow(@Nonnull Throwable ex) throws E {
- throw (E) ex;
+ public static void sneakyThrow(Throwable ex) {
+ if (ex instanceof RuntimeException runtimeException) {
+ throw runtimeException;
+ }
+ if (ex instanceof Error error) {
+ throw error;
+ }
+ if (ex instanceof java.io.IOException ioException) {
+ throw new UncheckedIOException(ioException);
+ }
+ throw new RuntimeException(ex);
}
}
diff --git a/src/main/java/core/packetproxy/util/WithCounter.java b/src/main/java/core/packetproxy/util/WithCounter.java
index eb0801f1..2d14b594 100644
--- a/src/main/java/core/packetproxy/util/WithCounter.java
+++ b/src/main/java/core/packetproxy/util/WithCounter.java
@@ -2,15 +2,13 @@
import java.util.concurrent.atomic.AtomicInteger;
import java.util.function.Consumer;
-import javax.annotation.Nonnull;
public class WithCounter {
private WithCounter() {
}
- @Nonnull
- public static Consumer withCounter(@Nonnull final ThrowingBiConsumer consumer) {
+ public static Consumer withCounter(final ThrowingBiConsumer consumer) {
AtomicInteger counter = new AtomicInteger(0);
return (T item) -> {
consumer.accept(counter.getAndIncrement(), item);
diff --git a/src/main/java/core/packetproxy/util/package-info.java b/src/main/java/core/packetproxy/util/package-info.java
new file mode 100644
index 00000000..133544a5
--- /dev/null
+++ b/src/main/java/core/packetproxy/util/package-info.java
@@ -0,0 +1,2 @@
+@org.jspecify.annotations.NullMarked
+package packetproxy.util;
diff --git a/src/test/java/packetproxy/http2/frames/HeadersFrameTest.java b/src/test/java/packetproxy/http2/frames/HeadersFrameTest.java
index e63d22a4..12031a35 100644
--- a/src/test/java/packetproxy/http2/frames/HeadersFrameTest.java
+++ b/src/test/java/packetproxy/http2/frames/HeadersFrameTest.java
@@ -29,8 +29,12 @@ public class HeadersFrameTest {
private HpackDecoder decoder;
public HeadersFrameTest() throws Exception {
- decoder = new HpackDecoder(4096, 4096);
- encoder = new HpackEncoder(4096, 4096);
+ decoder = new HpackDecoder(4096, System::nanoTime);
+ decoder.setMaxTableCapacity(4096);
+ decoder.setMaxHeaderListSize(4096);
+ encoder = new HpackEncoder();
+ encoder.setMaxTableCapacity(4096);
+ encoder.setTableCapacity(4096);
}
@Test
@@ -82,7 +86,9 @@ public void bigData() throws Exception {
byte[] a = Hex.decodeHex(
"3fe15f0085b8848d36a38264026e959d29ad171863c78f0bcc73cd415721e963c1639ebf5885aec3771a4b5f92497ca589d34d1f6a1271d882a60e1bf0acf7788ca47e561cc58190b6cb80003f008390692f96df3dbf4a082a693f750400bea01cb8cb5704053168df76036777735c82109b408cf2b794216aec3a4a4498f57f0130408bf2b4b60e92ac7ad263d48f89dd0e8c1ab6e4c5934f00874152b10e7ea62fcb0eb8b2c3b601002fac10ac20ac073ed42f9acd615106e1a7e941056be522c2005f500e5c65ab820298b46ffb52b1a67818fb5243d2335502f31cf35055c87a7ed4dc3a4bb8c92c151ea2ff40851d09591dc9ff07ed698907f371a699fe7ed4a47009b7c40003ed4ef07f2d39f4d33fcfd4ecadb00d820fe6e34d33fcfda948e0136f880007d4ecadb00d3f07f371a699fe7ed4a47009b7c40003ea7656d8069e83f9b8d34cff3f6a523804dbe20001f53b2b6c034e41fcdc69a67f9fb5291c026df10000fa9d95b601a660fe6e34d33fcfda948e0136f880007f"
.toCharArray());
- HpackDecoder decoder = new HpackDecoder(65535, 65535);
+ HpackDecoder decoder = new HpackDecoder(65535, System::nanoTime);
+ decoder.setMaxTableCapacity(65535);
+ decoder.setMaxHeaderListSize(65535);
ByteBuffer bb = ByteBuffer.allocate(4096);
bb.put(a);
bb.flip();
@@ -95,7 +101,9 @@ public void extraDataTest() throws Exception {
byte[] frameData = Hex.decodeHex(
"0001370104000000010085b8848d36a38264016e919d29ad171863c78f0bcc73cd415721e9635f92497ca589d34d1f6a1271d882a60e1bf0acf7008390692f96df697e940bea693f750400bea01cb816ae084a62d1bf6496df3dbf4a05f52f948a08017d4039702d5c1094c5a37f5891aed8e8313e94a47e561cc5804dbe20001f76036777735c821081408cf2b794216aec3a4a4498f57f0130408bf2b4b60e92ac7ad263d48f89dd0e8c1ab6e4c5934f40851d09591dc9ff07ed698907f371a699fe7ed4a47009b7c40003ed4ef07f2d39f4d33fcfd4ecadb00d820fe6e34d33fcfda948e0136f880007d4ecadb00d3f07f371a699fe7ed4a47009b7c40003ea7656d8069e83f9b8d34cff3f6a523804dbe20001f53b2b6c034e41fcdc69a67f9fb5291c026df10000fa9d95b601a660fe6e34d33fcfda948e0136f880007f"
.toCharArray());
- HpackDecoder decoder = new HpackDecoder(65535, 65535);
+ HpackDecoder decoder = new HpackDecoder(65535, System::nanoTime);
+ decoder.setMaxTableCapacity(65535);
+ decoder.setMaxHeaderListSize(65535);
HeadersFrame headerFrame = new HeadersFrame(frameData, decoder);
System.out.println(new String(headerFrame.getExtra()));
}
@@ -105,7 +113,9 @@ public void initHttpTest() throws Exception {
byte[] frameData = Hex.decodeHex(
"0001370104000000010085b8848d36a38264016e919d29ad171863c78f0bcc73cd415721e9635f92497ca589d34d1f6a1271d882a60e1bf0acf7008390692f96df697e940bea693f750400bea01cb816ae084a62d1bf6496df3dbf4a05f52f948a08017d4039702d5c1094c5a37f5891aed8e8313e94a47e561cc5804dbe20001f76036777735c821081408cf2b794216aec3a4a4498f57f0130408bf2b4b60e92ac7ad263d48f89dd0e8c1ab6e4c5934f40851d09591dc9ff07ed698907f371a699fe7ed4a47009b7c40003ed4ef07f2d39f4d33fcfd4ecadb00d820fe6e34d33fcfda948e0136f880007d4ecadb00d3f07f371a699fe7ed4a47009b7c40003ea7656d8069e83f9b8d34cff3f6a523804dbe20001f53b2b6c034e41fcdc69a67f9fb5291c026df10000fa9d95b601a660fe6e34d33fcfda948e0136f880007f"
.toCharArray());
- HpackDecoder decoder = new HpackDecoder(65535, 65535);
+ HpackDecoder decoder = new HpackDecoder(65535, System::nanoTime);
+ decoder.setMaxTableCapacity(65535);
+ decoder.setMaxHeaderListSize(65535);
HeadersFrame headerFrame = new HeadersFrame(frameData, decoder);
System.out.println(new String(headerFrame.getExtra()));
}
diff --git a/src/test/java/packetproxy/http3/QpackTest.java b/src/test/java/packetproxy/http3/QpackTest.java
index a38e9d28..5300f8d6 100644
--- a/src/test/java/packetproxy/http3/QpackTest.java
+++ b/src/test/java/packetproxy/http3/QpackTest.java
@@ -29,12 +29,9 @@ public void smoke() throws Exception {
ByteBufferPool bufferPool = new MappedByteBufferPool();
ByteBufferPool.Lease lease = new ByteBufferPool.Lease(bufferPool);
- QpackEncoder encoder = new QpackEncoder(instructions -> {
- instructions.forEach(i -> {
- i.encode(lease);
- });
- }, 100);
- encoder.setCapacity(100);
+ QpackEncoder encoder = new QpackEncoder(instructions -> instructions.forEach(i -> i.encode(lease)));
+ encoder.setMaxTableCapacity(100);
+ encoder.setTableCapacity(100);
HttpFields httpFields = HttpFields.build().add("hoge", "fuga");
@@ -64,14 +61,14 @@ public void smoke() throws Exception {
ByteBufferPool bufferPool2 = new MappedByteBufferPool();
ByteBufferPool.Lease lease2 = new ByteBufferPool.Lease(bufferPool2);
- QpackEncoder encoder = new QpackEncoder(instructions -> {
- instructions.forEach(i -> i.encode(lease));
- }, 100);
+ QpackEncoder encoder = new QpackEncoder(instructions -> instructions.forEach(i -> i.encode(lease)));
+ encoder.setMaxTableCapacity(100);
+ encoder.setTableCapacity(100);
- QpackDecoder decoder = new QpackDecoder(instructions -> {
- instructions.forEach(i -> i.encode(lease2));
- }, 100);
- encoder.setCapacity(100);
+ QpackDecoder decoder = new QpackDecoder(instructions -> instructions.forEach(i -> i.encode(lease2)));
+ decoder.setMaxHeadersSize(1024 * 1024);
+ decoder.setMaxTableCapacity(100);
+ decoder.setBeginNanoTimeSupplier(System::nanoTime);
/* input data */
HttpFields httpFields = HttpFields.build().add("hoge", "fuga");
@@ -91,7 +88,7 @@ public void smoke() throws Exception {
/* processing by Decoder */
decoder.parseInstructions(ByteBuffer.wrap(encoderInsts.toByteArray()));
- decoder.decode(0, ByteBuffer.wrap(HeadersBytes), (streamId, metadata) -> {
+ decoder.decode(0, ByteBuffer.wrap(HeadersBytes), (streamId, metadata, wasBlocked) -> {
System.out.println("streamId: " + streamId + ", meta: " + metadata);
assertThat(httpFields.asImmutable()).isEqualTo(metadata.getFields());
});