cURL / Mailing Lists / curl-library / Single Mail

curl-library

IMAP not working reliably on Win32/VS2012

From: John Dunn <John_Dunn_at_qscaudio.com>
Date: Mon, 19 Aug 2013 22:01:11 +0000

I'm attempting to use the IMAP support in libcurl 7.32.0 and it doesn't seem very reliable. I'm using a static version of libcurl built with Makefile.vc and VS2012. There seems to be an issue with transfers past a given size. If my url is imaps://imap.gmail.com:993/INBOX/;UID=1;SECTION=TEXT the request seems to be relatively reliable but I do see an occasional timeout. If I attempt to get the entire message without specifying a section with a url like imaps://imap.gmail.com:993/INBOX/;UID=1 I will get a CURLE_OUT_OF_MEMORY error. I've reproduced this behavior using the 7.32 prebuilt WIN32 binaries downloaded from the curl site.

Here's the code I'm using in my app -

#include <curl/curl.h>
#include <stdio.h>

static char data[1024*1024];
static char* write_data;

static void check(CURLcode code)
{
  if( code != CURLE_OK )
  {
    printf("unexpected error before IMAP get\r\n");
    exit(-1);
  }
}

size_t curl_write_function( void *ptr, size_t size, size_t nmemb, void *userptr )
{
  printf("curl_write_function %i %i\r\n", size, nmemb);
  size_t length = size*nmemb;
  memcpy(write_data, ptr, length);
  write_data += length;
  return length;
}

int curl_progress_function(void *clientp, double dltotal, double dlnow, double ultotal, double ulnow)
{
  return 0;
}

int main(int argc, char** argv)
{
  if( argc < 3 )
  {
    printf( "usage <url> <user>:<pass>\r\n");
    exit(0);
  }
  curl_global_init (CURL_GLOBAL_ALL);
  memset( data, 0, sizeof(data));
  write_data = data;

  char error_buffer[1024];
  const char* url = argv[1];
 
  CURL* easy = curl_easy_init();
  check( curl_easy_setopt( easy, CURLOPT_FRESH_CONNECT, 1 ) );
  check( curl_easy_setopt( easy, CURLOPT_URL, url ) );
  check( curl_easy_setopt( easy, CURLOPT_TIMEOUT, 10 ) );
  check( curl_easy_setopt( easy, CURLOPT_WRITEFUNCTION, curl_write_function ) );
  check( curl_easy_setopt( easy, CURLOPT_WRITEDATA, write_data ) );
  check( curl_easy_setopt( easy, CURLOPT_NOSIGNAL, 1 ) );
  check( curl_easy_setopt( easy, CURLOPT_FAILONERROR, 1 ) );
  check( curl_easy_setopt( easy, CURLOPT_FOLLOWLOCATION, 1 ) );
  // enable progress so we can cancel
  check( curl_easy_setopt( easy, CURLOPT_PROGRESSFUNCTION, curl_progress_function ) );
  check( curl_easy_setopt( easy, CURLOPT_NOPROGRESS, 0 ) );

  curl_easy_setopt(easy, CURLOPT_USE_SSL, (long)CURLUSESSL_ALL);
  check( curl_easy_setopt( easy, CURLOPT_SSL_VERIFYPEER, 0 ) );
  check( curl_easy_setopt( easy, CURLOPT_SSL_VERIFYHOST, 0 ) );
  check( curl_easy_setopt( easy, CURLOPT_ERRORBUFFER, error_buffer ) );

  char* credentials = argv[2];
  check( curl_easy_setopt( easy, CURLOPT_USERPWD, credentials ));
  CURLcode cc = curl_easy_perform(easy);

  if( cc != CURLE_OK )
  {
    printf( "error %s", error_buffer);
  }
  else
  {
    printf( "data %s", data);
  }
  return 0;
}

-------------------------------------------------------------------
List admin: http://cool.haxx.se/list/listinfo/curl-library
Etiquette: http://curl.haxx.se/mail/etiquette.html
Received on 2013-08-20