30 #include "absl/base/attributes.h"
31 #include "absl/strings/str_cat.h"
32 #include "absl/strings/str_format.h"
33 #include "absl/strings/string_view.h"
40 #define GRPC_JSON_MAX_DEPTH 255
41 #define GRPC_JSON_MAX_ERRORS 16
54 GRPC_JSON_PARSE_ERROR,
55 GRPC_JSON_INTERNAL_ERROR
59 GRPC_JSON_STATE_OBJECT_KEY_BEGIN,
60 GRPC_JSON_STATE_OBJECT_KEY_STRING,
61 GRPC_JSON_STATE_OBJECT_KEY_END,
62 GRPC_JSON_STATE_VALUE_BEGIN,
63 GRPC_JSON_STATE_VALUE_STRING,
64 GRPC_JSON_STATE_STRING_ESCAPE,
65 GRPC_JSON_STATE_STRING_ESCAPE_U1,
66 GRPC_JSON_STATE_STRING_ESCAPE_U2,
67 GRPC_JSON_STATE_STRING_ESCAPE_U3,
68 GRPC_JSON_STATE_STRING_ESCAPE_U4,
69 GRPC_JSON_STATE_VALUE_NUMBER,
70 GRPC_JSON_STATE_VALUE_NUMBER_WITH_DECIMAL,
71 GRPC_JSON_STATE_VALUE_NUMBER_ZERO,
72 GRPC_JSON_STATE_VALUE_NUMBER_DOT,
73 GRPC_JSON_STATE_VALUE_NUMBER_E,
74 GRPC_JSON_STATE_VALUE_NUMBER_EPM,
75 GRPC_JSON_STATE_VALUE_TRUE_R,
76 GRPC_JSON_STATE_VALUE_TRUE_U,
77 GRPC_JSON_STATE_VALUE_TRUE_E,
78 GRPC_JSON_STATE_VALUE_FALSE_A,
79 GRPC_JSON_STATE_VALUE_FALSE_L,
80 GRPC_JSON_STATE_VALUE_FALSE_S,
81 GRPC_JSON_STATE_VALUE_FALSE_E,
82 GRPC_JSON_STATE_VALUE_NULL_U,
83 GRPC_JSON_STATE_VALUE_NULL_L1,
84 GRPC_JSON_STATE_VALUE_NULL_L2,
85 GRPC_JSON_STATE_VALUE_END,
109 Json* CreateAndLinkValue();
123 State
state_ = State::GRPC_JSON_STATE_VALUE_BEGIN;
139 bool JsonReader::StringAddChar(
uint32_t c) {
142 if ((
c & 0x80) == 0) {
144 }
else if ((
c & 0xe0) == 0xc0) {
146 }
else if ((
c & 0xf0) == 0xe0) {
148 }
else if ((
c & 0xf8) == 0xf0) {
157 if ((
c & 0xc0) != 0x80)
return false;
167 bool JsonReader::StringAddUtf32(
uint32_t c) {
169 return StringAddChar(c);
170 }
else if (c <= 0x7ff) {
173 return StringAddChar(
b1) && StringAddChar(
b2);
174 }
else if (c <= 0xffff) {
178 return StringAddChar(
b1) && StringAddChar(
b2) && StringAddChar(b3);
179 }
else if (c <= 0x1fffff) {
184 return StringAddChar(
b1) && StringAddChar(
b2) && StringAddChar(b3) &&
202 Json* JsonReader::CreateAndLinkValue() {
209 if (parent->object_value().find(
key_) != parent->object_value().end()) {
221 parent->mutable_array()->emplace_back();
222 value = &parent->mutable_array()->back();
250 void JsonReader::EndContainer() {
255 void JsonReader::SetKey() {
260 void JsonReader::SetString() {
266 bool JsonReader::SetNumber() {
273 void JsonReader::SetTrue() {
279 void JsonReader::SetFalse() {
285 void JsonReader::SetNull() { CreateAndLinkValue(); }
287 bool JsonReader::IsComplete() {
288 return (
stack_.empty() && (
state_ == State::GRPC_JSON_STATE_END ||
289 state_ == State::GRPC_JSON_STATE_VALUE_END));
309 case State::GRPC_JSON_STATE_VALUE_NUMBER:
310 case State::GRPC_JSON_STATE_VALUE_NUMBER_WITH_DECIMAL:
311 case State::GRPC_JSON_STATE_VALUE_NUMBER_ZERO:
312 case State::GRPC_JSON_STATE_VALUE_NUMBER_EPM:
313 if (!SetNumber())
return Status::GRPC_JSON_PARSE_ERROR;
314 state_ = State::GRPC_JSON_STATE_VALUE_END;
321 return Status::GRPC_JSON_DONE;
323 return Status::GRPC_JSON_PARSE_ERROR;
331 case State::GRPC_JSON_STATE_OBJECT_KEY_BEGIN:
332 case State::GRPC_JSON_STATE_OBJECT_KEY_END:
333 case State::GRPC_JSON_STATE_VALUE_BEGIN:
334 case State::GRPC_JSON_STATE_VALUE_END:
335 case State::GRPC_JSON_STATE_END:
338 case State::GRPC_JSON_STATE_OBJECT_KEY_STRING:
339 case State::GRPC_JSON_STATE_VALUE_STRING:
340 if (c !=
' ')
return Status::GRPC_JSON_PARSE_ERROR;
342 return Status::GRPC_JSON_PARSE_ERROR;
344 if (!StringAddChar(c))
return Status::GRPC_JSON_PARSE_ERROR;
347 case State::GRPC_JSON_STATE_VALUE_NUMBER:
348 case State::GRPC_JSON_STATE_VALUE_NUMBER_WITH_DECIMAL:
349 case State::GRPC_JSON_STATE_VALUE_NUMBER_ZERO:
350 case State::GRPC_JSON_STATE_VALUE_NUMBER_EPM:
351 if (!SetNumber())
return Status::GRPC_JSON_PARSE_ERROR;
352 state_ = State::GRPC_JSON_STATE_VALUE_END;
356 return Status::GRPC_JSON_PARSE_ERROR;
365 case State::GRPC_JSON_STATE_OBJECT_KEY_STRING:
366 case State::GRPC_JSON_STATE_VALUE_STRING:
368 return Status::GRPC_JSON_PARSE_ERROR;
370 if (!StringAddChar(c))
return Status::GRPC_JSON_PARSE_ERROR;
373 case State::GRPC_JSON_STATE_VALUE_NUMBER:
374 case State::GRPC_JSON_STATE_VALUE_NUMBER_WITH_DECIMAL:
375 case State::GRPC_JSON_STATE_VALUE_NUMBER_ZERO:
376 case State::GRPC_JSON_STATE_VALUE_NUMBER_EPM:
378 return Status::GRPC_JSON_PARSE_ERROR;
379 }
else if (c ==
'}' &&
381 return Status::GRPC_JSON_PARSE_ERROR;
383 return Status::GRPC_JSON_PARSE_ERROR;
385 if (!SetNumber())
return Status::GRPC_JSON_PARSE_ERROR;
386 state_ = State::GRPC_JSON_STATE_VALUE_END;
389 case State::GRPC_JSON_STATE_VALUE_END:
390 case State::GRPC_JSON_STATE_OBJECT_KEY_BEGIN:
391 case State::GRPC_JSON_STATE_VALUE_BEGIN:
393 if (
state_ != State::GRPC_JSON_STATE_VALUE_END) {
394 return Status::GRPC_JSON_PARSE_ERROR;
398 state_ = State::GRPC_JSON_STATE_OBJECT_KEY_BEGIN;
399 }
else if (!
stack_.empty() &&
401 state_ = State::GRPC_JSON_STATE_VALUE_BEGIN;
403 return Status::GRPC_JSON_PARSE_ERROR;
407 return Status::GRPC_JSON_PARSE_ERROR;
410 return Status::GRPC_JSON_PARSE_ERROR;
413 state_ == State::GRPC_JSON_STATE_OBJECT_KEY_BEGIN &&
415 return Status::GRPC_JSON_PARSE_ERROR;
418 return Status::GRPC_JSON_PARSE_ERROR;
420 if (c ==
']' &&
state_ == State::GRPC_JSON_STATE_VALUE_BEGIN &&
422 return Status::GRPC_JSON_PARSE_ERROR;
424 state_ = State::GRPC_JSON_STATE_VALUE_END;
427 state_ = State::GRPC_JSON_STATE_END;
433 return Status::GRPC_JSON_PARSE_ERROR;
440 case State::GRPC_JSON_STATE_OBJECT_KEY_STRING:
442 state_ = State::GRPC_JSON_STATE_STRING_ESCAPE;
445 case State::GRPC_JSON_STATE_VALUE_STRING:
447 state_ = State::GRPC_JSON_STATE_STRING_ESCAPE;
451 case State::GRPC_JSON_STATE_STRING_ESCAPE:
453 return Status::GRPC_JSON_PARSE_ERROR;
455 if (!StringAddChar(
'\\'))
return Status::GRPC_JSON_PARSE_ERROR;
457 state_ = State::GRPC_JSON_STATE_OBJECT_KEY_STRING;
459 state_ = State::GRPC_JSON_STATE_VALUE_STRING;
464 return Status::GRPC_JSON_PARSE_ERROR;
471 case State::GRPC_JSON_STATE_OBJECT_KEY_BEGIN:
472 if (c !=
'"')
return Status::GRPC_JSON_PARSE_ERROR;
473 state_ = State::GRPC_JSON_STATE_OBJECT_KEY_STRING;
476 case State::GRPC_JSON_STATE_OBJECT_KEY_STRING:
478 return Status::GRPC_JSON_PARSE_ERROR;
481 state_ = State::GRPC_JSON_STATE_OBJECT_KEY_END;
485 return Status::GRPC_JSON_PARSE_ERROR;
489 if (c < 32)
return Status::GRPC_JSON_PARSE_ERROR;
490 if (!StringAddChar(c))
return Status::GRPC_JSON_PARSE_ERROR;
494 case State::GRPC_JSON_STATE_VALUE_STRING:
496 return Status::GRPC_JSON_PARSE_ERROR;
499 state_ = State::GRPC_JSON_STATE_VALUE_END;
503 return Status::GRPC_JSON_PARSE_ERROR;
507 if (c < 32)
return Status::GRPC_JSON_PARSE_ERROR;
508 if (!StringAddChar(c))
return Status::GRPC_JSON_PARSE_ERROR;
512 case State::GRPC_JSON_STATE_OBJECT_KEY_END:
513 if (c !=
':')
return Status::GRPC_JSON_PARSE_ERROR;
514 state_ = State::GRPC_JSON_STATE_VALUE_BEGIN;
517 case State::GRPC_JSON_STATE_VALUE_BEGIN:
520 state_ = State::GRPC_JSON_STATE_VALUE_TRUE_R;
524 state_ = State::GRPC_JSON_STATE_VALUE_FALSE_A;
528 state_ = State::GRPC_JSON_STATE_VALUE_NULL_U;
532 state_ = State::GRPC_JSON_STATE_VALUE_STRING;
536 if (!StringAddChar(c))
return Status::GRPC_JSON_PARSE_ERROR;
537 state_ = State::GRPC_JSON_STATE_VALUE_NUMBER_ZERO;
550 if (!StringAddChar(c))
return Status::GRPC_JSON_PARSE_ERROR;
551 state_ = State::GRPC_JSON_STATE_VALUE_NUMBER;
557 return Status::GRPC_JSON_PARSE_ERROR;
559 state_ = State::GRPC_JSON_STATE_OBJECT_KEY_BEGIN;
565 return Status::GRPC_JSON_PARSE_ERROR;
569 return Status::GRPC_JSON_PARSE_ERROR;
573 case State::GRPC_JSON_STATE_STRING_ESCAPE:
575 state_ = State::GRPC_JSON_STATE_OBJECT_KEY_STRING;
577 state_ = State::GRPC_JSON_STATE_VALUE_STRING;
580 return Status::GRPC_JSON_PARSE_ERROR;
585 if (!StringAddChar(c))
return Status::GRPC_JSON_PARSE_ERROR;
588 if (!StringAddChar(
'\b'))
return Status::GRPC_JSON_PARSE_ERROR;
591 if (!StringAddChar(
'\f'))
return Status::GRPC_JSON_PARSE_ERROR;
594 if (!StringAddChar(
'\n'))
return Status::GRPC_JSON_PARSE_ERROR;
597 if (!StringAddChar(
'\r'))
return Status::GRPC_JSON_PARSE_ERROR;
600 if (!StringAddChar(
'\t'))
return Status::GRPC_JSON_PARSE_ERROR;
603 state_ = State::GRPC_JSON_STATE_STRING_ESCAPE_U1;
607 return Status::GRPC_JSON_PARSE_ERROR;
611 case State::GRPC_JSON_STATE_STRING_ESCAPE_U1:
612 case State::GRPC_JSON_STATE_STRING_ESCAPE_U2:
613 case State::GRPC_JSON_STATE_STRING_ESCAPE_U3:
614 case State::GRPC_JSON_STATE_STRING_ESCAPE_U4:
615 if ((c >=
'0') && (c <=
'9')) {
617 }
else if ((c >=
'A') && (c <=
'F')) {
619 }
else if ((c >=
'a') && (c <=
'f')) {
622 return Status::GRPC_JSON_PARSE_ERROR;
628 case State::GRPC_JSON_STATE_STRING_ESCAPE_U1:
629 state_ = State::GRPC_JSON_STATE_STRING_ESCAPE_U2;
631 case State::GRPC_JSON_STATE_STRING_ESCAPE_U2:
632 state_ = State::GRPC_JSON_STATE_STRING_ESCAPE_U3;
634 case State::GRPC_JSON_STATE_STRING_ESCAPE_U3:
635 state_ = State::GRPC_JSON_STATE_STRING_ESCAPE_U4;
637 case State::GRPC_JSON_STATE_STRING_ESCAPE_U4:
644 return Status::GRPC_JSON_PARSE_ERROR;
651 return Status::GRPC_JSON_PARSE_ERROR;
657 if (!StringAddUtf32(utf32)) {
658 return Status::GRPC_JSON_PARSE_ERROR;
664 return Status::GRPC_JSON_PARSE_ERROR;
667 return Status::GRPC_JSON_PARSE_ERROR;
671 state_ = State::GRPC_JSON_STATE_OBJECT_KEY_STRING;
673 state_ = State::GRPC_JSON_STATE_VALUE_STRING;
681 case State::GRPC_JSON_STATE_VALUE_NUMBER:
682 if (!StringAddChar(c))
return Status::GRPC_JSON_PARSE_ERROR;
697 state_ = State::GRPC_JSON_STATE_VALUE_NUMBER_E;
700 state_ = State::GRPC_JSON_STATE_VALUE_NUMBER_DOT;
703 return Status::GRPC_JSON_PARSE_ERROR;
707 case State::GRPC_JSON_STATE_VALUE_NUMBER_WITH_DECIMAL:
708 if (!StringAddChar(c))
return Status::GRPC_JSON_PARSE_ERROR;
723 state_ = State::GRPC_JSON_STATE_VALUE_NUMBER_E;
726 return Status::GRPC_JSON_PARSE_ERROR;
730 case State::GRPC_JSON_STATE_VALUE_NUMBER_ZERO:
731 if (c !=
'.')
return Status::GRPC_JSON_PARSE_ERROR;
732 if (!StringAddChar(c))
return Status::GRPC_JSON_PARSE_ERROR;
733 state_ = State::GRPC_JSON_STATE_VALUE_NUMBER_DOT;
736 case State::GRPC_JSON_STATE_VALUE_NUMBER_DOT:
737 if (!StringAddChar(c))
return Status::GRPC_JSON_PARSE_ERROR;
749 state_ = State::GRPC_JSON_STATE_VALUE_NUMBER_WITH_DECIMAL;
752 return Status::GRPC_JSON_PARSE_ERROR;
756 case State::GRPC_JSON_STATE_VALUE_NUMBER_E:
757 if (!StringAddChar(c))
return Status::GRPC_JSON_PARSE_ERROR;
771 state_ = State::GRPC_JSON_STATE_VALUE_NUMBER_EPM;
774 return Status::GRPC_JSON_PARSE_ERROR;
778 case State::GRPC_JSON_STATE_VALUE_NUMBER_EPM:
779 if (!StringAddChar(c))
return Status::GRPC_JSON_PARSE_ERROR;
793 return Status::GRPC_JSON_PARSE_ERROR;
797 case State::GRPC_JSON_STATE_VALUE_TRUE_R:
798 if (c !=
'r')
return Status::GRPC_JSON_PARSE_ERROR;
799 state_ = State::GRPC_JSON_STATE_VALUE_TRUE_U;
802 case State::GRPC_JSON_STATE_VALUE_TRUE_U:
803 if (c !=
'u')
return Status::GRPC_JSON_PARSE_ERROR;
804 state_ = State::GRPC_JSON_STATE_VALUE_TRUE_E;
807 case State::GRPC_JSON_STATE_VALUE_TRUE_E:
808 if (c !=
'e')
return Status::GRPC_JSON_PARSE_ERROR;
810 state_ = State::GRPC_JSON_STATE_VALUE_END;
813 case State::GRPC_JSON_STATE_VALUE_FALSE_A:
814 if (c !=
'a')
return Status::GRPC_JSON_PARSE_ERROR;
815 state_ = State::GRPC_JSON_STATE_VALUE_FALSE_L;
818 case State::GRPC_JSON_STATE_VALUE_FALSE_L:
819 if (c !=
'l')
return Status::GRPC_JSON_PARSE_ERROR;
820 state_ = State::GRPC_JSON_STATE_VALUE_FALSE_S;
823 case State::GRPC_JSON_STATE_VALUE_FALSE_S:
824 if (c !=
's')
return Status::GRPC_JSON_PARSE_ERROR;
825 state_ = State::GRPC_JSON_STATE_VALUE_FALSE_E;
828 case State::GRPC_JSON_STATE_VALUE_FALSE_E:
829 if (c !=
'e')
return Status::GRPC_JSON_PARSE_ERROR;
831 state_ = State::GRPC_JSON_STATE_VALUE_END;
834 case State::GRPC_JSON_STATE_VALUE_NULL_U:
835 if (c !=
'u')
return Status::GRPC_JSON_PARSE_ERROR;
836 state_ = State::GRPC_JSON_STATE_VALUE_NULL_L1;
839 case State::GRPC_JSON_STATE_VALUE_NULL_L1:
840 if (c !=
'l')
return Status::GRPC_JSON_PARSE_ERROR;
841 state_ = State::GRPC_JSON_STATE_VALUE_NULL_L2;
844 case State::GRPC_JSON_STATE_VALUE_NULL_L2:
845 if (c !=
'l')
return Status::GRPC_JSON_PARSE_ERROR;
847 state_ = State::GRPC_JSON_STATE_VALUE_END;
852 case State::GRPC_JSON_STATE_VALUE_END:
861 return Status::GRPC_JSON_PARSE_ERROR;
865 case State::GRPC_JSON_STATE_END:
866 return Status::GRPC_JSON_PARSE_ERROR;
877 if (
reader.truncated_errors_) {
879 "too many errors encountered during JSON parsing -- fix reported "
880 "errors and try again to see additional errors"));
882 if (
status == Status::GRPC_JSON_INTERNAL_ERROR) {
884 "internal error in JSON parser at index ",
reader.CurrentIndex())));
885 }
else if (
status == Status::GRPC_JSON_PARSE_ERROR) {
889 if (!
reader.errors_.empty()) {