OSSClient is used to manage 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 host proxies, connection timeout periods, and the maximum number of connections. The following table describes the parameters you can configure for ClientConfiguration.
Parameter Description
userAgent The user agent (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. Default value: 10000.
connectTimeoutMs The timeout period to establish a connection, in milliseconds. Default value: 5000.
retryStrategy The maximum number of retry attempts in the case of a request error.
proxyScheme The proxy protocol. Default value: 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 Specifies whether SSL-based authentication is enabled. By default, SSL-based authentication is disabled.
Note By default, SSL-based authentication is enabled for OSS SDK for C++ V1.8.2 or later.
caPath The root path of the CA certificate. When verifySSL is set to true, this parameter is valid. This parameter is empty by default.
caFile The path of the CA certificate. When verifySSL is set to true, this parameter is valid. This parameter is empty by default.
enableCrc64 Specifies whether to enable CRC-64. By default, CRC-64 is enabled.
enableDateSkewAdjustment Specifies 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 SSL-based authentication

By default, SSL-based authentication is enabled for OSS SDK for C++ V1.8.2 or later. If SSL-based authentication fails, you need to 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 network resources. */
    InitializeSdk();
    ClientConfiguration conf;

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

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

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

    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 the speed limit 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 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 network resources. */
    ShutdownSdk();
    return 0;
}