Hello community,
here is the log from the commit of package python-curl
checked in at Wed Mar 28 02:24:57 CEST 2007.
--------
--- python-curl/python-curl.changes 2007-02-02 14:28:28.000000000 +0100
+++ /mounts/work_src_done/STABLE/python-curl/python-curl.changes 2007-03-27 15:46:58.059519000 +0200
@@ -1,0 +2,17 @@
+Tue Mar 27 15:42:40 CEST 2007 - cthiel@suse.de
+
+- update to version 7.16.1
+ * Added constants for all libcurl (error) return codes. They are named
+ the same as the macro constants in curl.h but prefixed with E_ instead
+ of CURLE. Return codes for the multi API are prefixed with M_ instead
+ of CURLM.
+ * Added CURLOPT_FTP_SSL_CCC, CURLOPT_SSH_PUBLIC_KEYFILE,
+ CURLOPT_SSH_PRIVATE_KEYFILE, CURLOPT_SSH_AUTH_TYPES.
+ * Removed CLOSEPOLICY and friends since this option is now deprecated in
+ libcurl.
+ * Set the _use_datetime attribute on the CURLTransport class to unbreak
+ xmlrpc_curl.py on Python 2.5.
+ * Added CURLOPT_SSL_SESSIONID_CACHE.
+ * Removed SOURCE_* options since they are no longer supported by libcurl.
+
+-------------------------------------------------------------------
Old:
----
pycurl-7.15.5.1-cvs-fix.patch
pycurl-7.15.5.1.tar.bz2
New:
----
pycurl-7.16.1.tar.bz2
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ python-curl.spec ++++++
--- /var/tmp/diff_new_pack.M32757/_old 2007-03-28 02:24:47.000000000 +0200
+++ /var/tmp/diff_new_pack.M32757/_new 2007-03-28 02:24:47.000000000 +0200
@@ -1,5 +1,5 @@
#
-# spec file for package python-curl (Version 7.15.5.1)
+# spec file for package python-curl (Version 7.16.1)
#
# Copyright (c) 2007 SUSE LINUX Products GmbH, Nuernberg, Germany.
# This file and all modifications and additions to the pristine
@@ -11,18 +11,17 @@
# norootforbuild
Name: python-curl
-BuildRequires: curl-devel >= 7.15.5
-BuildRequires: curl-devel python-devel
-Version: 7.15.5.1
-Release: 29
+BuildRequires: curl-devel >= %{version}
+BuildRequires: python-devel
+Version: 7.16.1
+Release: 1
Summary: Python module interface to the cURL library
Source: pycurl-%{version}.tar.bz2
-Patch0: pycurl-7.15.5.1-cvs-fix.patch
URL: http://pycurl.sourceforge.net/
Group: Development/Libraries/Python
License: GNU Library General Public License v. 2.0 and 2.1 (LGPL)
BuildRoot: %{_tmppath}/%{name}-%{version}-build
-Requires: curl >= 7.15.5
+Requires: curl >= %{version}
%py_requires
@@ -39,7 +38,6 @@
%prep
%setup -q -n pycurl-%{version}
-%patch0
%build
export CFLAGS="$RPM_OPT_FLAGS"
@@ -61,7 +59,21 @@
%{py_sitedir}/*.egg-info
%endif
-%changelog -n python-curl
+%changelog
+* Tue Mar 27 2007 - cthiel@suse.de
+- update to version 7.16.1
+ * Added constants for all libcurl (error) return codes. They are named
+ the same as the macro constants in curl.h but prefixed with E_ instead
+ of CURLE. Return codes for the multi API are prefixed with M_ instead
+ of CURLM.
+ * Added CURLOPT_FTP_SSL_CCC, CURLOPT_SSH_PUBLIC_KEYFILE,
+ CURLOPT_SSH_PRIVATE_KEYFILE, CURLOPT_SSH_AUTH_TYPES.
+ * Removed CLOSEPOLICY and friends since this option is now deprecated in
+ libcurl.
+ * Set the _use_datetime attribute on the CURLTransport class to unbreak
+ xmlrpc_curl.py on Python 2.5.
+ * Added CURLOPT_SSL_SESSIONID_CACHE.
+ * Removed SOURCE_* options since they are no longer supported by libcurl.
* Fri Feb 02 2007 - mmarek@suse.cz
- applied cvs fix for build with curl-7.16
* Mon Oct 02 2006 - cthiel@suse.de
++++++ pycurl-7.15.5.1.tar.bz2 -> pycurl-7.16.1.tar.bz2 ++++++
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/pycurl-7.15.5.1/ChangeLog new/pycurl-7.16.1/ChangeLog
--- old/pycurl-7.15.5.1/ChangeLog 2006-09-01 09:51:45.000000000 +0200
+++ new/pycurl-7.16.1/ChangeLog 2007-03-04 20:55:13.000000000 +0100
@@ -1,9 +1,36 @@
-Version 7.15.5.1 [requires libcurl-7.15.5 or better]
+Version 7.16.1 [requires libcurl-7.16.1 or better]
+--------------
+
+ * Added constants for all libcurl (error) return codes. They
+ are named the same as the macro constants in curl.h but prefixed
+ with E_ instead of CURLE. Return codes for the multi API are
+ prefixed with M_ instead of CURLM.
+
+ * Added CURLOPT_FTP_SSL_CCC, CURLOPT_SSH_PUBLIC_KEYFILE,
+ CURLOPT_SSH_PRIVATE_KEYFILE, CURLOPT_SSH_AUTH_TYPES.
+
+ * Removed CLOSEPOLICY and friends since this option is now
+ deprecated in libcurl.
+
+ * Set the _use_datetime attribute on the CURLTransport class
+ to unbreak xmlrpc_curl.py on Python 2.5.
+
+
+Version 7.16.0 [no public release]
+--------------
+
+ * Added CURLOPT_SSL_SESSIONID_CACHE.
+
+ * Removed SOURCE_* options since they are no longer
+ supported by libcurl.
+
+
+Version 7.15.5.1
----------------
* Added test for basic ftp usage (tests/test_ftp.py).
- * Fix broken ssl mutex lock funcction when using
+ * Fix broken ssl mutex lock function when using
GNU TLS (Debian bug #380156, fix by Bastian Kleineidam)
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/pycurl-7.15.5.1/doc/pycurl.html new/pycurl-7.16.1/doc/pycurl.html
--- old/pycurl-7.15.5.1/doc/pycurl.html 2006-06-18 20:47:19.000000000 +0200
+++ new/pycurl-7.16.1/doc/pycurl.html 2007-03-01 14:43:30.000000000 +0100
@@ -15,7 +15,7 @@
<p>The pycurl package is a Python interface to libcurl (<a
href="http://curl.haxx.se/libcurl/">http://curl.haxx.se/libcurl/</a>). pycurl
has been successfully built and tested with Python versions from
-2.2 to the current 2.4.x releases.</p>
+2.2 to the current 2.5.x releases.</p>
<p>libcurl is a client-side URL transfer library supporting FTP, FTPS,
HTTP, HTTPS, GOPHER, TELNET, DICT, FILE and LDAP. libcurl
@@ -123,7 +123,7 @@
<a href="http://validator.w3.org/check/referer"><img align="right"
src="http://www.w3.org/Icons/valid-xhtml10"
alt="Valid XHTML 1.0!" height="31" width="88" border="0" /></a>
- $Id: pycurl.html,v 1.29 2006/06/18 18:47:19 kjetilja Exp $
+ $Id: pycurl.html,v 1.30 2006/10/30 12:48:50 kjetilja Exp $
</p>
</body>
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/pycurl-7.15.5.1/examples/xmlrpc_curl.py new/pycurl-7.16.1/examples/xmlrpc_curl.py
--- old/pycurl-7.15.5.1/examples/xmlrpc_curl.py 2005-07-28 13:04:13.000000000 +0200
+++ new/pycurl-7.16.1/examples/xmlrpc_curl.py 2007-03-04 20:26:59.000000000 +0100
@@ -1,7 +1,7 @@
#! /usr/bin/env python
# -*- coding: iso-8859-1 -*-
# vi:ts=4:et
-# $Id: xmlrpc_curl.py,v 1.12 2005/07/28 11:04:13 mfx Exp $
+# $Id: xmlrpc_curl.py,v 1.13 2007/03/04 19:26:59 kjetilja Exp $
# We should ignore SIGPIPE when using pycurl.NOSIGNAL - see
# the libcurl tutorial for more info.
@@ -31,6 +31,7 @@
self.c.setopt(pycurl.HTTPHEADER, self.xmlrpc_h)
if username != None and password != None:
self.c.setopt(pycurl.USERPWD, '%s:%s' % (username, password))
+ self._use_datetime = False
def request(self, host, handler, request_body, verbose=0):
b = StringIO()
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/pycurl-7.15.5.1/PKG-INFO new/pycurl-7.16.1/PKG-INFO
--- old/pycurl-7.15.5.1/PKG-INFO 2006-09-01 09:54:22.000000000 +0200
+++ new/pycurl-7.16.1/PKG-INFO 2007-03-04 20:56:34.000000000 +0100
@@ -1,6 +1,6 @@
Metadata-Version: 1.0
Name: pycurl
-Version: 7.15.5.1
+Version: 7.16.1
Summary: PycURL -- cURL library module for Python
Home-page: http://pycurl.sourceforge.net/
Author: Kjetil Jacobsen, Markus F.X.J. Oberhumer
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/pycurl-7.15.5.1/README new/pycurl-7.16.1/README
--- old/pycurl-7.15.5.1/README 2006-01-31 10:03:46.000000000 +0100
+++ new/pycurl-7.16.1/README 2007-03-04 20:36:09.000000000 +0100
@@ -1,8 +1,8 @@
LICENSE
-------
-Copyright (C) 2001-2006 by Kjetil Jacobsen
-Copyright (C) 2001-2006 by Markus F.X.J. Oberhumer
+Copyright (C) 2001-2007 by Kjetil Jacobsen
+Copyright (C) 2001-2007 by Markus F.X.J. Oberhumer
PycURL is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/pycurl-7.15.5.1/setup.py new/pycurl-7.16.1/setup.py
--- old/pycurl-7.15.5.1/setup.py 2006-09-01 09:54:09.000000000 +0200
+++ new/pycurl-7.16.1/setup.py 2007-03-04 20:26:59.000000000 +0100
@@ -1,13 +1,13 @@
#! /usr/bin/env python
# -*- coding: iso-8859-1 -*-
# vi:ts=4:et
-# $Id: setup.py,v 1.137 2006/09/01 07:54:09 kjetilja Exp $
+# $Id: setup.py,v 1.138 2007/03/04 19:26:59 kjetilja Exp $
"""Setup script for the PycURL module distribution."""
PACKAGE = "pycurl"
PY_PACKAGE = "curl"
-VERSION = "7.15.5.1"
+VERSION = "7.16.1"
import glob, os, re, sys, string
import distutils
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/pycurl-7.15.5.1/setup_win32_ssl.py new/pycurl-7.16.1/setup_win32_ssl.py
--- old/pycurl-7.15.5.1/setup_win32_ssl.py 2006-09-01 09:54:09.000000000 +0200
+++ new/pycurl-7.16.1/setup_win32_ssl.py 2007-03-04 20:26:59.000000000 +0100
@@ -1,13 +1,13 @@
#! /usr/bin/env python
# -*- coding: iso-8859-1 -*-
# vi:ts=4:et
-# $Id: setup_win32_ssl.py,v 1.38 2006/09/01 07:54:09 kjetilja Exp $
+# $Id: setup_win32_ssl.py,v 1.39 2007/03/04 19:26:59 kjetilja Exp $
import os, sys, string
assert sys.platform == "win32", "Only for building on Win32 with SSL and zlib"
-CURL_DIR = r"c:\src\build\pycurl\curl-7.15.5.1-ssl"
+CURL_DIR = r"c:\src\build\pycurl\curl-7.16.1-ssl"
OPENSSL_DIR = r"c:\src\build\pycurl\openssl-0.9.7g"
sys.argv.insert(1, "--curl-dir=" + CURL_DIR)
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/pycurl-7.15.5.1/src/pycurl.c new/pycurl-7.16.1/src/pycurl.c
--- old/pycurl-7.15.5.1/src/pycurl.c 2006-08-11 12:37:19.000000000 +0200
+++ new/pycurl-7.16.1/src/pycurl.c 2007-03-04 20:37:27.000000000 +0100
@@ -1,10 +1,10 @@
-/* $Id: pycurl.c,v 1.116 2006/08/11 10:37:19 kjetilja Exp $ */
+/* $Id: pycurl.c,v 1.125 2007/03/04 19:37:27 kjetilja Exp $ */
/* PycURL -- cURL Python module
*
* Authors:
- * Copyright (C) 2001-2006 by Kjetil Jacobsen <kjetilja at gmail.com>
- * Copyright (C) 2001-2006 by Markus F.X.J. Oberhumer <markus at oberhumer.com>
+ * Copyright (C) 2001-2007 by Kjetil Jacobsen <kjetilja at gmail.com>
+ * Copyright (C) 2001-2007 by Markus F.X.J. Oberhumer <markus at oberhumer.com>
*
* Contributions:
* Tino Lange
@@ -48,8 +48,8 @@
#if !defined(PY_VERSION_HEX) || (PY_VERSION_HEX < 0x02020000)
# error "Need Python version 2.2 or greater to compile pycurl."
#endif
-#if !defined(LIBCURL_VERSION_NUM) || (LIBCURL_VERSION_NUM < 0x070f05)
-# error "Need libcurl version 7.15.5 or greater to compile pycurl."
+#if !defined(LIBCURL_VERSION_NUM) || (LIBCURL_VERSION_NUM < 0x071001)
+# error "Need libcurl version 7.16.1 or greater to compile pycurl."
#endif
#undef UNUSED
@@ -84,6 +84,7 @@
/* Calculate the number of OBJECTPOINT options we need to store */
#define OPTIONS_SIZE ((int)CURLOPT_LASTENTRY % 10000)
+#define MOPTIONS_SIZE ((int)CURLMOPT_LASTENTRY % 10000)
static int OPT_INDEX(int o)
{
assert(o >= CURLOPTTYPE_OBJECTPOINT);
@@ -117,6 +118,9 @@
fd_set read_fd_set;
fd_set write_fd_set;
fd_set exc_fd_set;
+ /* callbacks */
+ PyObject *t_cb;
+ PyObject *s_cb;
} CurlMultiObject;
typedef struct {
@@ -132,8 +136,6 @@
struct curl_slist *quote;
struct curl_slist *postquote;
struct curl_slist *prequote;
- struct curl_slist *source_prequote;
- struct curl_slist *source_postquote;
/* callbacks */
PyObject *w_cb;
PyObject *h_cb;
@@ -275,6 +277,26 @@
return NULL;
}
+
+static PyThreadState *
+get_thread_state_multi(const CurlMultiObject *self)
+{
+ /* Get the thread state for callbacks to run in when given
+ * multi handles instead of regular handles
+ */
+ if (self == NULL)
+ return NULL;
+ assert(self->ob_type == p_CurlMulti_Type);
+ if (self->state != NULL)
+ {
+ /* inside multi_perform() */
+ assert(self->multi_handle != NULL);
+ return self->state;
+ }
+ return NULL;
+}
+
+
/* assert some CurlShareObject invariants */
static void
assert_share_state(const CurlShareObject *self)
@@ -586,6 +608,27 @@
return 0;
}
+
+static void
+util_share_close(CurlShareObject *self){
+ curl_share_cleanup(self->share_handle);
+ share_lock_destroy(self->lock);
+}
+
+
+static void
+do_share_dealloc(CurlShareObject *self){
+ PyObject_GC_UnTrack(self);
+ Py_TRASHCAN_SAFE_BEGIN(self);
+
+ ZAP(self->dict);
+ util_share_close(self);
+
+ PyObject_GC_Del(self);
+ Py_TRASHCAN_SAFE_END(self)
+}
+
+
/* setopt, unsetopt*/
/* --------------- unsetopt/setopt/getinfo --------------- */
@@ -669,8 +712,6 @@
self->quote = NULL;
self->postquote = NULL;
self->prequote = NULL;
- self->source_postquote = NULL;
- self->source_prequote = NULL;
/* Set callback pointers to NULL by default */
self->w_cb = NULL;
@@ -860,8 +901,6 @@
SFREE(self->quote);
SFREE(self->postquote);
SFREE(self->prequote);
- SFREE(self->source_postquote);
- SFREE(self->source_prequote);
#undef SFREE
/* Last, free the options. This must be done after the curl handle
@@ -1475,10 +1514,9 @@
case CURLOPT_URL:
case CURLOPT_USERAGENT:
case CURLOPT_USERPWD:
- case CURLOPT_SOURCE_HOST:
- case CURLOPT_SOURCE_USERPWD:
- case CURLOPT_SOURCE_PATH:
case CURLOPT_FTP_ALTERNATIVE_TO_USER:
+ case CURLOPT_SSH_PUBLIC_KEYFILE:
+ case CURLOPT_SSH_PRIVATE_KEYFILE:
/* FIXME: check if more of these options allow binary data */
str = PyString_AsString_NoNUL(obj);
if (str == NULL)
@@ -1646,12 +1684,6 @@
case CURLOPT_PREQUOTE:
old_slist = &self->prequote;
break;
- case CURLOPT_SOURCE_PREQUOTE:
- old_slist = &self->source_prequote;
- break;
- case CURLOPT_SOURCE_POSTQUOTE:
- old_slist = &self->source_postquote;
- break;
case CURLOPT_HTTPPOST:
break;
default:
@@ -2092,6 +2124,8 @@
/* Initialize object attributes */
self->dict = NULL;
self->state = NULL;
+ self->t_cb = NULL;
+ self->s_cb = NULL;
/* Allocate libcurl multi handle */
self->multi_handle = curl_multi_init();
@@ -2104,12 +2138,6 @@
}
static void
-util_share_close(CurlShareObject *self){
- curl_share_cleanup(self->share_handle);
- share_lock_destroy(self->lock);
-}
-
-static void
util_multi_close(CurlMultiObject *self)
{
assert(self != NULL);
@@ -2121,17 +2149,6 @@
}
}
-static void
-do_share_dealloc(CurlShareObject *self){
- PyObject_GC_UnTrack(self);
- Py_TRASHCAN_SAFE_BEGIN(self);
-
- ZAP(self->dict);
- util_share_close(self);
-
- PyObject_GC_Del(self);
- Py_TRASHCAN_SAFE_END(self)
-}
static void
do_multi_dealloc(CurlMultiObject *self)
@@ -2182,10 +2199,255 @@
#undef VISIT
}
-/* --------------- perform --------------- */
+
+/* --------------- setopt --------------- */
+
+int multi_socket_callback(CURL *easy,
+ curl_socket_t s,
+ int what,
+ void *userp,
+ void *socketp)
+{
+ CurlMultiObject *self;
+ CurlObject *easy_self;
+ PyThreadState *tmp_state;
+ PyObject *arglist;
+ PyObject *result = NULL;
+ int ret;
+
+ /* acquire thread */
+ self = (CurlMultiObject *)userp;
+ ret = curl_easy_getinfo(easy, CURLINFO_PRIVATE, &easy_self);
+ tmp_state = get_thread_state_multi(self);
+ if (tmp_state == NULL)
+ return 0;
+ PyEval_AcquireThread(tmp_state);
+
+ /* check args */
+ if (self->s_cb == NULL)
+ goto silent_error;
+
+ if (socketp == NULL) {
+ Py_INCREF(Py_None);
+ socketp = Py_None;
+ }
+
+ /* run callback */
+ arglist = Py_BuildValue("(iiOO)", what, s, userp, (PyObject *)socketp);
+ if (arglist == NULL)
+ goto verbose_error;
+ result = PyEval_CallObject(self->s_cb, arglist);
+ Py_DECREF(arglist);
+ if (result == NULL)
+ goto verbose_error;
+
+ /* return values from socket callbacks should be ignored */
+
+silent_error:
+ Py_XDECREF(result);
+ PyEval_ReleaseThread(tmp_state);
+ return 0;
+verbose_error:
+ PyErr_Print();
+ goto silent_error;
+ return 0;
+}
+
+
+int multi_timer_callback(CURLM *multi,
+ long timeout_ms,
+ void *userp)
+{
+ CurlMultiObject *self;
+ PyThreadState *tmp_state;
+ PyObject *arglist;
+ PyObject *result = NULL;
+ int ret = 0; /* always success */
+
+ UNUSED(multi);
+
+ /* acquire thread */
+ self = (CurlMultiObject *)userp;
+ tmp_state = get_thread_state_multi(self);
+ if (tmp_state == NULL)
+ return ret;
+ PyEval_AcquireThread(tmp_state);
+
+ /* check args */
+ if (self->t_cb == NULL)
+ goto silent_error;
+
+ /* run callback */
+ arglist = Py_BuildValue("(i)", timeout_ms);
+ if (arglist == NULL)
+ goto verbose_error;
+ result = PyEval_CallObject(self->t_cb, arglist);
+ Py_DECREF(arglist);
+ if (result == NULL)
+ goto verbose_error;
+
+ /* return values from timer callbacks should be ignored */
+
+silent_error:
+ Py_XDECREF(result);
+ PyEval_ReleaseThread(tmp_state);
+ return ret;
+verbose_error:
+ PyErr_Print();
+ goto silent_error;
+
+ return 0;
+}
static PyObject *
+do_multi_setopt(CurlMultiObject *self, PyObject *args)
+{
+ int option;
+ PyObject *obj;
+
+ if (!PyArg_ParseTuple(args, "iO:setopt", &option, &obj))
+ return NULL;
+ if (check_multi_state(self, 1 | 2, "setopt") != 0)
+ return NULL;
+
+ /* Early checks of option value */
+ if (option <= 0)
+ goto error;
+ if (option >= (int)CURLOPTTYPE_OFF_T + MOPTIONS_SIZE)
+ goto error;
+ if (option % 10000 >= MOPTIONS_SIZE)
+ goto error;
+
+ /* Handle the case of integer arguments */
+ if (PyInt_Check(obj)) {
+ long d = PyInt_AsLong(obj);
+ switch(option) {
+ case CURLMOPT_PIPELINING:
+ curl_multi_setopt(self->multi_handle, option, d);
+ break;
+ default:
+ PyErr_SetString(PyExc_TypeError, "integers are not supported for this option");
+ return NULL;
+ }
+ Py_INCREF(Py_None);
+ return Py_None;
+ }
+ if (PyFunction_Check(obj) || PyCFunction_Check(obj) || PyMethod_Check(obj)) {
+ /* We use function types here to make sure that our callback
+ * definitions exactly match the interface.
+ */
+ const curl_multi_timer_callback t_cb = multi_timer_callback;
+ const curl_socket_callback s_cb = multi_socket_callback;
+
+ switch(option) {
+ case CURLMOPT_SOCKETFUNCTION:
+ curl_multi_setopt(self->multi_handle, CURLMOPT_SOCKETFUNCTION, s_cb);
+ curl_multi_setopt(self->multi_handle, CURLMOPT_SOCKETDATA, self);
+ Py_INCREF(obj);
+ self->s_cb = obj;
+ break;
+ case CURLMOPT_TIMERFUNCTION:
+ curl_multi_setopt(self->multi_handle, CURLMOPT_TIMERFUNCTION, t_cb);
+ curl_multi_setopt(self->multi_handle, CURLMOPT_TIMERDATA, self);
+ Py_INCREF(obj);
+ self->t_cb = obj;
+ break;
+ default:
+ PyErr_SetString(PyExc_TypeError, "callables are not supported for this option");
+ return NULL;
+ }
+ Py_INCREF(Py_None);
+ return Py_None;
+ }
+ /* Failed to match any of the function signatures -- return error */
+error:
+ PyErr_SetString(PyExc_TypeError, "invalid arguments to setopt");
+ return NULL;
+}
+
+
+/* --------------- timeout --------------- */
+
+static PyObject *
+do_multi_timeout(CurlMultiObject *self)
+{
+ CURLMcode res;
+ long timeout;
+
+ if (check_multi_state(self, 1 | 2, "timeout") != 0) {
+ return NULL;
+ }
+
+ res = curl_multi_timeout(self->multi_handle, &timeout);
+ if (res != CURLM_OK) {
+ CURLERROR_MSG("timeout failed");
+ }
+
+ /* Return number of millisecs until timeout */
+ return Py_BuildValue("i", timeout);
+}
+
+
+/* --------------- assign --------------- */
+
+static PyObject *
+do_multi_assign(CurlMultiObject *self, PyObject *args)
+{
+ CURLMcode res;
+ curl_socket_t socket;
+ PyObject *obj;
+
+ if (!PyArg_ParseTuple(args, "iO:assign", &socket, &obj))
+ return NULL;
+ if (check_multi_state(self, 1 | 2, "assign") != 0) {
+ return NULL;
+ }
+ Py_INCREF(obj);
+
+ res = curl_multi_assign(self->multi_handle, socket, obj);
+ if (res != CURLM_OK) {
+ CURLERROR_MSG("assign failed");
+ }
+
+ Py_INCREF(Py_None);
+ return Py_None;
+}
+
+
+/* --------------- socket_all --------------- */
+
+static PyObject *
+do_multi_socket_all(CurlMultiObject *self)
+{
+ CURLMcode res;
+ int running = -1;
+
+ if (check_multi_state(self, 1 | 2, "socket_all") != 0) {
+ return NULL;
+ }
+
+ /* Release global lock and start */
+ self->state = PyThreadState_Get();
+ assert(self->state != NULL);
+ Py_BEGIN_ALLOW_THREADS
+ res = curl_multi_socket_all(self->multi_handle, &running);
+ Py_END_ALLOW_THREADS
+ self->state = NULL;
+
+ /* We assume these errors are ok, otherwise throw exception */
+ if (res != CURLM_OK && res != CURLM_CALL_MULTI_PERFORM) {
+ CURLERROR_MSG("perform failed");
+ }
+
+ /* Return a tuple with the result and the number of running handles */
+ return Py_BuildValue("(ii)", (int)res, running);
+}
+
+
+/* --------------- perform --------------- */
+
+static PyObject *
do_multi_perform(CurlMultiObject *self)
{
CURLMcode res;
@@ -2540,6 +2802,10 @@
{"fdset", (PyCFunction)do_multi_fdset, METH_NOARGS, co_multi_fdset_doc},
{"info_read", (PyCFunction)do_multi_info_read, METH_VARARGS, co_multi_info_read_doc},
{"perform", (PyCFunction)do_multi_perform, METH_NOARGS, NULL},
+ {"socket_all", (PyCFunction)do_multi_socket_all, METH_NOARGS, NULL},
+ {"setopt", (PyCFunction)do_multi_setopt, METH_VARARGS, NULL},
+ {"timeout", (PyCFunction)do_multi_timeout, METH_NOARGS, NULL},
+ {"assign", (PyCFunction)do_multi_assign, METH_VARARGS, NULL},
{"remove_handle", (PyCFunction)do_multi_remove_handle, METH_VARARGS, NULL},
{"select", (PyCFunction)do_multi_select, METH_VARARGS, co_multi_select_doc},
{NULL, NULL, 0, NULL}
@@ -3037,9 +3303,81 @@
insint_c(d, "INFOTYPE_SSL_DATA_OUT", CURLINFO_SSL_DATA_OUT);
/* CURLcode: error codes */
-/* FIXME: lots of error codes are missing */
insint_c(d, "E_OK", CURLE_OK);
insint_c(d, "E_UNSUPPORTED_PROTOCOL", CURLE_UNSUPPORTED_PROTOCOL);
+ insint_c(d, "E_FAILED_INIT", CURLE_FAILED_INIT);
+ insint_c(d, "E_URL_MALFORMAT", CURLE_URL_MALFORMAT);
+ insint_c(d, "E_COULDNT_RESOLVE_PROXY", CURLE_COULDNT_RESOLVE_PROXY);
+ insint_c(d, "E_COULDNT_RESOLVE_HOST", CURLE_COULDNT_RESOLVE_HOST);
+ insint_c(d, "E_COULDNT_CONNECT", CURLE_COULDNT_CONNECT);
+ insint_c(d, "E_FTP_WEIRD_SERVER_REPLY", CURLE_FTP_WEIRD_SERVER_REPLY);
+ insint_c(d, "E_FTP_ACCESS_DENIED", CURLE_FTP_ACCESS_DENIED);
+ insint_c(d, "E_FTP_WEIRD_PASS_REPLY", CURLE_FTP_WEIRD_PASS_REPLY);
+ insint_c(d, "E_FTP_WEIRD_USER_REPLY", CURLE_FTP_WEIRD_USER_REPLY);
+ insint_c(d, "E_FTP_WEIRD_PASV_REPLY", CURLE_FTP_WEIRD_PASV_REPLY);
+ insint_c(d, "E_FTP_WEIRD_227_FORMAT", CURLE_FTP_WEIRD_227_FORMAT);
+ insint_c(d, "E_FTP_CANT_GET_HOST", CURLE_FTP_CANT_GET_HOST);
+ insint_c(d, "E_FTP_CANT_RECONNECT", CURLE_FTP_CANT_RECONNECT);
+ insint_c(d, "E_FTP_COULDNT_SET_BINARY", CURLE_FTP_COULDNT_SET_BINARY);
+ insint_c(d, "E_PARTIAL_FILE", CURLE_PARTIAL_FILE);
+ insint_c(d, "E_FTP_COULDNT_RETR_FILE", CURLE_FTP_COULDNT_RETR_FILE);
+ insint_c(d, "E_FTP_WRITE_ERROR", CURLE_FTP_WRITE_ERROR);
+ insint_c(d, "E_FTP_QUOTE_ERROR", CURLE_FTP_QUOTE_ERROR);
+ insint_c(d, "E_HTTP_RETURNED_ERROR", CURLE_HTTP_RETURNED_ERROR);
+ insint_c(d, "E_WRITE_ERROR", CURLE_WRITE_ERROR);
+ insint_c(d, "E_FTP_COULDNT_STOR_FILE", CURLE_FTP_COULDNT_STOR_FILE);
+ insint_c(d, "E_READ_ERROR", CURLE_READ_ERROR);
+ insint_c(d, "E_OUT_OF_MEMORY", CURLE_OUT_OF_MEMORY);
+ insint_c(d, "E_OPERATION_TIMEOUTED", CURLE_OPERATION_TIMEOUTED);
+ insint_c(d, "E_FTP_COULDNT_SET_ASCII", CURLE_FTP_COULDNT_SET_ASCII);
+ insint_c(d, "E_FTP_PORT_FAILED", CURLE_FTP_PORT_FAILED);
+ insint_c(d, "E_FTP_COULDNT_USE_REST", CURLE_FTP_COULDNT_USE_REST);
+ insint_c(d, "E_FTP_COULDNT_GET_SIZE", CURLE_FTP_COULDNT_GET_SIZE);
+ insint_c(d, "E_HTTP_RANGE_ERROR", CURLE_HTTP_RANGE_ERROR);
+ insint_c(d, "E_HTTP_POST_ERROR", CURLE_HTTP_POST_ERROR);
+ insint_c(d, "E_SSL_CONNECT_ERROR", CURLE_SSL_CONNECT_ERROR);
+ insint_c(d, "E_BAD_DOWNLOAD_RESUME", CURLE_BAD_DOWNLOAD_RESUME);
+ insint_c(d, "E_FILE_COULDNT_READ_FILE", CURLE_FILE_COULDNT_READ_FILE);
+ insint_c(d, "E_LDAP_CANNOT_BIND", CURLE_LDAP_CANNOT_BIND);
+ insint_c(d, "E_LDAP_SEARCH_FAILED", CURLE_LDAP_SEARCH_FAILED);
+ insint_c(d, "E_LIBRARY_NOT_FOUND", CURLE_LIBRARY_NOT_FOUND);
+ insint_c(d, "E_FUNCTION_NOT_FOUND", CURLE_FUNCTION_NOT_FOUND);
+ insint_c(d, "E_ABORTED_BY_CALLBACK", CURLE_ABORTED_BY_CALLBACK);
+ insint_c(d, "E_BAD_FUNCTION_ARGUMENT", CURLE_BAD_FUNCTION_ARGUMENT);
+ insint_c(d, "E_INTERFACE_FAILED", CURLE_INTERFACE_FAILED);
+ insint_c(d, "E_TOO_MANY_REDIRECTS", CURLE_TOO_MANY_REDIRECTS);
+ insint_c(d, "E_UNKNOWN_TELNET_OPTION", CURLE_UNKNOWN_TELNET_OPTION);
+ insint_c(d, "E_TELNET_OPTION_SYNTAX", CURLE_TELNET_OPTION_SYNTAX);
+ insint_c(d, "E_SSL_PEER_CERTIFICATE", CURLE_SSL_PEER_CERTIFICATE);
+ insint_c(d, "E_GOT_NOTHING", CURLE_GOT_NOTHING);
+ insint_c(d, "E_SSL_ENGINE_NOTFOUND", CURLE_SSL_ENGINE_NOTFOUND);
+ insint_c(d, "E_SSL_ENGINE_SETFAILED", CURLE_SSL_ENGINE_SETFAILED);
+ insint_c(d, "E_SEND_ERROR", CURLE_SEND_ERROR);
+ insint_c(d, "E_RECV_ERROR", CURLE_RECV_ERROR);
+ insint_c(d, "E_SHARE_IN_USE", CURLE_SHARE_IN_USE);
+ insint_c(d, "E_SSL_CERTPROBLEM", CURLE_SSL_CERTPROBLEM);
+ insint_c(d, "E_SSL_CIPHER", CURLE_SSL_CIPHER);
+ insint_c(d, "E_SSL_CACERT", CURLE_SSL_CACERT);
+ insint_c(d, "E_BAD_CONTENT_ENCODING", CURLE_BAD_CONTENT_ENCODING);
+ insint_c(d, "E_LDAP_INVALID_URL", CURLE_LDAP_INVALID_URL);
+ insint_c(d, "E_FILESIZE_EXCEEDED", CURLE_FILESIZE_EXCEEDED);
+ insint_c(d, "E_FTP_SSL_FAILED", CURLE_FTP_SSL_FAILED);
+ insint_c(d, "E_SEND_FAIL_REWIND", CURLE_SEND_FAIL_REWIND);
+ insint_c(d, "E_SSL_ENGINE_INITFAILED", CURLE_SSL_ENGINE_INITFAILED);
+ insint_c(d, "E_LOGIN_DENIED", CURLE_LOGIN_DENIED);
+ insint_c(d, "E_TFTP_NOTFOUND", CURLE_TFTP_NOTFOUND);
+ insint_c(d, "E_TFTP_PERM", CURLE_TFTP_PERM);
+ insint_c(d, "E_TFTP_DISKFULL",CURLE_TFTP_DISKFULL );
+ insint_c(d, "E_TFTP_ILLEGAL",CURLE_TFTP_ILLEGAL );
+ insint_c(d, "E_TFTP_UNKNOWNID",CURLE_TFTP_UNKNOWNID );
+ insint_c(d, "E_TFTP_EXISTS", CURLE_TFTP_EXISTS);
+ insint_c(d, "E_TFTP_NOSUCHUSER",CURLE_TFTP_NOSUCHUSER );
+ insint_c(d, "E_CONV_FAILED",CURLE_CONV_FAILED );
+ insint_c(d, "E_CONV_REQD",CURLE_CONV_REQD );
+ insint_c(d, "E_SSL_CACERT_BADFILE", CURLE_SSL_CACERT_BADFILE);
+ insint_c(d, "E_REMOTE_FILE_NOT_FOUND",CURLE_REMOTE_FILE_NOT_FOUND );
+ insint_c(d, "E_SSH",CURLE_SSH );
+ insint_c(d, "E_SSL_SHUTDOWN_FAILED",CURLE_SSL_SHUTDOWN_FAILED );
/* curl_proxytype: constants for setopt(PROXYTYPE, x) */
insint_c(d, "PROXYTYPE_HTTP", CURLPROXY_HTTP);
@@ -3072,8 +3410,14 @@
insint_c(d, "FORM_CONTENTTYPE", CURLFORM_CONTENTTYPE);
insint_c(d, "FORM_FILENAME", CURLFORM_FILENAME);
+ /* FTP_FILEMETHOD options */
+ insint_c(d, "FTPMETHOD_DEFAULT", CURLFTPMETHOD_DEFAULT);
+ insint_c(d, "FTPMETHOD_MULTICWD", CURLFTPMETHOD_MULTICWD);
+ insint_c(d, "FTPMETHOD_NOCWD", CURLFTPMETHOD_NOCWD);
+ insint_c(d, "FTPMETHOD_SINGLECWD", CURLFTPMETHOD_SINGLECWD);
+
/* CURLoption: symbolic constants for setopt() */
-/* FIXME: reorder these to match */
+ /* FIXME: reorder these to match */
insint_c(d, "FILE", CURLOPT_WRITEDATA);
insint_c(d, "URL", CURLOPT_URL);
insint_c(d, "PORT", CURLOPT_PORT);
@@ -3138,7 +3482,6 @@
insint_c(d, "OPT_FILETIME", CURLOPT_FILETIME);
insint_c(d, "MAXREDIRS", CURLOPT_MAXREDIRS);
insint_c(d, "MAXCONNECTS", CURLOPT_MAXCONNECTS);
- insint_c(d, "CLOSEPOLICY", CURLOPT_CLOSEPOLICY);
insint_c(d, "FRESH_CONNECT", CURLOPT_FRESH_CONNECT);
insint_c(d, "FORBID_REUSE", CURLOPT_FORBID_REUSE);
insint_c(d, "RANDOM_FILE", CURLOPT_RANDOM_FILE);
@@ -3180,24 +3523,29 @@
insint_c(d, "FTP_SSL", CURLOPT_FTP_SSL);
insint_c(d, "POSTFIELDSIZE_LARGE", CURLOPT_POSTFIELDSIZE_LARGE);
insint_c(d, "TCP_NODELAY", CURLOPT_TCP_NODELAY);
- insint_c(d, "SOURCE_USERPWD", CURLOPT_SOURCE_USERPWD);
- insint_c(d, "SOURCE_PREQUOTE", CURLOPT_SOURCE_PREQUOTE);
- insint_c(d, "SOURCE_POSTQUOTE", CURLOPT_SOURCE_POSTQUOTE);
insint_c(d, "FTPSSLAUTH", CURLOPT_FTPSSLAUTH);
insint_c(d, "IOCTLFUNCTION", CURLOPT_IOCTLFUNCTION);
insint_c(d, "IOCTLDATA", CURLOPT_IOCTLDATA);
- insint_c(d, "SOURCE_URL", CURLOPT_SOURCE_URL);
- insint_c(d, "SOURCE_QUOTE", CURLOPT_SOURCE_QUOTE);
insint_c(d, "FTP_ACCOUNT", CURLOPT_FTP_ACCOUNT);
insint_c(d, "IGNORE_CONTENT_LENGTH", CURLOPT_IGNORE_CONTENT_LENGTH);
insint_c(d, "COOKIELIST", CURLOPT_COOKIELIST);
insint_c(d, "FTP_SKIP_PASV_IP", CURLOPT_FTP_SKIP_PASV_IP);
+ insint_c(d, "FTP_FILEMETHOD", CURLOPT_FTP_FILEMETHOD);
insint_c(d, "CONNECT_ONLY", CURLOPT_CONNECT_ONLY);
insint_c(d, "LOCALPORT", CURLOPT_LOCALPORT);
insint_c(d, "LOCALPORTRANGE", CURLOPT_LOCALPORTRANGE);
insint_c(d, "FTP_ALTERNATIVE_TO_USER", CURLOPT_FTP_ALTERNATIVE_TO_USER);
insint_c(d, "MAX_SEND_SPEED_LARGE", CURLOPT_MAX_SEND_SPEED_LARGE);
insint_c(d, "MAX_RECV_SPEED_LARGE", CURLOPT_MAX_RECV_SPEED_LARGE);
+ insint_c(d, "SSL_SESSIONID_CACHE", CURLOPT_SSL_SESSIONID_CACHE);
+ insint_c(d, "SSH_AUTH_TYPES", CURLOPT_SSH_AUTH_TYPES);
+ insint_c(d, "SSH_PUBLIC_KEYFILE", CURLOPT_SSH_PUBLIC_KEYFILE);
+ insint_c(d, "SSH_PRIVATE_KEYFILE", CURLOPT_SSH_PRIVATE_KEYFILE);
+ insint_c(d, "FTP_SSL_CCC", CURLOPT_FTP_SSL_CCC);
+
+ insint_c(d, "M_TIMERFUNCTION", CURLMOPT_TIMERFUNCTION);
+ insint_c(d, "M_SOCKETFUNCTION", CURLMOPT_SOCKETFUNCTION);
+ insint_c(d, "M_PIPELINING", CURLMOPT_PIPELINING);
/* constants for setopt(IPRESOLVE, x) */
insint_c(d, "IPRESOLVE_WHATEVER", CURL_IPRESOLVE_WHATEVER);
@@ -3227,6 +3575,15 @@
insint_c(d, "TIMECONDITION_IFUNMODSINCE", CURL_TIMECOND_IFUNMODSINCE);
insint_c(d, "TIMECONDITION_LASTMOD", CURL_TIMECOND_LASTMOD);
+ /* constants for setopt(CURLOPT_SSH_AUTH_TYPES, x) */
+ insint_c(d, "SSH_AUTH_ANY", CURLSSH_AUTH_ANY);
+ insint_c(d, "SSH_AUTH_NONE", CURLSSH_AUTH_NONE);
+ insint_c(d, "SSH_AUTH_PUBLICKEY", CURLSSH_AUTH_PUBLICKEY);
+ insint_c(d, "SSH_AUTH_PASSWORD", CURLSSH_AUTH_PASSWORD);
+ insint_c(d, "SSH_AUTH_HOST", CURLSSH_AUTH_HOST);
+ insint_c(d, "SSH_AUTH_KEYBOARD", CURLSSH_AUTH_KEYBOARD);
+ insint_c(d, "SSH_AUTH_DEFAULT", CURLSSH_AUTH_DEFAULT);
+
/* CURLINFO: symbolic constants for getinfo(x) */
insint_c(d, "EFFECTIVE_URL", CURLINFO_EFFECTIVE_URL);
insint_c(d, "HTTP_CODE", CURLINFO_HTTP_CODE);
@@ -3259,13 +3616,6 @@
insint_c(d, "LASTSOCKET", CURLINFO_LASTSOCKET);
insint_c(d, "FTP_ENTRY_PATH", CURLINFO_FTP_ENTRY_PATH);
- /* curl_closepolicy: constants for setopt(CLOSEPOLICY, x) */
- insint_c(d, "CLOSEPOLICY_OLDEST", CURLCLOSEPOLICY_OLDEST);
- insint_c(d, "CLOSEPOLICY_LEAST_RECENTLY_USED", CURLCLOSEPOLICY_LEAST_RECENTLY_USED);
- insint_c(d, "CLOSEPOLICY_LEAST_TRAFFIC", CURLCLOSEPOLICY_LEAST_TRAFFIC);
- insint_c(d, "CLOSEPOLICY_SLOWEST", CURLCLOSEPOLICY_SLOWEST);
- insint_c(d, "CLOSEPOLICY_CALLBACK", CURLCLOSEPOLICY_CALLBACK);
-
/* options for global_init() */
insint(d, "GLOBAL_SSL", CURL_GLOBAL_SSL);
insint(d, "GLOBAL_WIN32", CURL_GLOBAL_WIN32);
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/pycurl-7.15.5.1/tests/test_multi_socket.py new/pycurl-7.16.1/tests/test_multi_socket.py
--- old/pycurl-7.15.5.1/tests/test_multi_socket.py 1970-01-01 01:00:00.000000000 +0100
+++ new/pycurl-7.16.1/tests/test_multi_socket.py 2006-11-10 16:03:05.000000000 +0100
@@ -0,0 +1,82 @@
+#! /usr/bin/env python
+# -*- coding: iso-8859-1 -*-
+# vi:ts=4:et
+# $Id: test_multi_socket.py,v 1.1 2006/11/10 15:03:05 kjetilja Exp $
+
+import os, sys
+try:
+ from cStringIO import StringIO
+except ImportError:
+ from StringIO import StringIO
+import pycurl
+
+
+urls = (
+ "http://curl.haxx.se",
+ "http://www.python.org",
+ "http://pycurl.sourceforge.net",
+)
+
+# Read list of URIs from file specified on commandline
+try:
+ urls = open(sys.argv[1], "rb").readlines()
+except IndexError:
+ # No file was specified
+ pass
+
+# timer callback
+def timer(msecs):
+ print 'Timer callback msecs:', msecs
+
+# socket callback
+def socket(event, socket, multi, data):
+ print event, socket, multi, data
+# multi.assign(socket, timer)
+
+# init
+m = pycurl.CurlMulti()
+m.setopt(pycurl.M_PIPELINING, 1)
+m.setopt(pycurl.M_TIMERFUNCTION, timer)
+m.setopt(pycurl.M_SOCKETFUNCTION, socket)
+m.handles = []
+for url in urls:
+ c = pycurl.Curl()
+ # save info in standard Python attributes
+ c.url = url
+ c.body = StringIO()
+ c.http_code = -1
+ m.handles.append(c)
+ # pycurl API calls
+ c.setopt(c.URL, c.url)
+ c.setopt(c.WRITEFUNCTION, c.body.write)
+ m.add_handle(c)
+
+# get data
+num_handles = len(m.handles)
+while num_handles:
+ while 1:
+ ret, num_handles = m.socket_all()
+ if ret != pycurl.E_CALL_MULTI_PERFORM:
+ break
+ # currently no more I/O is pending, could do something in the meantime
+ # (display a progress bar, etc.)
+ m.select(1.0)
+
+# close handles
+for c in m.handles:
+ # save info in standard Python attributes
+ c.http_code = c.getinfo(c.HTTP_CODE)
+ # pycurl API calls
+ m.remove_handle(c)
+ c.close()
+m.close()
+
+# print result
+for c in m.handles:
+ data = c.body.getvalue()
+ if 0:
+ print "**********", c.url, "**********"
+ print data
+ else:
+ print "%-53s http_code %3d, %6d bytes" % (c.url, c.http_code, len(data))
+
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/pycurl-7.15.5.1/tests/test_multi_timer.py new/pycurl-7.16.1/tests/test_multi_timer.py
--- old/pycurl-7.15.5.1/tests/test_multi_timer.py 1970-01-01 01:00:00.000000000 +0100
+++ new/pycurl-7.16.1/tests/test_multi_timer.py 2006-11-10 13:25:29.000000000 +0100
@@ -0,0 +1,76 @@
+#! /usr/bin/env python
+# -*- coding: iso-8859-1 -*-
+# vi:ts=4:et
+# $Id: test_multi_timer.py,v 1.1 2006/11/10 12:25:29 kjetilja Exp $
+
+import os, sys
+try:
+ from cStringIO import StringIO
+except ImportError:
+ from StringIO import StringIO
+import pycurl
+
+
+urls = (
+ "http://curl.haxx.se",
+ "http://www.python.org",
+ "http://pycurl.sourceforge.net",
+)
+
+# Read list of URIs from file specified on commandline
+try:
+ urls = open(sys.argv[1], "rb").readlines()
+except IndexError:
+ # No file was specified
+ pass
+
+# timer callback
+def timer(msecs):
+ print 'Timer callback msecs:', msecs
+
+# init
+m = pycurl.CurlMulti()
+m.setopt(pycurl.M_PIPELINING, 1)
+m.setopt(pycurl.M_TIMERFUNCTION, timer)
+m.handles = []
+for url in urls:
+ c = pycurl.Curl()
+ # save info in standard Python attributes
+ c.url = url
+ c.body = StringIO()
+ c.http_code = -1
+ m.handles.append(c)
+ # pycurl API calls
+ c.setopt(c.URL, c.url)
+ c.setopt(c.WRITEFUNCTION, c.body.write)
+ m.add_handle(c)
+
+# get data
+num_handles = len(m.handles)
+while num_handles:
+ while 1:
+ ret, num_handles = m.perform()
+ if ret != pycurl.E_CALL_MULTI_PERFORM:
+ break
+ # currently no more I/O is pending, could do something in the meantime
+ # (display a progress bar, etc.)
+ m.select(1.0)
+
+# close handles
+for c in m.handles:
+ # save info in standard Python attributes
+ c.http_code = c.getinfo(c.HTTP_CODE)
+ # pycurl API calls
+ m.remove_handle(c)
+ c.close()
+m.close()
+
+# print result
+for c in m.handles:
+ data = c.body.getvalue()
+ if 0:
+ print "**********", c.url, "**********"
+ print data
+ else:
+ print "%-53s http_code %3d, %6d bytes" % (c.url, c.http_code, len(data))
+
diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/pycurl-7.15.5.1/TODO new/pycurl-7.16.1/TODO
--- old/pycurl-7.15.5.1/TODO 2005-03-06 15:03:07.000000000 +0100
+++ new/pycurl-7.16.1/TODO 2007-03-04 20:32:23.000000000 +0100
@@ -1,4 +1,4 @@
-# $Id: TODO,v 1.96 2005/03/06 14:03:07 kjetilja Exp $
+# $Id: TODO,v 1.97 2007/03/04 19:32:23 kjetilja Exp $
# vi:ts=4:et
If you want to hack on pycurl, here's our list of unresolved issues:
@@ -6,8 +6,6 @@
NEW FEATURES/IMPROVEMENTS:
- * Add all error constants to the pycurl namespace.
-
* Add docs to the high-level interface.
* Add more options to the undocumented and currently mostly useless
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Remember to have fun...
---------------------------------------------------------------------
To unsubscribe, e-mail: opensuse-commit+unsubscribe@opensuse.org
For additional commands, e-mail: opensuse-commit+help@opensuse.org