Hi!

I'm trying to turn a (working) command-line call to curl into an equivalent
c++ program.

The following command line I was able to translate into c++

curl --location --request POST 'https://servername.domain/token' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 'client_id=ie_client' \
--data-urlencode 'client_secret=*secret_code*' \
--data-urlencode 'grant_type=client_credentials' 2>/dev/null

Translated to c++, this became

bool getToken( std::string & token ) {

    CURL * curl;
    CURLcode res;

    std::string json_record;

    curl = curl_easy_init();

    if ( curl ) {

        curl_easy_setopt( curl, CURLOPT_URL, "
https://servername.domain/token"; );
        curl_easy_setopt( curl, CURLOPT_HEADER, "Content-Type:
application/x-www-form-urlencoded" );
        curl_easy_setopt( curl, CURLOPT_POST, 1L );

        curl_easy_setopt( curl, CURLOPT_WRITEFUNCTION, token_callback );
        curl_easy_setopt( curl, CURLOPT_WRITEDATA, &json_record );

        curl_easy_setopt( curl, CURLOPT_POSTFIELDS,
"client_id=ie_client&client_secret=*secret_code*&grant_type=client_credentials"
);

        res = curl_easy_perform( curl );

        curl_easy_cleanup( curl );

        if( CURLE_OK != res ) {

            fprintf( stderr, "curl_easy_perform() failed: %s\n",
curl_easy_strerror( res ));
            return false;

        }

    }

    if ( ! json_record.empty() ) {

        return true;

    }

    return false;

}

The function retrieves data, from which I am able to extract the token.

But it is the second part, using the token that I haven't been able to
translate.

The (working) command-line for that is

curl --location --request POST
https://otherserver.domain/command/nodename?commandId=get-some-data\&mode=sync
--header "Authorization: Bearer *token_retrieved_by_previous_command_line*"

The command-line functions and retrieves the data, no problem.

However, the following code always returns an error message from the server

bool ExecuteCommand( const char * token ) {

    CURL * curl;
    CURLcode res;

    std::string json_record;

    curl = curl_easy_init();

    if ( curl ) {

        curl_easy_setopt( curl, CURLOPT_URL, "
https://otherserver.domain/command/nodename"; );
        curl_easy_setopt( curl, CURLOPT_HEADER, ( (
(std::string)"Authorization: Bearer" ) + token ).c_str() );
        curl_easy_setopt( curl, CURLOPT_POST, 1L );
        curl_easy_setopt( curl, CURLOPT_FOLLOWLOCATION, 1L );

        curl_easy_setopt( curl, CURLOPT_POSTFIELDS,
"commandId=get-some-data&mode=sync" );

        res = curl_easy_perform( curl );

        curl_easy_cleanup( curl );

        if( CURLE_OK != res ) {

            fprintf( stderr, "curl_easy_perform() failed: %s\n",
curl_easy_strerror( res ));
            return false;

        }

    }

    return true;

}

Although the curl_easy_perform call does succeed, the data returned is not
what is expected, it returns

*{"error-code":"Internal Error","error-message":"Content type
'application/x-www-form-urlencoded' not supported","request-id":""}*

What am I doing wrong? Thank you for any help
-- 
Unsubscribe: https://lists.haxx.se/listinfo/curl-library
Etiquette:   https://curl.haxx.se/mail/etiquette.html

Reply via email to