OSSClient is used to manage Object Storage Service (OSS) resources such as buckets and objects. To use OSS SDK for C++ to initiate a request, you must initialize an OSSClient instance and modify the default configuration items of ClientConfiguration.

Configure the OSSClient instance

ClientConfiguration is a configuration class of OSSClient. You can use ClientConfiguration to configure parameters such as userAgent, connectTimeoutMs, and maxConnections. The following table describes parameters that you can configure by using ClientConfiguration.
Parameter Description
userAgent The user agent (the User-Agent field in the HTTP header). Default value: aliyun-sdk-cpp/1.X.X.
maxConnections The maximum number of connections. Default value: 16.
requestTimeoutMs The request timeout period. Unit: milliseconds. The connection is closed if no data is received during the timeout period. Default value: 10000. Unit: milliseconds.
connectTimeoutMs The timeout period to establish a connection. Default value: 5000. Unit: milliseconds.
retryStrategy The maximum number of allowed retry attempts in the case of a request error.
proxyScheme The proxy protocol. Default value: HTTP.
proxyPort The port that is used to connect to the proxy server.
proxyPassword The password that is used to log on to the proxy server.
proxyUserName The username that is used to log on to the proxy server.
verifySSL Specifies whether to enable SSL-based authentication. By default, SSL-based authentication is disabled.
Note By default, SSL-based authentication is enabled in OSS SDK for C++ V1.8.2 or later.
caPath The root path of the CA certificate. This parameter is valid when verifySSL is set to true. This parameter is empty by default.
caFile The path of the CA certificate. This parameter is valid when verifySSL is set to true. This parameter is empty by default.
enableCrc64 Specifies whether to enable CRC-64. By default, CRC-64 is enabled.
enableDateSkewAdjustment Specifies whether to enable the automatic correction of HTTP request time. By default, the automatic correction of HTTP request time is enabled.
sendRateLimiter The limit of the upload speed. Unit: KB/s.
recvRateLimiter The limit of the download speed. Unit: KB/s.

Configure a timeout period

The following code provides an example on how to configure a timeout period:
#include <alibabacloud/oss/OssClient.h>

using namespace AlibabaCloud::OSS;

int main(void)
{

    /* Initialize resources such as networks. */
    InitializeSdk();
    ClientConfiguration conf;

    /* Specify the maximum number of connections. The default value is 16. */
    conf.maxConnections = 20;

    /* Specify the request timeout period in milliseconds. The connection is closed if no data is received during the timeout period. The default value is 10000. */
    conf.requestTimeoutMs = 8000;

    /* Specify the timeout period in milliseconds to establish a connection. The default value is 5000. */
    conf.connectTimeoutMs = 8000;

    OssClient client(Endpoint, AccessKeyId, AccessKeySecret, conf);

    /* Release resources such as networks. */
    ShutdownSdk();
    return 0;
}

Configure SSL-based authentication

By default, SSL-based authentication is enabled in OSS SDK for C++ V1.8.2 or later. If SSL-based authentication fails, you must set the correct path of the SSL certificate, or disable SSL-based authentication.

The following code provides an example on how to configure SSL-based authentication:

#include <alibabacloud/oss/OssClient.h>
using namespace AlibabaCloud::OSS;

int main(void)
{

    /* Initialize resources such as networks. */
    InitializeSdk();
    ClientConfiguration conf;

    /* Configure SSL-based authentication. The default value is true, which indicates that SSL-based authentication is enabled. */
    conf.verifySSL = true;

    /* Specify the root path of the CA certificate. This parameter is valid when verifySSL is set to true. This parameter is empty by default. */
    conf.caPath = "/etc/ssl/certs/";

    /* Specify the path of the CA certificate. This parameter is valid when verifySSL is set to true. This parameter is empty by default. */
    conf.caFile = "/etc/ssl/certs/ca-certificates.crt";;

    OssClient client(Endpoint, AccessKeyId, AccessKeySecret, conf);

    /* Release resources such as networks. */
    ShutdownSdk();
    return 0;
}

Configure bandwidth throttling

The following code provides an example on how to configure bandwidth throttling for uploads and downloads:
#include <alibabacloud/oss/OssClient.h>
#include <alibabacloud/oss/client/RateLimiter.h>

using namespace AlibabaCloud::OSS;

class  UserRateLimiter : public RateLimiter
{
public:
    UserRateLimiterr() :rate_(0) {};
    ~UserRateLimiterr() {};
    virtual void setRate(int rate) { rate_ = rate; };
    virtual int Rate() const { return rate_; };
private:
    int rate_;
};

int main(void)
{
    /* Initialize the information about the account that is used to access OSS. */
    std::string AccessKeyId = "yourAccessKeyId";
    std::string AccessKeySecret = "yourAccessKeySecret";
    std::string Endpoint = "yourEndpoint";
    std::string BucketName = "yourBucketName";
    std::string ObjectName = "yourObjectName";

    /* Initialize resources such as networks. */
    InitializeSdk();

    ClientConfiguration conf;

    auto sendrateLimiter = std::make_shared<UserRateLimiter>();
    auto recvrateLimiter = std::make_shared<UserRateLimiter>();
    conf.sendRateLimiter = sendrateLimiter;
    conf.recvRateLimiter = recvrateLimiter;

    OssClient client(Endpoint, AccessKeyId, AccessKeySecret, conf);

    /* Configure bandwidth throttling for the download. Unit: KB/s. */
    recvrateLimiter->setRate(256);

    /* Configure bandwidth throttling for the upload. Unit: KB/s. */
    sendrateLimiter->setRate(256);

    /* Upload the object. */
    auto outcome = client.PutObject(BucketName, ObjectName,"yourLocalFilename");  

    /* Update the speed limit during the upload. Unit: KB/s. */
    sendrateLimiter->setRate(300);

    /* Release resources such as networks. */
    ShutdownSdk();
    return 0;
}

Configure a retry policy

The following code provides an example on how to configure a retry policy:

#include <alibabacloud/oss/OssClient.h>
#include <alibabacloud/oss/client/RetryStrategy.h>

using namespace AlibabaCloud::OSS;

class UserRetryStrategy : public RetryStrategy
{
public:

    /* maxRetries indicates the maximum number of allowed retry attempts. scaleFactor indicates the factor that is used to calculate the time to wait before a retry is attempted. */
    UserRetryStrategy(long maxRetries = 3, long scaleFactor = 300) :
        m_scaleFactor(scaleFactor), m_maxRetries(maxRetries)  
    {}

    /* You can define the shouldRetry function to determine whether to retry a request. */
    bool shouldRetry(const Error & error, long attemptedRetries) const;

    /* You can define the calcDelayTimeMs function to calculate the time to wait before a retry is attempted. */
    long calcDelayTimeMs(const Error & error, long attemptedRetries) const;

private:
    long m_scaleFactor;
    long m_maxRetries;
};

bool UserRetryStrategy::shouldRetry(const Error & error, long attemptedRetries) const
{    
    if (attemptedRetries >= m_maxRetries)
        return false;

    long responseCode = error.Status();

    //http code
    if ((responseCode == 403 && error.Message().find("RequestTimeTooSkewed") != std::string::npos) ||
        (responseCode > 499 && responseCode < 599)) {
        return true;
    }
    else {
        switch (responseCode)
        {
        //curl error code
        case (ERROR_CURL_BASE + 7):  //CURLE_COULDNT_CONNECT
        case (ERROR_CURL_BASE + 18): //CURLE_PARTIAL_FILE
        case (ERROR_CURL_BASE + 23): //CURLE_WRITE_ERROR
        case (ERROR_CURL_BASE + 28): //CURLE_OPERATION_TIMEDOUT
        case (ERROR_CURL_BASE + 52): //CURLE_GOT_NOTHING
        case (ERROR_CURL_BASE + 55): //CURLE_SEND_ERROR
        case (ERROR_CURL_BASE + 56): //CURLE_RECV_ERROR
            return true;
        default:
            break;
        };
    }

    return false;
}

long UserRetryStrategy::calcDelayTimeMs(const Error & error, long attemptedRetries) const
{
    UNUSED_PARAM(error);
    return (1 << attemptedRetries) * m_scaleFactor;
}

int main(void)
{
    /* Initialize resources such as networks. */
    InitializeSdk();

    ClientConfiguration conf;

    /* Configure the maximum number of allowed retry attempts in the case of a request error. The default value is 3. */
    auto defaultRetryStrategy = std::make_shared<UserRetryStrategy>(5);
    conf.retryStrategy = defaultRetryStrategy;

    OssClient client(Endpoint, AccessKeyId, AccessKeySecret, conf);

    /* Release resources such as networks. */
    ShutdownSdk();
    return 0;
}