@@ -303,6 +303,61 @@ unittest {
303303 assert (! settings.decode! Base64URL(" a|b+*-c" ));
304304}
305305
306+ // unpackSettings rejects enablePush values other than 0 or 1
307+ unittest {
308+ import std.bitmanip : nativeToBigEndian;
309+
310+ // SETTINGS_ENABLE_PUSH (0x2) = 2 (invalid per RFC 7540 §6.5.2)
311+ ubyte [] src = nativeToBigEndian(cast (ushort ) 0x2 ) ~ nativeToBigEndian(cast (uint ) 2 );
312+ HTTP2Settings settings;
313+ try {
314+ unpackSettings(settings, src);
315+ assert (false , " Expected PROTOCOL_ERROR for enablePush=2" );
316+ } catch (HTTP2Exception e) {
317+ assert (e.code == HTTP2Error.PROTOCOL_ERROR );
318+ }
319+ }
320+
321+ // unpackSettings rejects initialWindowSize >= 2^31
322+ unittest {
323+ import std.bitmanip : nativeToBigEndian;
324+
325+ // SETTINGS_INITIAL_WINDOW_SIZE (0x4) = 2^31 (invalid per RFC 7540 §6.5.2)
326+ ubyte [] src = nativeToBigEndian(cast (ushort ) 0x4 ) ~ nativeToBigEndian(cast (uint )(1u << 31 ));
327+ HTTP2Settings settings;
328+ try {
329+ unpackSettings(settings, src);
330+ assert (false , " Expected FLOW_CONTROL_ERROR for initialWindowSize=2^31" );
331+ } catch (HTTP2Exception e) {
332+ assert (e.code == HTTP2Error.FLOW_CONTROL_ERROR );
333+ }
334+ }
335+
336+ // unpackSettings rejects maxFrameSize outside [2^14, 2^24)
337+ unittest {
338+ import std.bitmanip : nativeToBigEndian;
339+
340+ // SETTINGS_MAX_FRAME_SIZE (0x5) = 100 (below 2^14, invalid)
341+ ubyte [] src = nativeToBigEndian(cast (ushort ) 0x5 ) ~ nativeToBigEndian(cast (uint ) 100 );
342+ HTTP2Settings settings;
343+ try {
344+ unpackSettings(settings, src);
345+ assert (false , " Expected PROTOCOL_ERROR for maxFrameSize=100" );
346+ } catch (HTTP2Exception e) {
347+ assert (e.code == HTTP2Error.PROTOCOL_ERROR );
348+ }
349+
350+ // SETTINGS_MAX_FRAME_SIZE (0x5) = 2^24 (at upper bound, invalid)
351+ src = nativeToBigEndian(cast (ushort ) 0x5 ) ~ nativeToBigEndian(cast (uint )(1u << 24 ));
352+ settings = HTTP2Settings.init;
353+ try {
354+ unpackSettings(settings, src);
355+ assert (false , " Expected PROTOCOL_ERROR for maxFrameSize=2^24" );
356+ } catch (HTTP2Exception e) {
357+ assert (e.code == HTTP2Error.PROTOCOL_ERROR );
358+ }
359+ }
360+
306361/* * Context is initialized on each new connection
307362
308363 it MUST remain consistent between streams of the same connection
0 commit comments