@@ -804,25 +804,43 @@ int Transaction::processRequestBody() {
804804     */  
805805    std::unique_ptr<std::string> a = m_variableRequestHeaders.resolveFirst (
806806        " Content-Type"  );
807+ 
808+     bool  requestBodyNoFilesLimitExceeded = false ;
809+     if  ((m_requestBodyType == WWWFormUrlEncoded) ||
810+         (m_requestBodyProcessor == JSONRequestBody) ||
811+         (m_requestBodyProcessor == XMLRequestBody)) {
812+         if  ((m_rules->m_requestBodyNoFilesLimit .m_set )
813+             && (m_requestBody.str ().size () > m_rules->m_requestBodyNoFilesLimit .m_value )) {
814+             m_variableReqbodyError.set (" 1"  , 0 );
815+             m_variableReqbodyErrorMsg.set (" Request body excluding files is bigger than the maximum expected."  , 0 );
816+             m_variableInboundDataError.set (" 1"  , m_variableOffset);
817+             ms_dbg (5 , " Request body excluding files is bigger than the maximum expected."  );
818+             requestBodyNoFilesLimitExceeded = true ;
819+ 	}
820+     }
821+ 
807822#ifdef  WITH_LIBXML2
808823    if  (m_requestBodyProcessor == XMLRequestBody) {
809-         std::string error;
810-         if  (m_xml->init () == true ) {
811-             m_xml->processChunk (m_requestBody.str ().c_str (),
812-                 m_requestBody.str ().size (),
813-                 &error);
814-             m_xml->complete (&error);
815-         }
816-         if  (error.empty () == false ) {
817-             m_variableReqbodyError.set (" 1"  , m_variableOffset);
818-             m_variableReqbodyErrorMsg.set (" XML parsing error: "   + error,
819-                 m_variableOffset);
820-             m_variableReqbodyProcessorErrorMsg.set (" XML parsing error: "   \
821-                 + error, m_variableOffset);
822-             m_variableReqbodyProcessorError.set (" 1"  , m_variableOffset);
823-         } else  {
824-             m_variableReqbodyError.set (" 0"  , m_variableOffset);
825-             m_variableReqbodyProcessorError.set (" 0"  , m_variableOffset);
824+         //  large size might cause issues in the parsing itself; omit if exceeded
825+         if  (!requestBodyNoFilesLimitExceeded) {
826+             std::string error;
827+             if  (m_xml->init () == true ) {
828+                 m_xml->processChunk (m_requestBody.str ().c_str (),
829+                     m_requestBody.str ().size (),
830+                     &error);
831+                 m_xml->complete (&error);
832+             }
833+             if  (error.empty () == false ) {
834+                 m_variableReqbodyError.set (" 1"  , m_variableOffset);
835+                 m_variableReqbodyErrorMsg.set (" XML parsing error: "   + error,
836+                     m_variableOffset);
837+                 m_variableReqbodyProcessorErrorMsg.set (" XML parsing error: "   \
838+                     + error, m_variableOffset);
839+                 m_variableReqbodyProcessorError.set (" 1"  , m_variableOffset);
840+             } else  {
841+                 m_variableReqbodyError.set (" 0"  , m_variableOffset);
842+                 m_variableReqbodyProcessorError.set (" 0"  , m_variableOffset);
843+             }
826844        }
827845#endif
828846#if  WITH_YAJL
@@ -831,26 +849,29 @@ int Transaction::processRequestBody() {
831849#else 
832850    if  (m_requestBodyProcessor == JSONRequestBody) {
833851#endif
834-         std::string error;
835-         if  (m_rules->m_requestBodyJsonDepthLimit .m_set ) {
836-             m_json->setMaxDepth (m_rules->m_requestBodyJsonDepthLimit .m_value );
837-         }
838-         if  (m_json->init () == true ) {
839-             m_json->processChunk (m_requestBody.str ().c_str (),
840-                 m_requestBody.str ().size (),
841-                 &error);
842-             m_json->complete (&error);
843-         }
844-         if  (error.empty () == false  && m_requestBody.str ().size () > 0 ) {
845-             m_variableReqbodyError.set (" 1"  , m_variableOffset);
846-             m_variableReqbodyProcessorError.set (" 1"  , m_variableOffset);
847-             m_variableReqbodyErrorMsg.set (" JSON parsing error: "   + error,
848-                 m_variableOffset);
849-             m_variableReqbodyProcessorErrorMsg.set (" JSON parsing error: "   \
850-                 + error, m_variableOffset);
851-         } else  {
852-             m_variableReqbodyError.set (" 0"  , m_variableOffset);
853-             m_variableReqbodyProcessorError.set (" 0"  , m_variableOffset);
852+         //  large size might cause issues in the parsing itself; omit if exceeded
853+         if  (!requestBodyNoFilesLimitExceeded) {
854+             std::string error;
855+             if  (m_rules->m_requestBodyJsonDepthLimit .m_set ) {
856+                 m_json->setMaxDepth (m_rules->m_requestBodyJsonDepthLimit .m_value );
857+             }
858+             if  (m_json->init () == true ) {
859+                 m_json->processChunk (m_requestBody.str ().c_str (),
860+                     m_requestBody.str ().size (),
861+                     &error);
862+                 m_json->complete (&error);
863+             }
864+             if  (error.empty () == false  && m_requestBody.str ().size () > 0 ) {
865+                 m_variableReqbodyError.set (" 1"  , m_variableOffset);
866+                 m_variableReqbodyProcessorError.set (" 1"  , m_variableOffset);
867+                 m_variableReqbodyErrorMsg.set (" JSON parsing error: "   + error,
868+                     m_variableOffset);
869+                 m_variableReqbodyProcessorErrorMsg.set (" JSON parsing error: "   \
870+                     + error, m_variableOffset);
871+             } else  {
872+                 m_variableReqbodyError.set (" 0"  , m_variableOffset);
873+                 m_variableReqbodyProcessorError.set (" 0"  , m_variableOffset);
874+             }
854875        }
855876#endif
856877#if  defined(WITH_LIBXML2) or defined(WITH_YAJL)
@@ -859,11 +880,13 @@ int Transaction::processRequestBody() {
859880    if  (m_requestBodyType == MultiPartRequestBody) {
860881#endif
861882        std::string error;
883+         int  reqbodyNoFilesLength = 0 ;
862884        if  (a != NULL ) {
863885            Multipart m (*a, this );
864886            if  (m.init (&error) == true ) {
865887                m.process (m_requestBody.str (), &error, m_variableOffset);
866888            }
889+             reqbodyNoFilesLength = m.m_reqbody_no_files_length ;
867890            m.multipart_complete (&error);
868891        }
869892        if  (error.empty () == false ) {
@@ -873,13 +896,22 @@ int Transaction::processRequestBody() {
873896                m_variableOffset);
874897            m_variableReqbodyProcessorErrorMsg.set (" Multipart parsing "   \
875898                " error: "   + error, m_variableOffset);
899+         } else  if  (((m_rules->m_requestBodyNoFilesLimit .m_set )
900+                    && (reqbodyNoFilesLength > m_rules->m_requestBodyNoFilesLimit .m_value ))) {
901+             m_variableReqbodyError.set (" 1"  , 0 );
902+             m_variableReqbodyErrorMsg.set (" Request body excluding files is bigger than the maximum expected."  , 0 );
903+             m_variableInboundDataError.set (" 1"  , m_variableOffset);
904+             ms_dbg (5 , " Request body excluding files is bigger than the maximum expected."  );
876905        } else  {
877906            m_variableReqbodyError.set (" 0"  , m_variableOffset);
878907            m_variableReqbodyProcessorError.set (" 0"  , m_variableOffset);
879908        }
880909    } else  if  (m_requestBodyType == WWWFormUrlEncoded) {
881910        m_variableOffset++;
882-         extractArguments (" POST"  , m_requestBody.str (), m_variableOffset);
911+         //  large size might cause issues in the parsing itself; omit if exceeded
912+         if  (!requestBodyNoFilesLimitExceeded) {
913+             extractArguments (" POST"  , m_requestBody.str (), m_variableOffset);
914+ 	}
883915    } else  if  (m_requestBodyType != UnknownFormat) {
884916        /* *
885917         * FIXME: double check to see if that is a valid scenario... 
0 commit comments