@@ -306,6 +306,36 @@ llhttp_errno_t parserExecuteExpectationsCb( llhttp_t * parser,
306306 return parserErrNo ;
307307}
308308
309+ /**
310+ * @brief Callback variant for llhttp_execute() mock that expects the
311+ * on_header_field callback to return LLHTTP_STOP_PARSING when invoked
312+ * with a zero-length header field name.
313+ */
314+ llhttp_errno_t parserExecuteZeroLenFieldCb ( llhttp_t * parser ,
315+ const char * data ,
316+ size_t len ,
317+ int cmock_num_calls )
318+ {
319+ ( void ) cmock_num_calls ;
320+
321+ TEST_ASSERT_EQUAL ( pCapturedParser , parser );
322+ TEST_ASSERT_NOT_NULL ( parser );
323+ TEST_ASSERT_EQUAL ( pCapturedSettings , parser -> settings );
324+ TEST_ASSERT_EQUAL ( expectedBufferSize , len );
325+ TEST_ASSERT_EQUAL ( pExpectedBuffer , data );
326+
327+ if ( invokeHeaderFieldCallback == 1U )
328+ {
329+ TEST_ASSERT_EQUAL ( LLHTTP_STOP_PARSING ,
330+ ( ( llhttp_settings_t * ) ( parser -> settings ) )-> on_header_field ( parser ,
331+ pFieldLocToReturn ,
332+ fieldLenToReturn ) );
333+ }
334+
335+ parser -> error = parserErrNo ;
336+ return parserErrNo ;
337+ }
338+
309339/**
310340 * @brief Fills the test input buffer and expectation buffers with pre-existing data
311341 * before calling the API function under test.
@@ -1458,6 +1488,42 @@ void test_Http_ReadHeader_Invalid_Response_Only_Header_Field_Found()
14581488 TEST_ASSERT_EQUAL ( HTTPInvalidResponse , retCode );
14591489}
14601490
1491+ /**
1492+ * @brief Test that a zero-length header field name from the parser causes
1493+ * findHeaderFieldParserCallback to return LLHTTP_STOP_PARSING, resulting
1494+ * in HTTPInvalidResponse from HTTPClient_ReadHeader.
1495+ */
1496+ void test_Http_ReadHeader_Zero_Length_Header_Field ( void )
1497+ {
1498+ /* Add expectations for llhttp init dependencies. */
1499+ llhttp_settings_init_ExpectAnyArgs ();
1500+ llhttp_init_ExpectAnyArgs ();
1501+
1502+ /* Override the default llhttp_execute mock callback to use the variant
1503+ * that expects LLHTTP_STOP_PARSING from on_header_field. */
1504+ llhttp_execute_AddCallback ( parserExecuteZeroLenFieldCb );
1505+
1506+ /* Configure the llhttp_execute mock to invoke on_header_field with
1507+ * a zero-length field name. */
1508+ invokeHeaderFieldCallback = 1U ;
1509+ pFieldLocToReturn = & pTestResponse [ headerFieldInRespLoc ];
1510+ fieldLenToReturn = 0U ;
1511+
1512+ /* The callback returns LLHTTP_STOP_PARSING (HPE_USER) for the zero-length
1513+ * field. Since no header was found (fieldFound == 0) and parserErrno is
1514+ * not HPE_OK, findHeaderInResponse returns HTTPInvalidResponse. */
1515+ parserErrNo = HPE_USER ;
1516+ llhttp_execute_ExpectAnyArgsAndReturn ( HPE_USER );
1517+
1518+ /* Call the function under test. */
1519+ retCode = HTTPClient_ReadHeader ( & testResponse ,
1520+ HEADER_IN_BUFFER ,
1521+ HEADER_IN_BUFFER_LEN ,
1522+ & pValueLoc ,
1523+ & valueLen );
1524+ TEST_ASSERT_EQUAL ( HTTPInvalidResponse , retCode );
1525+ }
1526+
14611527
14621528/**
14631529 * @brief Test happy path with zero-initialized requestHeaders and requestInfo.
0 commit comments