diff options
author | ionagamed <ionagamed@yandex-team.com> | 2023-11-29 08:16:34 +0300 |
---|---|---|
committer | ionagamed <ionagamed@yandex-team.com> | 2023-11-29 08:51:03 +0300 |
commit | 55fc158d4d2d8ae4d9f026e1afac03c7daae294d (patch) | |
tree | bff2aa2edeae94bbf21a7a9875c6d8a1cbe8974c /library/cpp/json/json_reader.h | |
parent | 4c48882379d93a43bd74060add09e309ce5e5002 (diff) | |
download | ydb-55fc158d4d2d8ae4d9f026e1afac03c7daae294d.tar.gz |
library/json: add MaxDepth and iterative parsing into config
rationale: у нас была проблема где приезжает пользовательский json небольшой (на пару-тройку кб) и рвет нам стек из-за глубины.
Со стороны rapidjson это проще всего поправить включив у них итеративный парсинг, который не будет использовать системный стек.
Но это не совсем все — с нашей стороны оно все развалится когда надо будет вызвать рекурсивно деструкторы TJsonValue — и тут уже можно будет покрутить MaxDepth.
Diffstat (limited to 'library/cpp/json/json_reader.h')
-rw-r--r-- | library/cpp/json/json_reader.h | 20 |
1 files changed, 7 insertions, 13 deletions
diff --git a/library/cpp/json/json_reader.h b/library/cpp/json/json_reader.h index b673788330..6c8e8c32e2 100644 --- a/library/cpp/json/json_reader.h +++ b/library/cpp/json/json_reader.h @@ -15,11 +15,14 @@ namespace NJson { struct TJsonReaderConfig { TJsonReaderConfig(); + bool UseIterativeParser = false; // js-style comments (both // and /**/) bool AllowComments = false; bool DontValidateUtf8 = false; bool AllowEscapedApostrophe = false; + ui64 MaxDepth = 0; + void SetBufferSize(size_t bufferSize); size_t GetBufferSize() const; @@ -45,19 +48,10 @@ namespace NJson { bool ReadJson(IInputStream* in, const TJsonReaderConfig* config, TJsonCallbacks* callbacks); enum ReaderConfigFlags { - COMMENTS = 0b100, - VALIDATE = 0b010, - ESCAPE = 0b001, - }; - - enum ReaderConfigToRapidJsonFlags { - COMMENTS_NOVALID_NOESCAPE = 0b100, - COMMENTS_VALID_NOESCAPE = 0b110, - COMMENTS_VALID_ESCAPE = 0b111, - COMMENTS_NOVALID_ESCAPE = 0b101, - NOCOMMENTS_VALID_NOESCAPE = 0b010, - NOCOMMENTS_VALID_ESCAPE = 0b011, - NOCOMMENTS_NOVALID_ESCAPE = 0b001, + ITERATIVE = 0b1000, + COMMENTS = 0b0100, + VALIDATE = 0b0010, + ESCAPE = 0b0001, }; inline bool ValidateJson(IInputStream* in, const TJsonReaderConfig* config, bool throwOnError = false) { |