cURL / Mailing Lists / curl-library / Single Mail

curl-library

Problem wirth libcurl and write_function

From: Thaorius <thaorius_at_thaorius.com>
Date: Mon, 21 May 2007 00:38:05 +0200

Hi, in my last program I kinda needed libcurl, so I read the docs and
everything. In one part it says that curl needs me to implement a data
writting function. I wrote one. The problem is that if the HTTP server
output is less than 8 bytes(without the headers), one of the following
things happens:

1) Random characters appears til the 8 bytes al fulfilled.
2) The program crashes on the call to curl_easy_perform().

This is my write function:

size_t PlatformInterface::_curl_write(void *buffer, size_t size, size_t
nmemb, void *userp)
{
char *temp = (char *)malloc((size * nmemb) + 1);
memcpy(temp, buffer, (size * nmemb));
temp[(size * nmemb) + 1] = '\0';
((std::string *)userp)->append((char *)temp);

return size * nmemb;
}

Is an static class, where userp is a pointer to an std::string object.

This is the function that handles the curl execution:

std::string PlatformInterface::execute( std::string cid, std::string params,
bool onPlatformServer, bool zerolid )
{
// Clear the buffer
tmp.clear();

// Setup HTTP headers
struct curl_slist *headers=NULL;
headers = curl_slist_append(headers, "User-Agent: TDTClient/1.0
Compatible");
curl_easy_setopt(handle, CURLOPT_HTTPHEADER, headers);

// Setup url
char url[1024] = "http:// <http:///>";
strcat(url, gateway.c_str());
strcat(url, path.c_str());
strcat(url, (onPlatformServer ? platformServer.c_str() : loginServer.c_str
()));
strcat(url, "?cid=");
strcat(url, cid.c_str());

if(onPlatformServer)
{
strcat(url, "&lid=");
if(!zerolid)
strcat(url, lid.c_str());
else
strcat(url, "zerolid");
}

if(params != "")
{
char *old = (char *)params.c_str();
replace(old, " ", "%20");
strcat(url, "&");
strcat(url, old);
}

curl_easy_setopt(handle, CURLOPT_URL, &url);

// Perform the request
CURLcode ret = curl_easy_perform(handle);

// Free headers
curl_slist_free_all(headers);

// Setup PlatformStatus and return data
if(ret == CURLE_OK) {
PlatformStatusFactory::getStatus(PL_SUCCESS, PL_NO_ERROR,
"PlatformInterface::execute");
return tmp;
} else
PlatformStatusFactory::getStatus(PL_ERROR, PL_CURL_ERROR,
"PlatformInterface::execute", std::string(curlError));

return "";
}

Does anyone know whats wrong in _curl_write()?

Thanks

-- 
Thaorius
Received on 2007-05-21