in src/brpc/amf.cpp [760:843]
static bool ReadAMFArrayItem(AMFInputStream* stream, AMFArray* arr) {
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;
arr->AddNumber(*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;
}
arr->AddBool(val);
} break;
case AMF_MARKER_STRING: {
std::string val;
if (!ReadAMFShortStringBody(&val, stream)) {
return false;
}
arr->AddString(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(arr->AddObject(), stream)) {
return false;
}
} break;
case AMF_MARKER_ECMA_ARRAY: {
if (!ReadAMFEcmaArrayBody(arr->AddObject(), stream)) {
return false;
}
} break;
case AMF_MARKER_STRICT_ARRAY: {
if (!ReadAMFArrayBody(arr->AddArray(), stream)) {
return false;
}
} break;
case AMF_MARKER_NULL:
arr->AddNull();
break;
case AMF_MARKER_UNDEFINED:
arr->AddUndefined();
break;
case AMF_MARKER_UNSUPPORTED:
arr->AddUnsupported();
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;
}
arr->AddString(val);
} break;
} // switch
return true;
}