RestfulApiCommon.h (344 lines of code) (raw):
#ifndef __LOGV6_RESTFULAPI_COMMON_H__
#define __LOGV6_RESTFULAPI_COMMON_H__
#include <string>
#include <vector>
#include <map>
#include "stdint.h"
namespace aliyun_log_sdk_v6
{
extern const char * const DATE_FORMAT_RFC822;// "%a, %d %b %Y %H:%M:%S GMT" ///<RFC822 date formate, GMT time.
//typedef enum {REQUEST_GET= 1, REQUEST_POST } LOG_Request_Mode;///<Http Request Method.
typedef enum {CURSOR_MODE_BEGIN = 1, CURSOR_MODE_END} LOG_Cursor_Mode;
const uint32_t LOG_REQUEST_TIMEOUT = 20; //second
extern const char* const LOG_HEADSIGNATURE_PREFIX;///< "";
extern const char* const LOGE_REQUEST_ERROR;//= "RequestError";
extern const char* const LOGE_INVALID_HOST;//= "InvalidHost"
extern const char* const LOGE_UNKNOWN_ERROR;//= "UnknownError";
extern const char* const LOGE_NOT_IMPLEMENTED;//= "NotImplemented";
extern const char* const LOGE_SERVER_BUSY;//= "ServerBusy";
extern const char* const LOGE_INTERNAL_SERVER_ERROR;//= "InternalServerError";
extern const char* const LOGE_RESPONSE_SIG_ERROR;//= "ResponseSignatureError";
extern const char* const LOGE_PARAMETER_INVALID;//= "ParameterInvalid";
extern const char* const LOGE_MISSING_PARAMETER;//= "MissingParameter";
extern const char* const LOGE_INVALID_METHOD;//= "InvalidMethod";
extern const char* const LOGE_INVALID_CONTENTTYPE;//= "InvalidContentType";
extern const char* const LOGE_INVALID_CONTENTLENGTH;//= "InvalidContentLength";
extern const char* const LOGE_BAD_RESPONSE;//= "BadResponse";
extern const char* const LOGE_UNAUTHORIZED;//= "Unauthorized";
extern const char* const LOGE_QUOTA_EXCEED;//= "ExceedQuota";
extern const char* const LOGE_REQUEST_TIMEOUT;//= "RequestTimeout";
extern const char* const LOGE_CLIENT_OPERATION_TIMEOUT;//= "ClientOpertaionTimeout";
extern const char* const LOGE_CLIENT_NETWORK_ERROR;//= "ClientNetworkError";
extern const char* const LOGE_USER_NOT_EXIST;//= "UserNotExist";
extern const char* const LOGE_CATEGORY_NOT_EXIST;//= "CategoryNotExist";
extern const char* const LOGE_TOPIC_NOT_EXIST;//= "TopicNotExist";
extern const char* const LOGE_POST_BODY_INVALID;//= "PostBodyInvalid";
extern const char* const LOGE_INVALID_HOST;//= "InvalidHost";
extern const char* const LOGE_INVALID_APIVERSION;//="InvalidAPIVersion";
extern const char* const LOGE_PROJECT_NOT_EXIST;//="ProjectNotExist";
extern const char* const LOGE_LOGSTORE_NOT_EXIST;//="LogStoreNotExist";
extern const char* const LOGE_INVALID_ACCESSKEYID;//="InvalidAccessKeyId";
extern const char* const LOGE_SIGNATURE_NOT_MATCH;//="SignatureNotMatch";
extern const char* const LOGE_PROJECT_FORBIDDEN;//="ProjectForbidden";
extern const char* const LOGE_WRITE_QUOTA_EXCEED;//="WriteQuotaExceed";
extern const char* const LOGE_READ_QUOTA_EXCEED;//="ReadQuotaExceed";
extern const char* const LOGE_REQUEST_TIME_EXPIRED;//="RequestTimeExpired";
extern const char* const LOGE_INVALID_REQUEST_TIME;//="InvalidRequestTime";
extern const char* const LOGE_POST_BODY_TOO_LARGE;//="PostBodyTooLarge";
extern const char* const LOGE_INVALID_TIME_RANGE;//="InvalidTimeRange";
extern const char* const LOGE_INVALID_REVERSE;//="InvalidReverse";
extern const char* const LOGE_LOGSTORE_WITHOUT_SHARD;//="LogStoreWithoutShard";
extern const char* const LOGSTORES;//= "/logstores"
extern const char* const SHARDS;//= "/shards"
extern const char* const INDEX;//= "/index"
extern const char* const CONFIGS;//= "/configs"
extern const char* const MACHINES;//= "/machines"
extern const char* const MACHINEGROUPS;//= "/machinegroups"
extern const char* const ACLS;//= "/acls"
extern const char* const HTTP_GET;//= "GET";
extern const char* const HTTP_POST;//= "POST";
extern const char* const HTTP_PUT;//= "PUT";
extern const char* const HTTP_DELETE;//= "DELETE";
extern const char* const HOST;//= "Host";
extern const char* const DATE;//= "Date";
extern const char* const USER_AGENT;//= "User-Agent";
extern const char* const LOG_HEADER_PREFIX;//= "x-log-";
extern const char* const X_LOG_APIVERSION;// = "x-log-apiversion";
extern const char* const X_LOG_COMPRESSTYPE;// = "x-log-compresstype";
extern const char* const X_LOG_BODYRAWSIZE;// = "x-log-bodyrawsize";
extern const char* const X_LOG_SIGNATUREMETHOD;// = "x-log-signaturemethod";
extern const char* const X_ACS_SECURITY_TOKEN;// = "x-acs-security-token";
extern const char* const X_LOG_CURSOR;// = "cursor";
extern const char* const X_LOG_REQUEST_ID;// = "x-log-requestid";
extern const char* const X_LOG_PROGRESS;// = "x-log-progress";
extern const char* const X_LOG_COUNT;// = "x-log-count";
extern const char *const X_LOG_PROCESSED_ROWS; // = "x-log-processoed-rows";
extern const char *const X_LOG_ELASPED_MILLISECOND; // = "x-log-elapsed-millisecond";
extern const char *const X_LOG_CPU_SEC; // = "x-log-cpu-sec";
extern const char *const X_LOG_CPU_CORES; // = "x-log-cpu-cores";
extern const char* const HTTP_ACCEPT;// = "accept";
extern const char* const DEFLATE;//= "deflate";
extern const char* const HMAC_SHA1;//= "hmac-sha1";
extern const char* const CONTENT_LENGTH;//= "Content-Length";
extern const char* const CONTENT_TYPE;//= "Content-Type";
extern const char* const CONTENT_MD5;//= "Content-MD5";
extern const char* const AUTHORIZATION;//= "Authorization";
extern const char* const SIGNATURE;//= "Signature";
extern const char* const ACCEPT_ENCODING;// = "Accept-Encoding";
extern const char* const ENCONDING_GZIP;// = "gzip";
extern const char* const TYPE_LOG_PROTOBUF;//="application/x-protobuf";
extern const char* const TYPE_LOG_JSON;//="application/json";
extern const char* const LOGITEM_TIME_STAMP_LABEL;//="__time__";
extern const char* const LOGITEM_SOURCE_LABEL;//="__source__";
extern const char* const LOG_API_VERSION; // = "0.4.0";
extern const char* const LOG_TYPE_CURSOR;// = "cursor";
extern const char* const LOG_TYPE;// = "type";
extern const char* const LOGE_NOT_SUPPORTED_ACCEPT_CONTENT_TYPE;
extern const char* const LOGE_NOT_SUPPORTED_ACCEPT_ENCODING;
extern const char* const LOGE_SHARD_NOT_EXIST;
extern const char* const LOGE_INVALID_CURSOR;
extern const char* const LOGE_SHARD_WRITE_QUOTA_EXCEED;
extern const char* const LOGE_SHARD_READ_QUOTA_EXCEED;
extern const char* const LOG_LZ4;//= "lz4";
extern const char* const LOG_ERROR_CODE;//= "errorCode";
extern const char* const LOG_ERROR_MESSAGE;//= "errorMessage";
extern const char* const LOG_SHARD_STATUS_READWRITE;// "readwrite";
extern const char* const LOG_SHARD_STATUS_READONLY ;// "readonly";
/**
*This class enumerates LOG ErrorCode with HTTP status.
*/
class Status
{
private:
Status(int32_t para_statusCode, const std::string& para_errorCode)
:statusCode(para_statusCode), errorCode(para_errorCode)
{
}
public:
const int32_t statusCode;///<Normally this is the HTTP status code.
const std::string errorCode;///<This is the LOG error code.
bool IsSuccess() const
{
return statusCode == 200;
}
bool IsTimeOutError() const
{
return statusCode == 1001;
}
bool IsServerError() const
{
return statusCode == 500;
}
bool IsNotFound() const
{
return statusCode == 404;
}
static Status Ok()
{
return Status(200 /* HTTP_OK */, "");
}
static Status NotSupportedAcceptEncoding()
{
return Status(400, LOGE_NOT_SUPPORTED_ACCEPT_ENCODING);
}
static Status NotSupportedAcceptContentType()
{
return Status(400, LOGE_NOT_SUPPORTED_ACCEPT_CONTENT_TYPE);
}
static Status LogStoreWithoutShard()
{
return Status(400, LOGE_LOGSTORE_WITHOUT_SHARD);
}
static Status ShardNotExist()
{
return Status(404, LOGE_SHARD_NOT_EXIST);
}
static Status InvalidCursor()
{
return Status(400, LOGE_INVALID_CURSOR);
}
/** Function that get UnknownError definition.
* @param void None.
* @return Get UnknownError error code with http status code.
*/
static Status UnknownError()
{
return Status(500 /* HTTP_INTERNAL_SERVER_ERROR */, LOGE_UNKNOWN_ERROR);
}
/** Function that get InternalServerError definition.
* @param void None.
* @return Get InternalServerError error code with http status code.
*/
static Status InternalServerError()
{
return Status(500 /* HTTP_INTERNAL_SERVER_ERROR */, LOGE_INTERNAL_SERVER_ERROR);
}
/** Function that get NotImplemented definition.
* @param void None.
* @return Get NotImptemented error code with http status code.
*/
static Status NotImplemented()
{
return Status(501 /* HTTP_NOT_IMPLEMENTED */, LOGE_NOT_IMPLEMENTED);
}
/** Function that get PostBodyInvalid definition.
* @param void None.
* @return Get PostBodyInvalid error code with http status code.
*/
static Status PostBodyInvalid()
{
return Status(400 /* HTTP_BAD_REQUEST */, LOGE_POST_BODY_INVALID);
}
/** Function that get ParameterInvalid definition.
* @param void None.
* @return Get ParameterInvalid error code with http status code.
*/
static Status ParameterInvalid()
{
return Status(400 /* HTTP_BAD_REQUEST */, LOGE_PARAMETER_INVALID);
}
/** Function that get MissingParameter definition.
* @param void None.
* @return Get MissingParameter error code with http status code.
*/
static Status MissingParameter()
{
return Status(400 /* HTTP_BAD_REQUEST */, LOGE_MISSING_PARAMETER);
}
/** Function that get InvalidContentType definition.
* @param void None.
* @return Get InvalidContentType error code with http status code.
*/
static Status InvalidContentType()
{
return Status(400 /* HTTP_BAD_REQUEST */, LOGE_INVALID_CONTENTTYPE);
}
/** Function that get Invalid definition.
* @param void None.
* @return Get InvalidMethod error code with http status code.
*/
static Status InvalidMethod()
{
return Status(405 /* METHOD_NOT_ALLOWED */, LOGE_INVALID_METHOD);
}
/** Function that get ServerBusy definition.
* @param void None.
* @return Get ServerBusy error code with http status code.
*/
static Status ServerBusy()
{
return Status(500 /* HTTP_INTERNAL_SERVER_ERROR */, LOGE_SERVER_BUSY);
}
/** Function that get UnAuthorized definition.
* @param void None.
* @return Get UnAuthorized error code with http status code.
*/
static Status UnAuthorized()
{
return Status(401 /* HTTP_UNAUTHORIZED */, LOGE_UNAUTHORIZED);
}
/** Function that get ExceedQuota definition.
* @param void None.
* @return Get ExceedQuota error code with http status code.
*/
static Status QuotaExceed()
{
return Status(403 /* HTTP_FORBIDDEN */, LOGE_QUOTA_EXCEED);
}
/** Function that get UserNotExist definition.
* @param void None.
* @return Get UserNotExist code with http status code.
*/
static Status UserNotExist()
{
return Status(404 /* HTTP_NOT_FOUND */, LOGE_USER_NOT_EXIST);
}
/** Function that get ProjectNotExist definition.
* * @param void None.
* * @return Get LogStoreNotExist code with http status code.
* */
static Status ProjectNotExist()
{
return Status(404 /* HTTP_NOT_FOUND */, LOGE_PROJECT_NOT_EXIST);
}
/** Function that get LogStoreNotExist definition.
* * @param void None.
* * @return Get LogStoreNotExist code with http status code.
* */
static Status LogStoreNotExist()
{
return Status(404 /* HTTP_NOT_FOUND */, LOGE_LOGSTORE_NOT_EXIST);
}
/** Function that get CategoryNotExist definition.
* @param void None.
* @return Get CategoryNotExist code with http status code.
*/
static Status CategoryNotExist()
{
return Status(404 /* HTTP_NOT_FOUND */, LOGE_CATEGORY_NOT_EXIST);
}
/** Function that get TopicNotExist definition.
* @param void None.
* @return Get TopicNotExist error code with http status code.
*/
static Status TopicNotExist()
{
return Status(404 /* HTTP_NOT_FOUND */, LOGE_TOPIC_NOT_EXIST);
}
/** Function that get ClientOperationTimeout definition.
* @param void None.
* @return Get ClientOperationTimeout error code with http status code.
*/
static Status ClientOperationTimeout()
{
return Status(1001 /* CLIENT OPERATION TIMEOUOT */, LOGE_CLIENT_OPERATION_TIMEOUT);
}
/** Function that get ProjectForbidden definition.
* @param void None.
* @return Get ProjectForbidden code with http status code.
*/
static Status ProjectForbidden()
{
return Status(403 /* HTTP_FORBIDDEN */, LOGE_PROJECT_FORBIDDEN);
}
static Status ShardWriteQuotaExceed()
{
return Status(403 /* HTTP_FORBIDDEN */, LOGE_SHARD_WRITE_QUOTA_EXCEED);
}
static Status ShardReadQuotaExceed()
{
return Status(403 /* HTTP_FORBIDDEN */, LOGE_SHARD_READ_QUOTA_EXCEED);
}
/** Function that get WriteQuotaExceed definition.
* @param void None.
* @return Get WriteQuotaExceed code with http status code.
*/
static Status WriteQuotaExceed()
{
return Status(403 /* HTTP_FORBIDDEN */, LOGE_WRITE_QUOTA_EXCEED);
}
/** Function that get ReadQuotaExceed definition.
* @param void None.
* @return Get ReadQuotaExceed code with http status code.
*/
static Status ReadQuotaExceed()
{
return Status(403 /* HTTP_FORBIDDEN */, LOGE_READ_QUOTA_EXCEED);
}
/** Function that get InvalidHost definition.
* @param void None.
* @return Get InvalidHost code with http status code.
*/
static Status InvalidHost()
{
return Status(400 /* HTTP_BAD_REQUEST */, LOGE_INVALID_HOST);
}
/** Function that get InvalidContentLength definition.
* @param void None.
* @return Get InvalidContentLength code with http status code.
*/
static Status InvalidContentLength()
{
return Status(400 /* HTTP_BAD_REQUEST */, LOGE_INVALID_CONTENTLENGTH);
}
/** Function that get InvalidAPIVersion definition.
* @param void None.
* @return Get InvalidAPIVersion code with http status code.
*/
static Status InvalidAPIVersion()
{
return Status(400 /* HTTP_BAD_REQUEST */, LOGE_INVALID_APIVERSION);
}
/** Function that get InvalidAccessKeyId definition.
* @param void None.
* @return Get InvalidAccessKeyId code with http status code.
*/
static Status InvalidAccessKeyId()
{
return Status(401 /* HTTP_UNAUTHORIZED */, LOGE_INVALID_ACCESSKEYID);
}
/** Function that get RequestTimeExpired definition.
* @param void None.
* @return Get RequestTimeExpired code with http status code.
*/
static Status RequestTimeExpired()
{
return Status(400 /* HTTP_BAD_REQUEST */, LOGE_REQUEST_TIME_EXPIRED);
}
/** Function that get InvalidRequestTime definition.
* @param void None.
* @return Get InvalidRequestTime code with http status code.
*/
static Status InvalidRequestTime()
{
return Status(400 /* HTTP_BAD_REQUEST */, LOGE_INVALID_REQUEST_TIME);
}
/** Function that get PostBodyTooLarge definition.
* @param void None.
* @return Get PostBodyTooLarge code with http status code.
*/
static Status PostBodyTooLarge()
{
return Status(413 /* HTTP_REQUEST_ENTITY_TOO_LARGE */, LOGE_POST_BODY_TOO_LARGE);
}
/** Function that get InvalidTimeRange definition.
* @param void None.
* @return Get InvalidTimeRange code with http status code.
*/
static Status InvalidTimeRange()
{
return Status(400 /* HTTP_BAD_REQUEST */, LOGE_INVALID_TIME_RANGE);
}
/** Function that get InvalidReverse definition.
* @param void None.
* @return Get InvalidReverse code with http status code.
*/
static Status InvalidReverse()
{
return Status(400 /* HTTP_BAD_REQUEST */, LOGE_INVALID_REVERSE);
}
/** Function that get SignatureNotMatch definition.
* @param void None.
* @return Get SignatureNotMatch code with http status code.
*/
static Status SignatureNotMatch()
{
return Status(401 /* HTTP_UNAUTHORIZED */, LOGE_SIGNATURE_NOT_MATCH);
}
};
/**
* HTTP message structure includes three parts: http status code, http header, and http content.
*/
typedef struct HttpMessage
{
int32_t statusCode = -1;///<Http status code
std::map<std::string,std::string> header;///<Only contains the header lines which have key:value pair
std::string content;///<Http content
/** Constructor with no parameter.
* @param void None.
* @return The objcect pointer.
*/
HttpMessage()
{
}
/** Constructor with header and content.
* @param para_header A map structure which contains the key:value pair of http header lines.
Those header lines which do not contains key:value pair are not included.
* @param para_content A string which contains the content of http request.
* @return The objcect pointer.
*/
HttpMessage(const std::map<std::string, std::string>& para_header, const std::string& para_content)
:header(para_header), content(para_content)
{
}
/** Constructor with status code, header and content.
* @param para_statusCode Http status code.
* @param para_header A map structure which contains the key:value pair of http header lines.
Those header lines which do not contains key:value pair are not included.
* @param para_content A string which contains the http content of http content.
* @return The objcect pointer.
*/
HttpMessage(const int32_t para_statusCode, const std::map<std::string, std::string>& para_header, const std::string& para_content)
:statusCode(para_statusCode), header(para_header), content(para_content)
{
}
void FillResponse(const int32_t para_statusCode, const std::string& para_content)
{
statusCode = para_statusCode;
content = para_content;
}
}HttpMessage;
/**
*LOG Exception includes an error code and a detail message.
*/
class LOGException : public std::exception
{
/** Constructor with error code and message.
* @param errorCode LOG error code.
* @param message Detailed information for the exception.
* @return The objcect pointer.
*/
public:
LOGException()
{
mHttpCode = 0;
}
LOGException(const std::string& errorCode, const std::string& message, const std::string& requestId="", const int32_t httpCode=0)
:mErrorCode(errorCode),mMessage(message),mRequestId(requestId),mHttpCode(httpCode)
{
}
~LOGException() throw()
{
}
/** Function that return error code.
* @param void None.
* @return Error code string.
*/
std::string GetErrorCode(void) const
{
return mErrorCode;
}
/** Function that return error message.
* @param void None.
* @return Error message string.
*/
std::string GetMessage(void) const
{
return mMessage;
}
/** Function that return request id.
* @param void None.
* @return request id string.
*/
std::string GetRequestId(void) const
{
return mRequestId;
}
/** Function that return http response code.
* @param void None.
* @return http response code int32_t, if client error, return 0.
*/
int32_t GetHttpCode(void) const
{
return mHttpCode;
}
private:
std::string mErrorCode;
std::string mMessage;
std::string mRequestId;
int32_t mHttpCode;
};
}
#endif