Index: src/pycurl.c
===================================================================
RCS file: /cvsroot/pycurl/pycurl/src/pycurl.c,v
retrieving revision 1.148
diff -C5 -r1.148 pycurl.c
*** src/pycurl.c	29 Sep 2008 10:56:57 -0000	1.148
--- src/pycurl.c	13 Feb 2010 16:45:21 -0000
***************
*** 2072,2081 ****
--- 2072,2149 ----
  error:
      PyErr_SetString(PyExc_TypeError, "invalid arguments to setopt");
      return NULL;
  }
  
+ static PyObject *getinfo_certinfo(CurlObject *self)
+ {
+     struct curl_certinfo *certinfo = NULL;
+     PyObject *ret = NULL;
+     PyObject *dict = NULL;
+     PyObject *key = NULL;
+     PyObject *value = NULL;
+     int i = 0;
+ 
+     int res = curl_easy_getinfo(self->handle, CURLINFO_CERTINFO, &certinfo);
+     if (CURLE_OK != res) {
+         CURLERROR_RETVAL();
+     }
+ 
+     if (!certinfo) {
+         Py_INCREF(Py_None);
+         return Py_None;
+     }
+ 
+     if (NULL == (ret = PyTuple_New(certinfo->num_of_certs))) {
+         return NULL;
+     }
+                 
+     for (i = 0; i < certinfo->num_of_certs; ++i) {
+         struct curl_slist *slist = certinfo->certinfo[i];
+         if (NULL == (dict = PyDict_New())) {
+             goto error;
+         }
+         
+         for ( ; slist != NULL; slist = slist->next) {
+             char *colon = NULL;
+ 
+             /* I think this indicates an error in libcurl */
+             assert(slist->data);
+ 
+             if (NULL == (colon = strchr(slist->data, ':'))) {
+                 PyErr_Format(ErrorObject, "INFO_CERTINFO missing \"name:content\" with %s", slist->data);
+                 goto error;
+             }
+ 
+             if (NULL == (key = PyString_FromStringAndSize(slist->data, colon - slist->data)) ||
+                 NULL == (value = PyString_FromString(colon + 1))) {
+                 goto error;
+             }
+             
+             if (-1 == PyDict_SetItem(dict, key, value)) {
+                 goto error;
+             }
+             
+             Py_DECREF(key);
+             key = NULL;
+             Py_DECREF(value);
+             value = NULL;
+         }
+ 
+         /* SET_ITEM steals a ref */
+         PyTuple_SET_ITEM(ret, i, dict);
+         dict = NULL;
+     }
+ 
+     return ret;
+  error:
+     Py_XDECREF(ret);
+     Py_XDECREF(dict);
+     Py_XDECREF(key);
+     Py_XDECREF(value);
+     return NULL;
+ }
  
  static PyObject *
  do_curl_getinfo(CurlObject *self, PyObject *args)
  {
      int option;
***************
*** 2168,2177 ****
--- 2236,2249 ----
              if (res != CURLE_OK) {
                  CURLERROR_RETVAL();
              }
              return convert_slist(slist, 1 | 2);
          }
+     case CURLINFO_CERTINFO:
+         {
+             return getinfo_certinfo(self);
+         }
      }
  
      /* Got wrong option on the method call */
      PyErr_SetString(PyExc_ValueError, "invalid argument to getinfo");
      return NULL;
***************
*** 3677,3686 ****
--- 3749,3759 ----
      insint_c(d, "SSH_HOST_PUBLIC_KEY_MD5", CURLOPT_SSH_HOST_PUBLIC_KEY_MD5);
      insint_c(d, "AUTOREFERER", CURLOPT_AUTOREFERER);
      insint_c(d, "CRLFILE", CURLOPT_CRLFILE);
      insint_c(d, "ISSUERCERT", CURLOPT_ISSUERCERT);
      insint_c(d, "ADDRESS_SCOPE", CURLOPT_ADDRESS_SCOPE);
+     insint_c(d, "OPT_CERTINFO", CURLOPT_CERTINFO);
  
      insint_c(d, "M_TIMERFUNCTION", CURLMOPT_TIMERFUNCTION);
      insint_c(d, "M_SOCKETFUNCTION", CURLMOPT_SOCKETFUNCTION);
      insint_c(d, "M_PIPELINING", CURLMOPT_PIPELINING);
      insint_c(d, "M_MAXCONNECTS", CURLMOPT_MAXCONNECTS);
***************
*** 3754,3763 ****
--- 3827,3837 ----
      insint_c(d, "NUM_CONNECTS", CURLINFO_NUM_CONNECTS);
      insint_c(d, "SSL_ENGINES", CURLINFO_SSL_ENGINES);
      insint_c(d, "INFO_COOKIELIST", CURLINFO_COOKIELIST);
      insint_c(d, "LASTSOCKET", CURLINFO_LASTSOCKET);
      insint_c(d, "FTP_ENTRY_PATH", CURLINFO_FTP_ENTRY_PATH);
+     insint_c(d, "INFO_CERTINFO", CURLINFO_CERTINFO);
  
      /* options for global_init() */
      insint(d, "GLOBAL_SSL", CURL_GLOBAL_SSL);
      insint(d, "GLOBAL_WIN32", CURL_GLOBAL_WIN32);
      insint(d, "GLOBAL_ALL", CURL_GLOBAL_ALL);

