Ignore unknown enum value when ignore_unknown specified (#7455)

pull/7464/head
Paul Yang 5 years ago committed by GitHub
parent ed5c874de3
commit 317bc83444
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 4
      php/ext/google/protobuf/map.c
  2. 3194
      php/ext/google/protobuf/upb.c
  3. 2515
      php/ext/google/protobuf/upb.h
  4. 44
      php/src/Google/Protobuf/Internal/Message.php
  5. 5
      php/tests/encode_decode_test.php

@ -516,8 +516,8 @@ bool map_done(MapIter *iter) {
}
const char *map_iter_key(MapIter *iter, int *len) {
*len = upb_strtable_iter_keylength(&iter->it);
return upb_strtable_iter_key(&iter->it);
*len = upb_strtable_iter_key(&iter->it).size;
return upb_strtable_iter_key(&iter->it).data;
}
upb_value map_iter_value(MapIter *iter, int *len) {

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

@ -773,10 +773,10 @@ class Message
* @return null.
* @throws \Exception Invalid data.
*/
public function mergeFromJsonString($data)
public function mergeFromJsonString($data, $ignore_unknown = false)
{
$input = new RawInputStream($data);
$this->parseFromJsonStream($input);
$this->parseFromJsonStream($input, $ignore_unknown);
}
/**
@ -801,6 +801,7 @@ class Message
private function convertJsonValueToProtoValue(
$value,
$field,
$ignore_unknown,
$is_map_key = false)
{
switch ($field->getType()) {
@ -849,7 +850,7 @@ class Message
} elseif (!is_object($value) && !is_array($value)) {
throw new GPBDecodeException("Expect message.");
}
$submsg->mergeFromJsonArray($value);
$submsg->mergeFromJsonArray($value, $ignore_unknown);
}
return $submsg;
case GPBType::ENUM:
@ -862,9 +863,12 @@ class Message
$enum_value = $field->getEnumType()->getValueByName($value);
if (!is_null($enum_value)) {
return $enum_value->getNumber();
} else if ($ignore_unknown) {
return $this->defaultValue($field);
} else {
throw new GPBDecodeException(
"Enum field only accepts integer or enum value name");
}
throw new GPBDecodeException(
"Enum field only accepts integer or enum value name");
case GPBType::STRING:
if (is_null($value)) {
return $this->defaultValue($field);
@ -1125,17 +1129,17 @@ class Message
}
}
protected function mergeFromJsonArray($array)
protected function mergeFromJsonArray($array, $ignore_unknown)
{
if (is_a($this, "Google\Protobuf\Any")) {
$this->clear();
$this->setTypeUrl($array["@type"]);
$msg = $this->unpack();
if (GPBUtil::hasSpecialJsonMapping($msg)) {
$msg->mergeFromJsonArray($array["value"]);
$msg->mergeFromJsonArray($array["value"], $ignore_unknown);
} else {
unset($array["@type"]);
$msg->mergeFromJsonArray($array);
$msg->mergeFromJsonArray($array, $ignore_unknown);
}
$this->setValue($msg->serializeToString());
return;
@ -1171,7 +1175,7 @@ class Message
$fields = $this->getFields();
foreach($array as $key => $value) {
$v = new Value();
$v->mergeFromJsonArray($value);
$v->mergeFromJsonArray($value, $ignore_unknown);
$fields[$key] = $v;
}
}
@ -1194,7 +1198,7 @@ class Message
}
foreach ($array as $key => $v) {
$value = new Value();
$value->mergeFromJsonArray($v);
$value->mergeFromJsonArray($v, $ignore_unknown);
$values = $struct_value->getFields();
$values[$key]= $value;
}
@ -1207,7 +1211,7 @@ class Message
}
foreach ($array as $v) {
$value = new Value();
$value->mergeFromJsonArray($v);
$value->mergeFromJsonArray($v, $ignore_unknown);
$values = $list_value->getValues();
$values[]= $value;
}
@ -1217,10 +1221,10 @@ class Message
}
return;
}
$this->mergeFromArrayJsonImpl($array);
$this->mergeFromArrayJsonImpl($array, $ignore_unknown);
}
private function mergeFromArrayJsonImpl($array)
private function mergeFromArrayJsonImpl($array, $ignore_unknown)
{
foreach ($array as $key => $value) {
$field = $this->desc->getFieldByJsonName($key);
@ -1244,10 +1248,12 @@ class Message
$proto_key = $this->convertJsonValueToProtoValue(
$tmp_key,
$key_field,
$ignore_unknown,
true);
$proto_value = $this->convertJsonValueToProtoValue(
$tmp_value,
$value_field);
$value_field,
$ignore_unknown);
self::kvUpdateHelper($field, $proto_key, $proto_value);
}
} else if ($field->isRepeated()) {
@ -1261,14 +1267,16 @@ class Message
}
$proto_value = $this->convertJsonValueToProtoValue(
$tmp,
$field);
$field,
$ignore_unknown);
self::appendHelper($field, $proto_value);
}
} else {
$setter = $field->getSetter();
$proto_value = $this->convertJsonValueToProtoValue(
$value,
$field);
$field,
$ignore_unknown);
if ($field->getType() === GPBType::MESSAGE) {
if (is_null($proto_value)) {
continue;
@ -1288,7 +1296,7 @@ class Message
/**
* @ignore
*/
public function parseFromJsonStream($input)
public function parseFromJsonStream($input, $ignore_unknown)
{
$array = json_decode($input->getData(), true, 512, JSON_BIGINT_AS_STRING);
if ($this instanceof \Google\Protobuf\ListValue) {
@ -1304,7 +1312,7 @@ class Message
}
}
try {
$this->mergeFromJsonArray($array);
$this->mergeFromJsonArray($array, $ignore_unknown);
} catch (\Exception $e) {
throw new GPBDecodeException($e->getMessage());
}

@ -884,6 +884,11 @@ class EncodeDecodeTest extends TestBase
$m->mergeFromJsonString("{\"unknown\":{\"a\":1, \"b\":1},
\"optionalInt32\":1}", true);
$this->assertSame(1, $m->getOptionalInt32());
// Test unknown enum value
$m = new TestMessage();
$m->mergeFromJsonString("{\"optionalEnum\":\"UNKNOWN\"}", true);
$this->assertSame(0, $m->getOptionalEnum());
}
public function testJsonEncode()

Loading…
Cancel
Save