in sdk/src/resumable/ResumableDownloader.cc [287:331]
int ResumableDownloader::validateRecord()
{
auto record = record_;
if (record.size != objectSize_ || record.mtime != request_.ObjectMtime()) {
return ARG_ERROR_DOWNLOAD_OBJECT_MODIFIED;
}
if (request_.RangeIsSet()) {
if (record.rangeStart != request_.RangeStart() || record.rangeEnd != request_.RangeEnd()) {
return ARG_ERROR_RANGE_HAS_BEEN_RESET;
}
}
Json::Value root;
root["opType"] = record.opType;
root["bucket"] = record.bucket;
root["key"] = record.key;
root["filePath"] = record.filePath;
root["mtime"] = record.mtime;
root["size"] = record.size;
root["partSize"] = record.partSize;
root["parts"].resize(0);
int index = 0;
for (PartRecord& part : record.parts) {
root["parts"][index]["partNumber"] = part.partNumber;
root["parts"][index]["size"] = part.size;
root["parts"][index]["crc64"] = part.crc64;
index++;
}
if (!(record.rangeStart == 0 && record.rangeEnd == -1)) {
root["rangeStart"] = record.rangeStart;
root["rangeEnd"] = record.rangeEnd;
}
std::stringstream recordStream;
recordStream << root;
std::string md5Sum = ComputeContentETag(recordStream);
if (md5Sum != record.md5Sum) {
return -1;
}
return 0;
}