OSSClient is used to manage OSS resources such as buckets and objects. When you use SDK for C++ to initiate a request, you must initialize an OSSClient instance. Modify the default configuration items of ClientConfiguration as needed.

Configure the OSSClient instance

ClientConfiguration is a configuration class of OSSClient. You can use ClientConfiguration to configure parameters such as proxies, connection timeout, and the maximum number of connections. The following table describes the parameters you can configure for ClientConfiguration.
Parameter Description
userAgent The user agent, that is, the User-Agent field in the HTTP header. The default value is aliyun-sdk-cpp/1.X.X.
maxConnections The maximum number of connections. The default value is 16.
requestTimeoutMs The request timeout period, in milliseconds. The connection is closed if no data is received during the timeout period. The default value is 10000.
connectTimeoutMs The timeout period to establish a connection, in milliseconds. The default value is 5000.
retryStrategy The maximum number of retry attempts in the case of a request error.
proxyScheme The proxy protocol. The default value is HTTP.
proxyPort The port for the proxy server.
proxyPassword The password verified by the proxy server.
proxyUserName The username verified by the proxy server.
verifySSL Indicates whether to enable SSL-based authentication. By default, SSL-based authentication is disabled.
enableCrc64 Indicates whether to enable CRC-64. By default, CRC-64 is enabled.
enableDateSkewAdjustment Indicates whether to enable automatic correction of the HTTP request time. By default, automatic correction of the HTTP request time is enabled.
sendRateLimiter The limit to the upload speed. Unit: KB/s.
recvRateLimiter The limit to 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 network resources. */
    InitializeSdk();
    ClientConfiguration conf;

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

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

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

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

    /* Release network resources. */
    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:
    DefaultRateLimiter() :rate_(0) {};
    ~DefaultRateLimiter() {};
    virtual void setRate(int rate) { rate_ = rate; };
    virtual int Rate() const { return rate_; };
private:
    int rate_;
};

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

    /* Initialize network resources. */
    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 bandwidth throttling for the upload during the upload. Unit: KB/s. */
    sendrateLimiter->setRate(300);

    /* Release network resources. */
    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 retry attempts. scaleFactor indicates the factor that is used to calculate the waiting time of a retry attempt. */
    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 waiting time of a retry attempt. */
    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 network resources. */
    InitializeSdk();

    ClientConfiguration conf;

    /* Configure the maximum number of 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 network resources. */
    ShutdownSdk();
    return 0;
}