in src/brpc/amf.cpp [609:694]
static bool ReadAMFObjectField(AMFInputStream* stream,
AMFObject* obj,
const std::string& name) {
uint8_t marker;
if (stream->cut_u8(&marker) != 1u) {
LOG(ERROR) << "stream is not long enough";
return false;
}
switch ((AMFMarker)marker) {
case AMF_MARKER_NUMBER: {
uint64_t val = 0;
if (stream->cut_u64(&val) != 8u) {
LOG(ERROR) << "stream is not long enough";
return false;
}
double* dptr = (double*)&val;
obj->SetNumber(name, *dptr);
} break;
case AMF_MARKER_BOOLEAN: {
uint8_t val = 0;
if (stream->cut_u8(&val) != 1u) {
LOG(ERROR) << "stream is not long enough";
return false;
}
obj->SetBool(name, val);
} break;
case AMF_MARKER_STRING: {
std::string val;
if (!ReadAMFShortStringBody(&val, stream)) {
return false;
}
obj->SetString(name, val);
} break;
case AMF_MARKER_TYPED_OBJECT: {
std::string class_name;
if (!ReadAMFShortStringBody(&class_name, stream)) {
LOG(ERROR) << "Fail to read class_name";
}
}
// fall through
case AMF_MARKER_OBJECT: {
if (!ReadAMFObjectBody(obj->MutableObject(name), stream)) {
return false;
}
} break;
case AMF_MARKER_ECMA_ARRAY: {
if (!ReadAMFEcmaArrayBody(obj->MutableObject(name), stream)) {
return false;
}
} break;
case AMF_MARKER_STRICT_ARRAY: {
if (!ReadAMFArrayBody(obj->MutableArray(name), stream)) {
return false;
}
} break;
case AMF_MARKER_NULL:
obj->SetNull(name);
break;
case AMF_MARKER_UNDEFINED:
obj->SetUndefined(name);
break;
case AMF_MARKER_UNSUPPORTED:
obj->SetUnsupported(name);
break;
case AMF_MARKER_MOVIECLIP:
case AMF_MARKER_REFERENCE:
case AMF_MARKER_DATE:
case AMF_MARKER_RECORDSET:
case AMF_MARKER_XML_DOCUMENT:
case AMF_MARKER_AVMPLUS_OBJECT:
LOG(ERROR) << marker2str(marker) << " is not supported yet";
return false;
case AMF_MARKER_OBJECT_END:
CHECK(false) << "object-end shouldn't be present here";
break;
case AMF_MARKER_LONG_STRING: {
std::string val;
if (!ReadAMFLongStringBody(&val, stream)) {
LOG(ERROR) << "stream is not long enough";
return false;
}
obj->SetString(name, val);
} break;
} // switch
return true;
}