#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include "curl/curl.h"

#define STR_LEN 1000

int stringwriter(void *ptr, size_t size, size_t nmemb, void *stream)
{
  int i;
  int nDataSize, nStrSize, nMaxAppend;
  unsigned char *pData = (char *)ptr;
  char *pStr = (char *)stream;

  nDataSize = size * nmemb;

  printf ("DATA:\n");
  for (i = 0; i < nDataSize; i++)
  {
    if (pData[i] >= 0x20 && (pData[i] < 0x7f || pData[i] > 0x9f))
      printf ("%c", pData[i]);
    else if (pData[i] < 0x20)
      printf ("^%c", pData[i] + '@');
    else
      printf ("^?");
  }
  printf ("\n");

  nStrSize = strlen (pStr);
  nMaxAppend = STR_LEN - nStrSize;
  if (nMaxAppend > nDataSize)
    nMaxAppend = nDataSize;

  if (nMaxAppend > 0)
  {
    strncat (pStr, pData, nMaxAppend);
    pStr[nStrSize + nMaxAppend] = '\0';
  }

  return nDataSize;
}

int TestGet (char *pURL)
{
  CURL *pCurl;
  char pHeaders[STR_LEN+1];
  char pBody[STR_LEN+1];
  char pCurlErr[CURL_ERROR_SIZE+1];

  pCurl = curl_easy_init ();
  curl_easy_setopt (pCurl, CURLOPT_WRITEFUNCTION, stringwriter);
  pBody[0] = '\0';                 // start string out empty
  curl_easy_setopt (pCurl, CURLOPT_FILE, pBody);
  curl_easy_setopt (pCurl, CURLOPT_URL, pURL);
  pHeaders[0] = '\0';              // start string out empty
  curl_easy_setopt (pCurl, CURLOPT_WRITEHEADER, pHeaders);
  curl_easy_setopt (pCurl, CURLOPT_HEADERFUNCTION, stringwriter);
  curl_easy_setopt (pCurl, CURLOPT_ERRORBUFFER, pCurlErr);
  curl_easy_setopt (pCurl, CURLOPT_SSLVERSION, 2);
  curl_easy_setopt (pCurl, CURLOPT_SSL_VERIFYPEER, 0);          /* blah */
  curl_easy_setopt (pCurl, CURLOPT_SSL_VERIFYHOST, 0);          /* blah */

  if (curl_easy_perform (pCurl))
  {
    printf ("cURL error: %s\n", pCurlErr);
    curl_easy_cleanup (pCurl);
    return -1;
  }

  printf ("\n\n\n\n\n\n"
          "FIRST %d BYTES OF HEADERS:\n%s\n"
          "FIRST %d BYTES OF BODY:\n%s\n",
          STR_LEN, pHeaders, STR_LEN, pBody);
  curl_easy_cleanup (pCurl);
  return 0;
}

int main (int argc, char **argv)
{
  if (argc < 2)
    return 0;
  printf ("cURL version: %s\n\n", curl_version ());
  TestGet (argv[1]);
  return 0;
}

