summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakob Truelsen <jakob@scalgo.com>2014-01-13 17:29:44 +0100
committerOleg Pudeyev <oleg@bsdpower.com>2014-01-14 20:37:38 -0500
commit3581c970db79920d044c5e74f326e50a5eaad567 (patch)
tree7b8b84f6567553026aa36451d919e432952c9f9e
parentd3a39a5e750a7336fe8f05e68327cc97b53da31d (diff)
downloadpycurl-3581c970db79920d044c5e74f326e50a5eaad567.tar.gz
Expose additional multi options
Expose the multi options: * CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE * CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE * CURLMOPT_MAX_HOST_CONNECTIONS * CURLMOPT_MAX_PIPELINE_LENGTH * CURLMOPT_MAX_TOTAL_CONNECTIONS
-rw-r--r--src/pycurl.c22
-rw-r--r--tests/multi_test.py14
2 files changed, 33 insertions, 3 deletions
diff --git a/src/pycurl.c b/src/pycurl.c
index 0a9f7b8..5126004 100644
--- a/src/pycurl.c
+++ b/src/pycurl.c
@@ -117,6 +117,10 @@
#define HAVE_CURL_REDIR_POST_303
#endif
+#if LIBCURL_VERSION_NUM >= 0x071E00 /* check for 7.30.0 or greater */
+#define HAVE_CURL_PIPELINEOPTS
+#endif
+
/* Python < 2.5 compat for Py_ssize_t */
#if PY_VERSION_HEX < 0x02050000
typedef int Py_ssize_t;
@@ -3200,10 +3204,15 @@ do_multi_setopt(CurlMultiObject *self, PyObject *args)
if (PyInt_Check(obj)) {
long d = PyInt_AsLong(obj);
switch(option) {
- case CURLMOPT_PIPELINING:
- curl_multi_setopt(self->multi_handle, option, d);
- break;
case CURLMOPT_MAXCONNECTS:
+ case CURLMOPT_PIPELINING:
+#ifdef HAVE_CURL_PIPELINEOPTS
+ case CURLMOPT_MAX_HOST_CONNECTIONS:
+ case CURLMOPT_MAX_TOTAL_CONNECTIONS:
+ case CURLMOPT_MAX_PIPELINE_LENGTH:
+ case CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE:
+ case CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE:
+#endif
curl_multi_setopt(self->multi_handle, option, d);
break;
default:
@@ -4870,6 +4879,13 @@ initpycurl(void)
insint_c(d, "M_SOCKETFUNCTION", CURLMOPT_SOCKETFUNCTION);
insint_c(d, "M_PIPELINING", CURLMOPT_PIPELINING);
insint_c(d, "M_MAXCONNECTS", CURLMOPT_MAXCONNECTS);
+#ifdef HAVE_CURL_PIPELINEOPTS
+ insint_c(d, "M_MAX_HOST_CONNECTIONS", CURLMOPT_MAX_HOST_CONNECTIONS);
+ insint_c(d, "M_MAX_TOTAL_CONNECTIONS", CURLMOPT_MAX_TOTAL_CONNECTIONS);
+ insint_c(d, "M_MAX_PIPELINE_LENGTH", CURLMOPT_MAX_PIPELINE_LENGTH);
+ insint_c(d, "M_CONTENT_LENGTH_PENALTY_SIZE", CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE);
+ insint_c(d, "M_CHUNK_LENGTH_PENALTY_SIZE", CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE);
+#endif
/* constants for setopt(IPRESOLVE, x) */
insint_c(d, "IPRESOLVE_WHATEVER", CURL_IPRESOLVE_WHATEVER);
diff --git a/tests/multi_test.py b/tests/multi_test.py
index 1afa674..c90ca89 100644
--- a/tests/multi_test.py
+++ b/tests/multi_test.py
@@ -24,6 +24,20 @@ def teardown_module(mod):
teardown_module_1(mod)
class MultiTest(unittest.TestCase):
+ @util.min_libcurl(7, 30, 0)
+ def test_multi_pipeline_opts(self):
+ assert hasattr(pycurl, 'M_MAX_HOST_CONNECTIONS')
+ assert hasattr(pycurl, 'M_MAX_PIPELINE_LENGTH')
+ assert hasattr(pycurl, 'M_CONTENT_LENGTH_PENALTY_SIZE')
+ assert hasattr(pycurl, 'M_CHUNK_LENGTH_PENALTY_SIZE')
+ assert hasattr(pycurl, 'M_MAX_TOTAL_CONNECTIONS')
+ m = pycurl.CurlMulti()
+ m.setopt(pycurl.M_MAX_HOST_CONNECTIONS, 2)
+ m.setopt(pycurl.M_MAX_PIPELINE_LENGTH, 2)
+ m.setopt(pycurl.M_CONTENT_LENGTH_PENALTY_SIZE, 2)
+ m.setopt(pycurl.M_CHUNK_LENGTH_PENALTY_SIZE, 2)
+ m.setopt(pycurl.M_MAX_TOTAL_CONNECTIONS, 2)
+
def test_multi(self):
io1 = util.BytesIO()
io2 = util.BytesIO()