aboutsummaryrefslogtreecommitdiffstats
path: root/library/cpp/json/json_reader.h
diff options
context:
space:
mode:
authorionagamed <ionagamed@yandex-team.com>2023-11-29 08:16:34 +0300
committerionagamed <ionagamed@yandex-team.com>2023-11-29 08:51:03 +0300
commit55fc158d4d2d8ae4d9f026e1afac03c7daae294d (patch)
treebff2aa2edeae94bbf21a7a9875c6d8a1cbe8974c /library/cpp/json/json_reader.h
parent4c48882379d93a43bd74060add09e309ce5e5002 (diff)
downloadydb-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.h20
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) {