Skip to content
This repository was archived by the owner on May 8, 2026. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -90,11 +90,7 @@ public enum Http3SettingIdentifier {
private final long id;

private static final Map<Long, Http3SettingIdentifier> LOOKUP = Collections.unmodifiableMap(
Arrays.stream(values())
.collect(Collectors.toMap(
Http3SettingIdentifier::id,
Function.identity()
))
Arrays.stream(values()).collect(Collectors.toMap(Http3SettingIdentifier::id, Function.identity()))
);

Http3SettingIdentifier(long id) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -119,7 +119,7 @@ public final class Http3Settings implements Iterable<Map.Entry<Long, Long>> {
* Creates a new instance
*/
public Http3Settings() {
this.settings = new LongObjectHashMap<>(4);
this.settings = new LongObjectHashMap<>(Http3SettingIdentifier.values().length);
}

/**
Expand Down Expand Up @@ -164,7 +164,7 @@ public Long put(long key, Long value) {

// When Non-Standard/Unknown settings identifier identifier present - Ignore
if (identifier == null) {
return value;
return null;
}

//Validation
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,6 @@
import static org.junit.jupiter.api.Assertions.assertNull;
import static org.junit.jupiter.api.Assertions.assertNotSame;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;

/**
* unit tests for {@link Http3Settings}.
Expand Down Expand Up @@ -264,4 +263,46 @@ void testCopyFromNullThrows() {
Http3Settings settings = new Http3Settings();
assertThrows(NullPointerException.class, () -> settings.putAll(null));
}

@Test
void duplicateSettingsValuesInsideFrameTest() {
Http3SettingsFrame settingsFrame = new DefaultHttp3SettingsFrame();
assertNull(settingsFrame.put(Http3SettingIdentifier.HTTP3_SETTINGS_QPACK_MAX_TABLE_CAPACITY.id(), 100L));
assertNull(settingsFrame.put(Http3SettingIdentifier.HTTP3_SETTINGS_QPACK_BLOCKED_STREAMS.id(), 1L));
assertNull(settingsFrame.put(Http3SettingIdentifier.HTTP3_SETTINGS_MAX_FIELD_SECTION_SIZE.id(), 128L));
assertNull(settingsFrame.put(Http3SettingIdentifier.HTTP3_SETTINGS_ENABLE_CONNECT_PROTOCOL.id(), 0L));
assertNull(settingsFrame.put(Http3SettingIdentifier.HTTP3_SETTINGS_H3_DATAGRAM.id(), 1L));
//known headers should not contain duplicate so give non-null
// which is used in http3framecodec to throw error
assertNotNull(settingsFrame.put(Http3SettingIdentifier.HTTP3_SETTINGS_H3_DATAGRAM.id(), 1L));
// Ensure we can encode and decode all sizes correctly.
// unknown settings id/key will be ignored
assertNull(settingsFrame.put(63, 63L));
assertNull(settingsFrame.put(16383, 16383L));
assertNull(settingsFrame.put(1073741823, 1073741823L));
assertNull(settingsFrame.put(4611686018427387903L, 4611686018427387903L));
//even duplicates of unknown ignored as we ignore unknown
assertNull(settingsFrame.put(4611686018427387903L, 4611686018427387903L));
}

@Test
void duplicateSettingsValuesInsideHttp3SettingsTest() {
Http3Settings http3Settings = new Http3Settings();
assertNull(http3Settings.put(Http3SettingIdentifier.HTTP3_SETTINGS_QPACK_MAX_TABLE_CAPACITY.id(), 100L));
assertNull(http3Settings.put(Http3SettingIdentifier.HTTP3_SETTINGS_QPACK_BLOCKED_STREAMS.id(), 1L));
assertNull(http3Settings.put(Http3SettingIdentifier.HTTP3_SETTINGS_MAX_FIELD_SECTION_SIZE.id(), 128L));
assertNull(http3Settings.put(Http3SettingIdentifier.HTTP3_SETTINGS_ENABLE_CONNECT_PROTOCOL.id(), 0L));
assertNull(http3Settings.put(Http3SettingIdentifier.HTTP3_SETTINGS_H3_DATAGRAM.id(), 1L));
//known headers should not contain duplicate so give non-null
// which is used in http3framecodec to throw error
assertNotNull(http3Settings.put(Http3SettingIdentifier.HTTP3_SETTINGS_H3_DATAGRAM.id(), 1L));
// Ensure we can encode and decode all sizes correctly.
// unknown settings id/key will be ignored
assertNull(http3Settings.put(63, 63L));
assertNull(http3Settings.put(16383, 16383L));
assertNull(http3Settings.put(1073741823, 1073741823L));
assertNull(http3Settings.put(4611686018427387903L, 4611686018427387903L));
//even duplicates of unknown ignored as we ignore unknown
assertNull(http3Settings.put(4611686018427387903L, 4611686018427387903L));
}
}
Loading