diff --git a/jetty-core/jetty-http3/jetty-http3-qpack/src/main/java/org/eclipse/jetty/http3/qpack/QpackEncoder.java b/jetty-core/jetty-http3/jetty-http3-qpack/src/main/java/org/eclipse/jetty/http3/qpack/QpackEncoder.java index 98be0df83adb..66a8be1c46fb 100644 --- a/jetty-core/jetty-http3/jetty-http3-qpack/src/main/java/org/eclipse/jetty/http3/qpack/QpackEncoder.java +++ b/jetty-core/jetty-http3/jetty-http3-qpack/src/main/java/org/eclipse/jetty/http3/qpack/QpackEncoder.java @@ -156,7 +156,7 @@ public int getTableCapacity() } /** - * Set the capacity of the DynamicTable and send a instruction to set the capacity on the remote Decoder. + * Set the capacity of the DynamicTable and send an instruction to set the capacity on the remote Decoder. * * @param capacity the new capacity. */ @@ -166,9 +166,15 @@ public void setTableCapacity(int capacity) { if (capacity > getMaxTableCapacity()) throw new IllegalArgumentException("DynamicTable capacity exceeds max capacity"); - _context.getDynamicTable().setCapacity(capacity); - _handler.onInstructions(List.of(new SetCapacityInstruction(capacity))); - notifyInstructionHandler(); + int oldCapacity = _context.getDynamicTable().getCapacity(); + + // Only send the instruction if there was a change to the table capacity. + if (oldCapacity != capacity) + { + _context.getDynamicTable().setCapacity(capacity); + _handler.onInstructions(List.of(new SetCapacityInstruction(capacity))); + notifyInstructionHandler(); + } } } diff --git a/jetty-core/jetty-http3/jetty-http3-qpack/src/test/java/org/eclipse/jetty/http3/qpack/BlockedStreamsTest.java b/jetty-core/jetty-http3/jetty-http3-qpack/src/test/java/org/eclipse/jetty/http3/qpack/BlockedStreamsTest.java index c688faf85151..7708f8af2bf6 100644 --- a/jetty-core/jetty-http3/jetty-http3-qpack/src/test/java/org/eclipse/jetty/http3/qpack/BlockedStreamsTest.java +++ b/jetty-core/jetty-http3/jetty-http3-qpack/src/test/java/org/eclipse/jetty/http3/qpack/BlockedStreamsTest.java @@ -23,14 +23,17 @@ import org.eclipse.jetty.http3.qpack.internal.instruction.LiteralNameEntryInstruction; import org.eclipse.jetty.http3.qpack.internal.instruction.SectionAcknowledgmentInstruction; import org.eclipse.jetty.http3.qpack.internal.instruction.SetCapacityInstruction; +import org.eclipse.jetty.http3.qpack.util.QpackTestUtil; +import org.eclipse.jetty.http3.qpack.util.TestDecoderHandler; +import org.eclipse.jetty.http3.qpack.util.TestEncoderHandler; import org.eclipse.jetty.util.BufferUtil; import org.eclipse.jetty.util.NanoTime; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import static org.eclipse.jetty.http3.qpack.QpackTestUtil.encode; -import static org.eclipse.jetty.http3.qpack.QpackTestUtil.toBuffer; -import static org.eclipse.jetty.http3.qpack.QpackTestUtil.toMetaData; +import static org.eclipse.jetty.http3.qpack.util.QpackTestUtil.encode; +import static org.eclipse.jetty.http3.qpack.util.QpackTestUtil.toBuffer; +import static org.eclipse.jetty.http3.qpack.util.QpackTestUtil.toMetaData; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.greaterThan; diff --git a/jetty-core/jetty-http3/jetty-http3-qpack/src/test/java/org/eclipse/jetty/http3/qpack/DecoderInstructionParserTest.java b/jetty-core/jetty-http3/jetty-http3-qpack/src/test/java/org/eclipse/jetty/http3/qpack/DecoderInstructionParserTest.java index 3216ad7162c3..922c2f1f3b2d 100644 --- a/jetty-core/jetty-http3/jetty-http3-qpack/src/test/java/org/eclipse/jetty/http3/qpack/DecoderInstructionParserTest.java +++ b/jetty-core/jetty-http3/jetty-http3-qpack/src/test/java/org/eclipse/jetty/http3/qpack/DecoderInstructionParserTest.java @@ -20,6 +20,7 @@ import org.eclipse.jetty.http3.qpack.internal.instruction.IndexedNameEntryInstruction; import org.eclipse.jetty.http3.qpack.internal.instruction.SetCapacityInstruction; import org.eclipse.jetty.http3.qpack.internal.parser.DecoderInstructionParser; +import org.eclipse.jetty.http3.qpack.util.QpackTestUtil; import org.eclipse.jetty.io.ByteBufferPool; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; diff --git a/jetty-core/jetty-http3/jetty-http3-qpack/src/test/java/org/eclipse/jetty/http3/qpack/EncodeDecodeTest.java b/jetty-core/jetty-http3/jetty-http3-qpack/src/test/java/org/eclipse/jetty/http3/qpack/EncodeDecodeTest.java index 5610f077d95e..ad9c8ae22b0f 100644 --- a/jetty-core/jetty-http3/jetty-http3-qpack/src/test/java/org/eclipse/jetty/http3/qpack/EncodeDecodeTest.java +++ b/jetty-core/jetty-http3/jetty-http3-qpack/src/test/java/org/eclipse/jetty/http3/qpack/EncodeDecodeTest.java @@ -27,6 +27,9 @@ import org.eclipse.jetty.http3.qpack.internal.instruction.SetCapacityInstruction; import org.eclipse.jetty.http3.qpack.internal.parser.DecoderInstructionParser; import org.eclipse.jetty.http3.qpack.internal.parser.EncoderInstructionParser; +import org.eclipse.jetty.http3.qpack.util.QpackTestUtil; +import org.eclipse.jetty.http3.qpack.util.TestDecoderHandler; +import org.eclipse.jetty.http3.qpack.util.TestEncoderHandler; import org.eclipse.jetty.util.BufferUtil; import org.eclipse.jetty.util.NanoTime; import org.junit.jupiter.api.BeforeEach; @@ -155,4 +158,32 @@ public void test() throws Exception assertThat(QpackTestUtil.toHexString(instruction), QpackTestUtil.equalsHex("4a63 7573 746f 6d2d 6b65 790c 6375 7374 6f6d 2d76 616c 7565")); _encoder.getInstructionHandler().onInsertCountIncrement(1); } + + @Test + public void testEncoderSetCapacity() + { + _encoder.setMaxTableCapacity(1024 * 1024); + + // Since capacity is already 0, this should not produce an instruction. + _encoder.setTableCapacity(0); + Instruction instruction = _encoderHandler.getInstruction(); + assertNull(instruction); + + // If we change the value of the table an instruction will be produced. + _encoder.setTableCapacity(1024); + instruction = _encoderHandler.getInstruction(); + assertThat(instruction, instanceOf(SetCapacityInstruction.class)); + assertThat(((SetCapacityInstruction)instruction).getCapacity(), is(1024)); + + // No instruction since size was already 1024. + _encoder.setTableCapacity(1024); + instruction = _encoderHandler.getInstruction(); + assertNull(instruction); + + // We can return the size back to 0 and an instruction is sent. + _encoder.setTableCapacity(0); + instruction = _encoderHandler.getInstruction(); + assertThat(instruction, instanceOf(SetCapacityInstruction.class)); + assertThat(((SetCapacityInstruction)instruction).getCapacity(), is(0)); + } } diff --git a/jetty-core/jetty-http3/jetty-http3-qpack/src/test/java/org/eclipse/jetty/http3/qpack/EncoderInstructionParserTest.java b/jetty-core/jetty-http3/jetty-http3-qpack/src/test/java/org/eclipse/jetty/http3/qpack/EncoderInstructionParserTest.java index 573fe33130dc..91673c5ec5ab 100644 --- a/jetty-core/jetty-http3/jetty-http3-qpack/src/test/java/org/eclipse/jetty/http3/qpack/EncoderInstructionParserTest.java +++ b/jetty-core/jetty-http3/jetty-http3-qpack/src/test/java/org/eclipse/jetty/http3/qpack/EncoderInstructionParserTest.java @@ -16,6 +16,7 @@ import java.nio.ByteBuffer; import org.eclipse.jetty.http3.qpack.internal.parser.EncoderInstructionParser; +import org.eclipse.jetty.http3.qpack.util.QpackTestUtil; import org.eclipse.jetty.util.BufferUtil; import org.eclipse.jetty.util.StringUtil; import org.junit.jupiter.api.BeforeEach; diff --git a/jetty-core/jetty-http3/jetty-http3-qpack/src/test/java/org/eclipse/jetty/http3/qpack/EvictionTest.java b/jetty-core/jetty-http3/jetty-http3-qpack/src/test/java/org/eclipse/jetty/http3/qpack/EvictionTest.java index b000d1e0633e..174c05c387da 100644 --- a/jetty-core/jetty-http3/jetty-http3-qpack/src/test/java/org/eclipse/jetty/http3/qpack/EvictionTest.java +++ b/jetty-core/jetty-http3/jetty-http3-qpack/src/test/java/org/eclipse/jetty/http3/qpack/EvictionTest.java @@ -20,6 +20,8 @@ import org.eclipse.jetty.http.HttpFields; import org.eclipse.jetty.http.HttpVersion; import org.eclipse.jetty.http.MetaData; +import org.eclipse.jetty.http3.qpack.util.TestDecoderHandler; +import org.eclipse.jetty.http3.qpack.util.TestEncoderHandler; import org.eclipse.jetty.util.NanoTime; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; diff --git a/jetty-core/jetty-http3/jetty-http3-qpack/src/test/java/org/eclipse/jetty/http3/qpack/QpackDecoderTest.java b/jetty-core/jetty-http3/jetty-http3-qpack/src/test/java/org/eclipse/jetty/http3/qpack/QpackDecoderTest.java index a6b2c42348fc..7d096467d627 100644 --- a/jetty-core/jetty-http3/jetty-http3-qpack/src/test/java/org/eclipse/jetty/http3/qpack/QpackDecoderTest.java +++ b/jetty-core/jetty-http3/jetty-http3-qpack/src/test/java/org/eclipse/jetty/http3/qpack/QpackDecoderTest.java @@ -17,6 +17,7 @@ import org.eclipse.jetty.http.MetaData; import org.eclipse.jetty.http3.qpack.internal.table.Entry; +import org.eclipse.jetty.http3.qpack.util.TestDecoderHandler; import org.eclipse.jetty.util.BufferUtil; import org.eclipse.jetty.util.NanoTime; import org.eclipse.jetty.util.StringUtil; diff --git a/jetty-core/jetty-http3/jetty-http3-qpack/src/test/java/org/eclipse/jetty/http3/qpack/SectionAcknowledgmentTest.java b/jetty-core/jetty-http3/jetty-http3-qpack/src/test/java/org/eclipse/jetty/http3/qpack/SectionAcknowledgmentTest.java index 64a12489bb7a..4a7a3ae0d3a8 100644 --- a/jetty-core/jetty-http3/jetty-http3-qpack/src/test/java/org/eclipse/jetty/http3/qpack/SectionAcknowledgmentTest.java +++ b/jetty-core/jetty-http3/jetty-http3-qpack/src/test/java/org/eclipse/jetty/http3/qpack/SectionAcknowledgmentTest.java @@ -17,14 +17,16 @@ import org.eclipse.jetty.http3.qpack.QpackException.SessionException; import org.eclipse.jetty.http3.qpack.internal.instruction.SectionAcknowledgmentInstruction; +import org.eclipse.jetty.http3.qpack.util.TestDecoderHandler; +import org.eclipse.jetty.http3.qpack.util.TestEncoderHandler; import org.eclipse.jetty.util.BufferUtil; import org.eclipse.jetty.util.NanoTime; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import static org.eclipse.jetty.http3.qpack.QpackTestUtil.encode; -import static org.eclipse.jetty.http3.qpack.QpackTestUtil.toBuffer; -import static org.eclipse.jetty.http3.qpack.QpackTestUtil.toMetaData; +import static org.eclipse.jetty.http3.qpack.util.QpackTestUtil.encode; +import static org.eclipse.jetty.http3.qpack.util.QpackTestUtil.toBuffer; +import static org.eclipse.jetty.http3.qpack.util.QpackTestUtil.toMetaData; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.containsString; import static org.hamcrest.Matchers.equalTo; diff --git a/jetty-core/jetty-http3/jetty-http3-qpack/src/test/java/org/eclipse/jetty/http3/qpack/QpackTestUtil.java b/jetty-core/jetty-http3/jetty-http3-qpack/src/test/java/org/eclipse/jetty/http3/qpack/util/QpackTestUtil.java similarity index 96% rename from jetty-core/jetty-http3/jetty-http3-qpack/src/test/java/org/eclipse/jetty/http3/qpack/QpackTestUtil.java rename to jetty-core/jetty-http3/jetty-http3-qpack/src/test/java/org/eclipse/jetty/http3/qpack/util/QpackTestUtil.java index 827d73d12624..392cb7812b69 100644 --- a/jetty-core/jetty-http3/jetty-http3-qpack/src/test/java/org/eclipse/jetty/http3/qpack/QpackTestUtil.java +++ b/jetty-core/jetty-http3/jetty-http3-qpack/src/test/java/org/eclipse/jetty/http3/qpack/util/QpackTestUtil.java @@ -11,7 +11,7 @@ // ======================================================================== // -package org.eclipse.jetty.http3.qpack; +package org.eclipse.jetty.http3.qpack.util; import java.nio.ByteBuffer; import java.util.List; @@ -21,6 +21,9 @@ import org.eclipse.jetty.http.HttpFields; import org.eclipse.jetty.http.HttpVersion; import org.eclipse.jetty.http.MetaData; +import org.eclipse.jetty.http3.qpack.Instruction; +import org.eclipse.jetty.http3.qpack.QpackEncoder; +import org.eclipse.jetty.http3.qpack.QpackException; import org.eclipse.jetty.io.ByteBufferPool; import org.eclipse.jetty.util.BufferUtil; import org.eclipse.jetty.util.StringUtil; diff --git a/jetty-core/jetty-http3/jetty-http3-qpack/src/test/java/org/eclipse/jetty/http3/qpack/TestDecoderHandler.java b/jetty-core/jetty-http3/jetty-http3-qpack/src/test/java/org/eclipse/jetty/http3/qpack/util/TestDecoderHandler.java similarity index 92% rename from jetty-core/jetty-http3/jetty-http3-qpack/src/test/java/org/eclipse/jetty/http3/qpack/TestDecoderHandler.java rename to jetty-core/jetty-http3/jetty-http3-qpack/src/test/java/org/eclipse/jetty/http3/qpack/util/TestDecoderHandler.java index c5a7c2361e88..ff42ab51d560 100644 --- a/jetty-core/jetty-http3/jetty-http3-qpack/src/test/java/org/eclipse/jetty/http3/qpack/TestDecoderHandler.java +++ b/jetty-core/jetty-http3/jetty-http3-qpack/src/test/java/org/eclipse/jetty/http3/qpack/util/TestDecoderHandler.java @@ -11,13 +11,15 @@ // ======================================================================== // -package org.eclipse.jetty.http3.qpack; +package org.eclipse.jetty.http3.qpack.util; import java.nio.ByteBuffer; import java.util.LinkedList; import java.util.List; import org.eclipse.jetty.http.MetaData; +import org.eclipse.jetty.http3.qpack.Instruction; +import org.eclipse.jetty.http3.qpack.QpackDecoder; public class TestDecoderHandler implements QpackDecoder.Handler, Instruction.Handler { diff --git a/jetty-core/jetty-http3/jetty-http3-qpack/src/test/java/org/eclipse/jetty/http3/qpack/TestEncoderHandler.java b/jetty-core/jetty-http3/jetty-http3-qpack/src/test/java/org/eclipse/jetty/http3/qpack/util/TestEncoderHandler.java similarity index 93% rename from jetty-core/jetty-http3/jetty-http3-qpack/src/test/java/org/eclipse/jetty/http3/qpack/TestEncoderHandler.java rename to jetty-core/jetty-http3/jetty-http3-qpack/src/test/java/org/eclipse/jetty/http3/qpack/util/TestEncoderHandler.java index fe5617697727..8dfc6e20eec0 100644 --- a/jetty-core/jetty-http3/jetty-http3-qpack/src/test/java/org/eclipse/jetty/http3/qpack/TestEncoderHandler.java +++ b/jetty-core/jetty-http3/jetty-http3-qpack/src/test/java/org/eclipse/jetty/http3/qpack/util/TestEncoderHandler.java @@ -11,12 +11,14 @@ // ======================================================================== // -package org.eclipse.jetty.http3.qpack; +package org.eclipse.jetty.http3.qpack.util; import java.nio.ByteBuffer; import java.util.LinkedList; import java.util.List; +import org.eclipse.jetty.http3.qpack.Instruction; + public class TestEncoderHandler implements Instruction.Handler { private final LinkedList _instructionList = new LinkedList<>();