@@ -547,3 +547,50 @@ async def test_non_probe_paths_require_auth_when_skip_enabled(
547547 with pytest .raises (HTTPException ) as exc_info :
548548 await auth_dep (request )
549549 assert exc_info .value .status_code == 401
550+
551+
552+ class TestRHIdentityHeaderSizeLimit :
553+ """Test suite for x-rh-identity header size limit enforcement."""
554+
555+ @pytest .mark .asyncio
556+ async def test_header_at_exact_limit_accepted (
557+ self , mocker : MockerFixture , user_identity_data : dict
558+ ) -> None :
559+ """Test that a header at exactly the size limit is accepted."""
560+ header_value = create_auth_header (user_identity_data )
561+ auth_dep = RHIdentityAuthDependency (max_header_size = len (header_value ))
562+ request = create_request_with_header (mocker , header_value )
563+
564+ user_id , username , _ , _ = await auth_dep (request )
565+
566+ assert user_id == "abc123"
567+ assert username == "user@redhat.com"
568+
569+ @pytest .mark .asyncio
570+ @pytest .mark .parametrize (
571+ "header_size,max_size" ,
572+ [
573+ (9000 , 8192 ), # Well over default limit
574+ (101 , 100 ), # One byte over custom limit
575+ (200 , 100 ), # Well over custom limit
576+ ],
577+ )
578+ async def test_header_exceeding_limit_rejected (
579+ self ,
580+ mocker : MockerFixture ,
581+ header_size : int ,
582+ max_size : int ,
583+ ) -> None :
584+ """Test oversized headers rejected with HTTP 400 and a warning logged."""
585+ mock_warning = mocker .patch ("authentication.rh_identity.logger.warning" )
586+ auth_dep = RHIdentityAuthDependency (max_header_size = max_size )
587+ request = create_request_with_header (mocker , "x" * header_size )
588+
589+ with pytest .raises (HTTPException ) as exc_info :
590+ await auth_dep (request )
591+
592+ assert exc_info .value .status_code == 400
593+ assert "exceeds maximum" in str (exc_info .value .detail )
594+ mock_warning .assert_called_once ()
595+ assert mock_warning .call_args .args [1 ] == header_size
596+ assert mock_warning .call_args .args [2 ] == max_size
0 commit comments