1818#endif
1919
2020#include " src/request_body_processor/json_backend.h"
21+ #include " src/request_body_processor/json_backend_common.h"
2122
2223#include < cctype>
2324#include < chrono>
3536
3637namespace modsecurity ::RequestBodyProcessor {
3738namespace {
38-
39- JsonParseResult makeResult (JsonParseStatus parse_status,
40- JsonSinkStatus sink_status = JsonSinkStatus::Continue,
41- std::string detail = " " ) {
42- return JsonParseResult{parse_status, sink_status, std::move (detail)};
43- }
44-
45- JsonParseResult makeResult (JsonParseStatus parse_status, std::string detail) {
46- return makeResult (parse_status, JsonSinkStatus::Continue, std::move (detail));
47- }
48-
49- JsonParseResult stopTraversal (JsonSinkStatus sink_status,
50- std::string_view location) {
51- return makeResult (JsonParseStatus::Ok, sink_status,
52- std::string (" JSON traversal stopped while " ) + std::string (location)
53- + " ." );
54- }
39+ using json_backend_common::finishSinkCall;
40+ using json_backend_common::makeResult;
5541
5642bool isUtf8RelatedError (const std::error_code &error) {
5743 switch (static_cast <jsoncons::json_errc>(error.value ())) {
@@ -574,14 +560,6 @@ std::string_view rawNumberFromContext(std::string_view input,
574560 return std::string_view ();
575561}
576562
577- JsonParseResult emitSink (JsonEventSink *sink, JsonSinkStatus sink_status,
578- std::string_view location) {
579- if (sink_status != JsonSinkStatus::Continue) {
580- return stopTraversal (sink_status, location);
581- }
582- return makeResult (JsonParseStatus::Ok);
583- }
584-
585563JsonParseResult emitNumberFromRawToken (std::string_view input, JsonEventSink *sink,
586564 RawJsonTokenCursor *token_cursor, jsoncons::staj_event_type event_type,
587565 const jsoncons::ser_context &context, const jsoncons::staj_event &event) {
@@ -599,7 +577,7 @@ JsonParseResult emitNumberFromRawToken(std::string_view input, JsonEventSink *si
599577 JsonSinkStatus::Continue,
600578 " Unable to materialize numeric JSON token from jsoncons backend." );
601579 }
602- return emitSink (sink, sink->on_number (raw_number), " handling a number" );
580+ return finishSinkCall ( sink->on_number (raw_number), " handling a number" );
603581}
604582
605583JsonParseResult decodeStringEventValue (const jsoncons::staj_event &event,
@@ -619,20 +597,20 @@ JsonParseResult emitEvent(std::string_view input, JsonEventSink *sink,
619597
620598 switch (event.event_type ()) {
621599 case jsoncons::staj_event_type::begin_object:
622- return emitSink (sink, sink->on_start_object (), " starting an object" );
600+ return finishSinkCall ( sink->on_start_object (), " starting an object" );
623601 case jsoncons::staj_event_type::end_object:
624- return emitSink (sink, sink->on_end_object (), " ending an object" );
602+ return finishSinkCall ( sink->on_end_object (), " ending an object" );
625603 case jsoncons::staj_event_type::begin_array:
626- return emitSink (sink, sink->on_start_array (), " starting an array" );
604+ return finishSinkCall ( sink->on_start_array (), " starting an array" );
627605 case jsoncons::staj_event_type::end_array:
628- return emitSink (sink, sink->on_end_array (), " ending an array" );
606+ return finishSinkCall ( sink->on_end_array (), " ending an array" );
629607 case jsoncons::staj_event_type::key: {
630608 jsoncons::string_view decoded;
631609 if (JsonParseResult result = decodeStringEventValue (event, context,
632610 &decoded); !result.ok ()) {
633611 return result;
634612 }
635- return emitSink (sink, sink->on_key (std::string_view (decoded.data (),
613+ return finishSinkCall ( sink->on_key (std::string_view (decoded.data (),
636614 decoded.size ())), " processing an object key" );
637615 }
638616 case jsoncons::staj_event_type::string_value: {
@@ -648,24 +626,24 @@ JsonParseResult emitEvent(std::string_view input, JsonEventSink *sink,
648626 && token_cursor->advanceExactNumber (decoded_number,
649627 &sync_detail)) {
650628 recordJsonconsTokenExactAdvanceStep ();
651- return emitSink (sink, sink->on_number (decoded_number),
629+ return finishSinkCall ( sink->on_number (decoded_number),
652630 " handling a number" );
653631 }
654632 return emitNumberFromRawToken (input, sink, token_cursor,
655633 jsoncons::staj_event_type::double_value, context, event);
656634 }
657- return emitSink (sink, sink->on_string (std::string_view (decoded.data (),
635+ return finishSinkCall ( sink->on_string (std::string_view (decoded.data (),
658636 decoded.size ())), " handling a string" );
659637 }
660638 case jsoncons::staj_event_type::null_value:
661- return emitSink (sink, sink->on_null (), " handling a null value" );
639+ return finishSinkCall ( sink->on_null (), " handling a null value" );
662640 case jsoncons::staj_event_type::bool_value:
663641 {
664642 bool boolean_value = event.get <bool >(error);
665643 if (error) {
666644 return fromJsonconsError (error, context);
667645 }
668- return emitSink (sink, sink->on_boolean (boolean_value),
646+ return finishSinkCall ( sink->on_boolean (boolean_value),
669647 " handling a boolean" );
670648 }
671649 case jsoncons::staj_event_type::int64_value:
0 commit comments