int ResumableDownloader::validateRecord()

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;
}