This commit is contained in:
a158
2026-04-05 20:22:11 +08:00
commit 3cf88acc07
184 changed files with 82333 additions and 0 deletions

View File

@@ -0,0 +1,763 @@
// Copyright (c) 2017, Tencent Inc.
// All rights reserved.
//
// Author: sevenyou <sevenyou@tencent.com>
// Created: 07/21/17
// Description:
#ifndef OBJECT_RESP_H
#define OBJECT_RESP_H
#pragma once
#include <iostream>
#include <vector>
#include "cos_config.h"
#include "cos_params.h"
#include "response/base_resp.h"
namespace qcloud_cos {
class GetObjectResp : public BaseResp {
public:
/// \brief 获取object type, 表示object是否可以被追加上传枚举值normal 或者
/// appendable
std::string GetXCosObjectType() const { return m_x_cos_object_type; }
void SetXCosObjectType(const std::string& x_cos_object_type) {
m_x_cos_object_type = x_cos_object_type;
}
/// \brief 获取自定义的元数据
std::map<std::string, std::string> GetXCosMetas() const {
return m_x_cos_metas;
}
/// \brief 获取自定义的元数据
std::string GetXCosMeta(const std::string& key) const {
std::map<std::string, std::string>::const_iterator itr =
m_x_cos_metas.find(key);
if (itr != m_x_cos_metas.end()) {
return itr->second;
}
return "";
}
void SetXCosMeta(const std::string& key, const std::string& value) {
m_x_cos_metas[key] = value;
}
/// \brief Server端加密使用的算法
std::string GetXCosServerSideEncryption() const {
return GetHeader("x-cos-server-side-encryption");
}
void ParseFromHeaders(const std::map<std::string, std::string>& headers);
protected:
GetObjectResp() {}
GetObjectResp(const GetObjectResp& rhs)
: BaseResp(rhs),
m_x_cos_object_type(rhs.m_x_cos_object_type),
m_x_cos_metas(rhs.m_x_cos_metas) {}
GetObjectResp& operator=(const GetObjectResp& rhs) {
if (&rhs != this) {
BaseResp::operator=(rhs);
m_x_cos_object_type = rhs.m_x_cos_object_type;
m_x_cos_metas = rhs.m_x_cos_metas;
}
return *this;
}
virtual ~GetObjectResp() {}
private:
std::string m_x_cos_object_type;
std::map<std::string, std::string> m_x_cos_metas;
};
class GetObjectByStreamResp : public GetObjectResp {
public:
GetObjectByStreamResp() {}
virtual ~GetObjectByStreamResp() {}
};
class GetObjectByFileResp : public GetObjectResp {
public:
GetObjectByFileResp() {}
virtual ~GetObjectByFileResp() {}
};
class PutObjectResp : virtual public BaseResp {
protected:
PutObjectResp() {}
virtual ~PutObjectResp() {}
public:
/// 获取Object的版本号, 如果Bucket未开启多版本, 返回空字符串
std::string GetVersionId() const { return GetHeader("x-cos-version-id"); }
/// Server端加密使用的算法
std::string GetXCosServerSideEncryption() const {
return GetHeader("x-cos-server-side-encryption");
}
};
class PutObjectByStreamResp : public PutObjectResp {
public:
PutObjectByStreamResp() {}
virtual ~PutObjectByStreamResp() {}
};
class PutObjectByFileResp : public PutObjectResp {
public:
PutObjectByFileResp() {}
virtual ~PutObjectByFileResp() {}
};
class DeleteObjectResp : public BaseResp {
public:
DeleteObjectResp() {}
virtual ~DeleteObjectResp() {}
};
class DeleteObjectsResp : public BaseResp {
public:
DeleteObjectsResp() {}
virtual ~DeleteObjectsResp() {}
std::vector<DeletedInfo> GetDeletedInfos() const { return m_deleted_infos; }
std::vector<ErrorInfo> GetErrorMsgs() const { return m_error_infos; }
virtual bool ParseFromXmlString(const std::string& body);
private:
std::vector<DeletedInfo> m_deleted_infos;
std::vector<ErrorInfo> m_error_infos;
};
class HeadObjectResp : public BaseResp {
public:
HeadObjectResp() {}
virtual ~HeadObjectResp() {}
/// \brief 获取object type, 表示object是否可以被追加上传枚举值normal 或者
/// appendable
std::string GetXCosObjectType() const { return m_x_cos_object_type; }
void SetXCosObjectType(const std::string& x_cos_object_type) {
m_x_cos_object_type = x_cos_object_type;
}
/// \brief 获取自定义的元数据
std::map<std::string, std::string> GetXCosMetas() const {
return m_x_cos_metas;
}
/// \brief 获取自定义的元数据
std::string GetXCosMeta(const std::string& key) const {
std::map<std::string, std::string>::const_iterator itr =
m_x_cos_metas.find(key);
if (itr != m_x_cos_metas.end()) {
return itr->second;
}
return "";
}
void SetXCosMeta(const std::string& key, const std::string& value) {
m_x_cos_metas[key] = value;
}
/// \brief 获得 archive 类型对象的当前恢复状态
std::string GetXCosRestore() const { return GetHeader("x-cos-restore"); }
/// \brief Server端加密使用的算法
std::string GetXCosServerSideEncryption() const {
return GetHeader("x-cos-server-side-encryption");
}
void ParseFromHeaders(const std::map<std::string, std::string>& headers);
private:
std::string m_x_cos_object_type;
std::map<std::string, std::string> m_x_cos_metas;
};
class InitMultiUploadResp : public BaseResp {
public:
InitMultiUploadResp() {}
virtual ~InitMultiUploadResp() {}
virtual bool ParseFromXmlString(const std::string& body);
/// \brief 获取uploadId, 用于后续上传
std::string GetUploadId() const { return m_upload_id; }
/// \brief 获取Object的名称
std::string GetKey() const { return m_key; }
/// \brief 分片上传的目标Bucket
std::string GetBucket() const { return m_bucket; }
/// \brief Server端加密使用的算法
std::string GetXCosServerSideEncryption() const {
return GetHeader("x-cos-server-side-encryption");
}
private:
std::string m_bucket;
std::string m_key; // object名称
std::string m_upload_id;
};
class UploadPartDataResp : public BaseResp {
public:
UploadPartDataResp() {}
virtual ~UploadPartDataResp() {}
/// \brief Server端加密使用的算法
std::string GetXCosServerSideEncryption() const {
return GetHeader("x-cos-server-side-encryption");
}
};
class UploadPartCopyDataResp : public BaseResp {
public:
UploadPartCopyDataResp() {}
virtual ~UploadPartCopyDataResp() {}
virtual bool ParseFromXmlString(const std::string& body);
/// \brief 获取返回文件的MD5算法校验值。
/// ETag 的值可以用于检查 Object 的内容是否发生变化。
std::string GetEtag() const { return m_etag; }
/// \brief 返回文件最后修改时间GMT 格式
std::string GetLastModified() const { return m_last_modified; }
/// \brief Server端加密使用的算法
std::string GetXCosServerSideEncryption() const {
return GetHeader("x-cos-server-side-encryption");
}
private:
std::string m_etag;
std::string m_last_modified;
};
class CompleteMultiUploadResp : public BaseResp {
public:
CompleteMultiUploadResp() {}
virtual ~CompleteMultiUploadResp() {}
virtual bool ParseFromXmlString(const std::string& body);
std::string GetLocation() const { return m_location; }
std::string GetKey() const { return m_key; }
std::string GetBucket() const { return m_bucket; }
std::string GetVersionId() const { return GetHeader("x-cos-version-id"); }
std::string GetEtag() const { return m_etag; }
void SetEtag(const std::string& etag) { m_etag = etag;}
void AddEtagToHeader() { BaseResp::SetEtag(m_etag); }
/// \brief Server端加密使用的算法
std::string GetXCosServerSideEncryption() const {
return GetHeader("x-cos-server-side-encryption");
}
private:
std::string m_location; // Object的外网访问域名
std::string m_bucket;
std::string m_key;
std::string m_etag;
};
class AbortMultiUploadResp : public BaseResp {
public:
AbortMultiUploadResp() {}
virtual ~AbortMultiUploadResp() {}
};
class ListPartsResp : public BaseResp {
public:
ListPartsResp()
: m_bucket(""),
m_encoding_type(""),
m_key(""),
m_upload_id(""),
m_part_number_marker(0),
m_parts(0),
m_next_part_number_marker(0),
m_storage_class(""),
m_max_parts(1000),
m_is_truncated(false) {}
virtual ~ListPartsResp() {}
virtual bool ParseFromXmlString(const std::string& body);
std::string GetBucket() const { return m_bucket; }
std::string GetEncodingType() const { return m_encoding_type; }
std::string GetKey() const { return m_key; }
std::string GetUploadId() const { return m_upload_id; }
Initiator GetInitiator() const { return m_initiator; }
Owner GetOwner() const { return m_owner; }
uint64_t GetPartNumberMarker() const { return m_part_number_marker; }
std::vector<Part> GetParts() const { return m_parts; }
uint64_t GetNextPartNumberMarker() const { return m_next_part_number_marker; }
std::string GetStorageClass() const { return m_storage_class; }
uint64_t GetMaxParts() const { return m_max_parts; }
bool IsTruncated() const { return m_is_truncated; }
private:
std::string m_bucket;
std::string m_encoding_type;
std::string m_key;
std::string m_upload_id;
Initiator m_initiator;
Owner m_owner;
uint64_t m_part_number_marker;
std::vector<Part> m_parts;
uint64_t m_next_part_number_marker;
std::string m_storage_class;
uint64_t m_max_parts;
bool m_is_truncated;
};
class GetObjectACLResp : public BaseResp {
public:
GetObjectACLResp() {}
virtual ~GetObjectACLResp() {}
virtual bool ParseFromXmlString(const std::string& body);
std::string GetOwnerID() const { return m_owner_id; }
std::string GetOwnerDisplayName() const { return m_owner_display_name; }
std::vector<Grant> GetAccessControlList() const { return m_acl; }
private:
std::string m_owner_id;
std::string m_owner_display_name;
std::vector<Grant> m_acl;
};
class PutObjectACLResp : public BaseResp {
public:
PutObjectACLResp() {}
virtual ~PutObjectACLResp() {}
};
class PutObjectTaggingResp : public BaseResp {
public:
PutObjectTaggingResp() {}
virtual ~PutObjectTaggingResp() {}
};
class GetObjectTaggingResp : public BaseResp {
public:
GetObjectTaggingResp() {}
void SetTagSet(std::vector<Tag>& tagset) { m_tagset = tagset; }
std::vector<Tag> GetTagSet() const { return m_tagset; }
//清除tag规则.
void ClearTagSet() {
std::vector<Tag> temp;
m_tagset.swap(temp);
}
/// 添加单个tag.
void AddTag(const Tag& tag) { m_tagset.push_back(tag); }
virtual bool ParseFromXmlString(const std::string& body);
virtual ~GetObjectTaggingResp() {}
private:
std::vector<Tag> m_tagset;
};
class DeleteObjectTaggingResp : public BaseResp {
public:
DeleteObjectTaggingResp() {}
virtual ~DeleteObjectTaggingResp() {}
};
class PutObjectCopyResp : public BaseResp {
public:
PutObjectCopyResp() {}
virtual ~PutObjectCopyResp() {}
virtual bool ParseFromXmlString(const std::string& body);
std::string GetEtag() const { return m_etag; }
std::string GetLastModified() const { return m_last_modified; }
std::string GetVersionId() const { return m_version_id; }
std::string GetCrc64() const { return m_crc64; }
/// Server端加密使用的算法
std::string GetXCosServerSideEncryption() const {
return GetHeader("x-cos-server-side-encryption");
}
private:
std::string m_etag;
std::string m_last_modified;
std::string m_version_id;
std::string m_crc64;
};
class CopyResp : public BaseResp {
public:
CopyResp()
: m_location(""),
m_bucket(""),
m_key(""),
m_etag(""),
m_last_modified(""),
m_version_id(""),
m_resp_tag("") {}
virtual ~CopyResp() {}
void CopyFrom(const PutObjectCopyResp& resp);
void CopyFrom(const CompleteMultiUploadResp& resp);
void Clear() {
m_location = "";
m_bucket = "";
m_key = "";
m_etag = "";
m_last_modified = "";
m_version_id = "";
m_resp_tag = "";
}
std::string GetLocation() const { return m_location; }
std::string GetKey() const { return m_key; }
std::string GetBucket() const { return m_bucket; }
std::string GetEtag() const { return m_etag; }
std::string GetLastModified() const { return m_last_modified; }
std::string GetVersionId() const { return m_version_id; }
std::string GetRespTag() { return m_resp_tag; }
private:
std::string m_location; // Object的外网访问域名
std::string m_bucket;
std::string m_key;
std::string m_etag;
std::string m_last_modified;
std::string m_version_id;
std::string m_resp_tag; // 用于区分是哪一种response
};
class PostObjectRestoreResp : public BaseResp {
public:
PostObjectRestoreResp() {}
~PostObjectRestoreResp() {}
};
class OptionsObjectResp : public BaseResp {
public:
OptionsObjectResp() {}
~OptionsObjectResp() {}
/// \brief 获取模拟跨域访问的请求来源域名当来源不允许的时候此Header不返回
std::string GetAccessControAllowOrigin() const {
return GetHeader("Access-Control-Allow-Origin");
}
/// \brief 获取模拟跨域访问的请求 HTTP
/// 方法当请求方法不允许的时候此Header不返回
std::string GetAccessControlAllowMethods() const {
return GetHeader("Access-Control-Allow-Methods");
}
/// \brief
/// 获取模拟跨域访问的请求头部当模拟任何请求头部不允许的时候此Header不返回该请求头部
std::string GetAccessControlAllowHeaders() const {
return GetHeader("Access-Control-Allow-Headers");
}
/// \brief 获取模拟跨域访问的请求 HTTP
/// 方法当请求方法不允许的时候此Header不返回
std::string GetAccessControlExposeHeaders() const {
return GetHeader("Access-Control-Expose-Headers");
}
/// \brief 获取OPTIONS请求得到结果的有效期
std::string GetAccessControlMaxAge() const {
return GetHeader("Access-Control-Max-Age");
}
};
class SelectObjectContentResp : public BaseResp {
public:
SelectObjectContentResp() { resp_data.reserve(10); }
~SelectObjectContentResp() {}
/// \brief 将响应结果写入本地文件
int WriteResultToLocalFile(const std::string& file);
bool ParseFromXmlString(const std::string& body);
// bool ParseFromStringStream(const std::ostringstream& os);
/// \brief 打印最终结果至终端
void PrintResult() const;
private:
// void ParseStatsEvent(const std::string& stat_str);
// void ParseProgressEvent(const std::string& prog_str);
std::vector<SelectMessage> resp_data;
std::string error_message;
std::string error_code;
};
class AppendObjectResp : public PutObjectByStreamResp {
public:
AppendObjectResp() {}
~AppendObjectResp() {}
/// \brief 获取下一次追加操作的起始点,单位:字节
std::string GetNextPosition() const {
return GetHeader(kRespHeaderXCosNextAppendPosition);
}
/// \brief 获取服务端返回的本次append内容的md5
std::string GetXCosContentSha1() const {
return GetHeader(kRespHeaderXCosContentSha1);
}
};
/// \brief: 创建直播通道的响应
class PutLiveChannelResp : public BaseResp {
public:
PutLiveChannelResp() {}
virtual ~PutLiveChannelResp() {}
virtual bool ParseFromXmlString(const std::string& body);
const std::string GetPublishUrl() const { return m_publish_url; }
std::string& GetPublishUrl() { return m_publish_url; }
std::string GetPlayUrl() const { return m_play_url; }
private:
std::string m_publish_url; // 推流url
std::string m_play_url; // 观流url
};
/// \brief: 启用或者禁用直播通道的响应
class PutLiveChannelSwitchResp : public BaseResp {
public:
PutLiveChannelSwitchResp() {}
virtual ~PutLiveChannelSwitchResp() {}
};
/// \brief: 获取直播通道配置的响应
class GetLiveChannelResp : public BaseResp {
public:
GetLiveChannelResp() {}
virtual ~GetLiveChannelResp() {}
virtual bool ParseFromXmlString(const std::string& body);
const LiveChannelConfiguration& GetLiveChannelConf() const {
return m_chan_conf;
}
private:
LiveChannelConfiguration m_chan_conf;
};
/// \brief: 获取直播通道推流历史的响应
class GetLiveChannelHistoryResp : public BaseResp {
public:
GetLiveChannelHistoryResp() {}
virtual ~GetLiveChannelHistoryResp() {}
virtual bool ParseFromXmlString(const std::string& body);
const std::vector<LiveRecord>& GetChanHistory() const { return m_history; }
private:
std::vector<LiveRecord> m_history;
};
/// \brief: 获取直播通道推流状态的响应
class GetLiveChannelStatusResp : public BaseResp {
public:
GetLiveChannelStatusResp() {}
virtual ~GetLiveChannelStatusResp() {}
virtual bool ParseFromXmlString(const std::string& body);
const LiveChannelStatus& GetLiveChannelStatus() const {
return m_livechan_status;
}
private:
LiveChannelStatus m_livechan_status;
};
/// \brief: 删除直播通道的响应
class DeleteLiveChannelResp : public BaseResp {
public:
DeleteLiveChannelResp() {}
virtual ~DeleteLiveChannelResp() {}
};
/// \brief: 查询指定通道在指定时间段推流生成的播放列表的响应
class GetLiveChannelVodPlaylistResp : public BaseResp {
public:
GetLiveChannelVodPlaylistResp() {}
virtual ~GetLiveChannelVodPlaylistResp() {}
int WriteResultToFile(const std::string& file);
};
/// \brief: 为指定通道生成一个可供点播例用的播放列表的响应
class PostLiveChannelVodPlaylistResp : public BaseResp {
public:
PostLiveChannelVodPlaylistResp() {}
virtual ~PostLiveChannelVodPlaylistResp() {}
};
/* Multithread接口 */
class MultiPutObjectResp : public BaseResp {
public:
MultiPutObjectResp() {}
virtual ~MultiPutObjectResp() {}
virtual bool ParseFromXmlString(const std::string& body);
std::string GetRespTag() { return m_resp_tag; }
std::string GetLocation() const { return m_location; }
std::string GetKey() const { return m_key; }
std::string GetBucket() const { return m_bucket; }
void CopyFrom(const InitMultiUploadResp& resp);
void CopyFrom(const UploadPartDataResp& resp);
void CopyFrom(const CompleteMultiUploadResp& resp);
/// \brief Server端加密使用的算法
std::string GetXCosServerSideEncryption() const {
return GetHeader("x-cos-server-side-encryption");
}
private:
std::string m_location; // Object的外网访问域名
std::string m_bucket;
std::string m_key;
std::string m_upload_id;
// FIXME(sevenyou) 先这么搞吧
std::string m_resp_tag; // 用于区分是哪一种response
};
class MultiGetObjectResp : public GetObjectByFileResp {
public:
MultiGetObjectResp() {}
~MultiGetObjectResp() {}
};
class PutObjectResumableSingleSyncResp : public GetObjectByFileResp {
public:
PutObjectResumableSingleSyncResp() {}
virtual ~PutObjectResumableSingleSyncResp() {}
std::string GetRespTag() { return m_resp_tag; }
std::string GetLocation() const { return m_location; }
std::string GetKey() const { return m_key; }
std::string GetBucket() const { return m_bucket; }
void CopyFrom(const InitMultiUploadResp& resp);
void CopyFrom(const PutObjectByFileResp& resp);
void CopyFrom(const CompleteMultiUploadResp& resp);
/// \brief Server端加密使用的算法
std::string GetXCosServerSideEncryption() const {
return GetHeader("x-cos-server-side-encryption");
}
private:
std::string m_location; // Object的外网访问域名
std::string m_bucket;
std::string m_key;
std::string m_upload_id;
// FIXME(sevenyou) 先这么搞吧
std::string m_resp_tag; // 用于区分是哪一种response
};
/* Async接口 */
//typedef PutObjectByFileResp PutObjectAsyncResp;
//typedef PutObjectByFileResp MultiPutObjectAsyncResp;
//typedef GetObjectByFileResp GetObjectAsyncResp;
//typedef GetObjectByFileResp MultiGetObjectAsyncResp;
class AsyncResp : public BaseResp {
public:
AsyncResp() {}
virtual ~AsyncResp() {}
};
/* 批量及目录操作接口 */
class PutObjectsByDirectoryResp {
public:
PutObjectsByDirectoryResp() {}
virtual ~PutObjectsByDirectoryResp() {}
public:
class PutResp {
public:
PutResp() {}
virtual ~PutResp() {}
std::string m_file_name; // 本地文件名
std::string m_object_name; // 对象名
BaseResp m_cos_resp; // cos返回的响应
};
// 成功上传的对象
std::vector<PutResp> m_succ_put_objs;
};
class PutDirectoryResp : public PutObjectResp {
public:
PutDirectoryResp() {}
virtual ~PutDirectoryResp() {}
};
class MoveObjectResp {
public:
MoveObjectResp() {}
virtual ~MoveObjectResp() {}
};
class DeleteObjectsByPrefixResp {
public:
DeleteObjectsByPrefixResp() {}
virtual ~DeleteObjectsByPrefixResp() {}
std::vector<std::string> m_succ_del_objs; // 成功删除的对象
};
} // namespace qcloud_cos
#endif // OBJECT_RESP_H