Redland
view release on metacpan or search on metacpan
redland/raptor/src/raptor_www_curl.c view on Meta::CPAN
www->total_bytes += bytes;
return bytes;
}
static size_t
raptor_www_curl_header_callback(void* ptr, size_t size, size_t nmemb,
void *userdata)
{
raptor_www* www=(raptor_www*)userdata;
int bytes=size*nmemb;
/* If WWW has been aborted, return nothing so that
* libcurl will abort the transfer
*/
if(www->failed)
return 0;
if(!strncmp((char*)ptr, "Content-Type: ", 14)) {
int len=bytes-16;
char *type_buffer=(char*)RAPTOR_MALLOC(cstring, len+1);
strncpy(type_buffer, (char*)ptr+14, len);
type_buffer[len]='\0';
www->type=type_buffer;
#if RAPTOR_DEBUG > 2
RAPTOR_DEBUG3("Got content type '%s' (%d bytes)\n", type_buffer, len);
#endif
if(www->content_type)
www->content_type(www, www->content_type_userdata, www->type);
}
return bytes;
}
void
raptor_www_curl_init(raptor_www *www)
{
if(!www->curl_handle) {
www->curl_handle=curl_easy_init();
www->curl_init_here=1;
}
#ifndef CURLOPT_WRITEDATA
#define CURLOPT_WRITEDATA CURLOPT_FILE
#endif
/* send all data to this function */
curl_easy_setopt(www->curl_handle, CURLOPT_WRITEFUNCTION,
raptor_www_curl_write_callback);
/* ... using this data pointer */
curl_easy_setopt(www->curl_handle, CURLOPT_WRITEDATA, www);
/* send all headers to this function */
curl_easy_setopt(www->curl_handle, CURLOPT_HEADERFUNCTION,
raptor_www_curl_header_callback);
/* ... using this data pointer */
curl_easy_setopt(www->curl_handle, CURLOPT_WRITEHEADER, www);
/* Make it follow Location: headers */
curl_easy_setopt(www->curl_handle, CURLOPT_FOLLOWLOCATION, 1);
#if RAPTOR_DEBUG > 2
curl_easy_setopt(www->curl_handle, CURLOPT_VERBOSE, (void*)1);
#endif
curl_easy_setopt(www->curl_handle, CURLOPT_ERRORBUFFER, www->error_buffer);
}
void
raptor_www_curl_free(raptor_www *www)
{
/* only tidy up if we did all the work */
if(www->curl_init_here && www->curl_handle) {
curl_easy_cleanup(www->curl_handle);
www->curl_handle=NULL;
}
}
int
raptor_www_curl_fetch(raptor_www *www)
{
struct curl_slist *slist=NULL;
if(www->user_agent)
curl_easy_setopt(www->curl_handle, CURLOPT_USERAGENT, www->user_agent);
/* Insert HTTP Accept: header only */
if(www->http_accept) {
slist=curl_slist_append(slist, (const char*)www->http_accept);
curl_easy_setopt(www->curl_handle, CURLOPT_HTTPHEADER, slist);
}
/* specify URL to get */
curl_easy_setopt(www->curl_handle, CURLOPT_URL,
raptor_uri_as_string(www->uri));
if(curl_easy_perform(www->curl_handle)) {
/* failed */
www->failed=1;
raptor_www_error(www, www->error_buffer);
} else {
long lstatus;
#ifndef CURLINFO_RESPONSE_CODE
#define CURLINFO_RESPONSE_CODE CURLINFO_HTTP_CODE
#endif
/* Requires pointer to a long */
if(curl_easy_getinfo(www->curl_handle, CURLINFO_RESPONSE_CODE, &lstatus) == CURLE_OK)
www->status_code=lstatus;
}
if(slist)
( run in 3.659 seconds using v1.01-cache-2.11-cpan-364913b4093 )