in sdk/src/resumable/ResumableCopier.cc [174:239]
int ResumableCopier::prepare(OssError& err)
{
determinePartSize();
ObjectMetaData metaData(request_.MetaData());
if (metaData.HttpMetaData().find("x-oss-metadata-directive") == metaData.HttpMetaData().end() ||
(metaData.HttpMetaData().find("x-oss-metadata-directive") != metaData.HttpMetaData().end() &&
metaData.HttpMetaData().at("x-oss-metadata-directive") == "COPY")) {
HeadObjectRequest hRequest(request_.SrcBucket(), request_.SrcKey());
if (request_.RequestPayer() == RequestPayer::Requester) {
hRequest.setRequestPayer(request_.RequestPayer());
}
if (!request_.VersionId().empty()) {
hRequest.setVersionId(request_.VersionId());
}
auto headObjectOutcome = client_->HeadObject(hRequest);
if (!headObjectOutcome.isSuccess()) {
err = headObjectOutcome.error();
return -1;
}
auto& meta = metaData.UserMetaData();
meta = headObjectOutcome.result().UserMetaData();
}
auto initMultipartUploadReq = InitiateMultipartUploadRequest(request_.Bucket(), request_.Key(), metaData);
if (!request_.EncodingType().empty()) {
initMultipartUploadReq.setEncodingType(request_.EncodingType());
}
if (request_.RequestPayer() == RequestPayer::Requester) {
initMultipartUploadReq.setRequestPayer(request_.RequestPayer());
}
auto outcome = client_->InitiateMultipartUpload(initMultipartUploadReq);
if (!outcome.isSuccess()) {
err = outcome.error();
return -1;
}
//init record_
uploadID_ = outcome.result().UploadId();
if (hasRecordPath()) {
initRecord(uploadID_);
Json::Value root;
root["opType"] = record_.opType;
root["uploadID"] = record_.uploadID;
root["srcBucket"] = record_.srcBucket;
root["srcKey"] = record_.srcKey;
root["bucket"] = record_.bucket;
root["key"] = record_.key;
root["mtime"] = record_.mtime;
root["size"] = record_.size;
root["partSize"] = record_.partSize;
std::stringstream ss;
ss << root;
std::string md5Sum = ComputeContentETag(ss);
root["md5Sum"] = md5Sum;
auto recordStream = GetFstreamByPath(recordPath_, recordPathW_, std::ios::out);
if (recordStream->is_open()) {
*recordStream << root;
recordStream->close();
}
}
return 0;
}