2217
/* --------------- setopt --------------- */
2219
int multi_socket_callback(CURL *easy,
2225
CurlMultiObject *self;
2226
CurlObject *easy_self;
2227
PyThreadState *tmp_state;
2229
PyObject *result = NULL;
2232
/* acquire thread */
2233
self = (CurlMultiObject *)userp;
2234
ret = curl_easy_getinfo(easy, CURLINFO_PRIVATE, &easy_self);
2235
tmp_state = get_thread_state_multi(self);
2236
if (tmp_state == NULL)
2238
PyEval_AcquireThread(tmp_state);
2241
if (self->s_cb == NULL)
2244
if (socketp == NULL) {
2250
arglist = Py_BuildValue("(iiOO)", what, s, userp, (PyObject *)socketp);
2251
if (arglist == NULL)
2253
result = PyEval_CallObject(self->s_cb, arglist);
2258
/* return values from socket callbacks should be ignored */
2262
PyEval_ReleaseThread(tmp_state);
2271
int multi_timer_callback(CURLM *multi,
2275
CurlMultiObject *self;
2276
PyThreadState *tmp_state;
2278
PyObject *result = NULL;
2279
int ret = 0; /* always success */
2283
/* acquire thread */
2284
self = (CurlMultiObject *)userp;
2285
tmp_state = get_thread_state_multi(self);
2286
if (tmp_state == NULL)
2288
PyEval_AcquireThread(tmp_state);
2291
if (self->t_cb == NULL)
2295
arglist = Py_BuildValue("(i)", timeout_ms);
2296
if (arglist == NULL)
2298
result = PyEval_CallObject(self->t_cb, arglist);
2303
/* return values from timer callbacks should be ignored */
2307
PyEval_ReleaseThread(tmp_state);
2318
do_multi_setopt(CurlMultiObject *self, PyObject *args)
2323
if (!PyArg_ParseTuple(args, "iO:setopt", &option, &obj))
2325
if (check_multi_state(self, 1 | 2, "setopt") != 0)
2328
/* Early checks of option value */
2331
if (option >= (int)CURLOPTTYPE_OFF_T + MOPTIONS_SIZE)
2333
if (option % 10000 >= MOPTIONS_SIZE)
2336
/* Handle the case of integer arguments */
2337
if (PyInt_Check(obj)) {
2338
long d = PyInt_AsLong(obj);
2340
case CURLMOPT_PIPELINING:
2341
curl_multi_setopt(self->multi_handle, option, d);
2344
PyErr_SetString(PyExc_TypeError, "integers are not supported for this option");
2350
if (PyFunction_Check(obj) || PyCFunction_Check(obj) || PyMethod_Check(obj)) {
2351
/* We use function types here to make sure that our callback
2352
* definitions exactly match the <curl/multi.h> interface.
2354
const curl_multi_timer_callback t_cb = multi_timer_callback;
2355
const curl_socket_callback s_cb = multi_socket_callback;
2358
case CURLMOPT_SOCKETFUNCTION:
2359
curl_multi_setopt(self->multi_handle, CURLMOPT_SOCKETFUNCTION, s_cb);
2360
curl_multi_setopt(self->multi_handle, CURLMOPT_SOCKETDATA, self);
2364
case CURLMOPT_TIMERFUNCTION:
2365
curl_multi_setopt(self->multi_handle, CURLMOPT_TIMERFUNCTION, t_cb);
2366
curl_multi_setopt(self->multi_handle, CURLMOPT_TIMERDATA, self);
2371
PyErr_SetString(PyExc_TypeError, "callables are not supported for this option");
2377
/* Failed to match any of the function signatures -- return error */
2379
PyErr_SetString(PyExc_TypeError, "invalid arguments to setopt");
2384
/* --------------- timeout --------------- */
2387
do_multi_timeout(CurlMultiObject *self)
2392
if (check_multi_state(self, 1 | 2, "timeout") != 0) {
2396
res = curl_multi_timeout(self->multi_handle, &timeout);
2397
if (res != CURLM_OK) {
2398
CURLERROR_MSG("timeout failed");
2401
/* Return number of millisecs until timeout */
2402
return Py_BuildValue("i", timeout);
2406
/* --------------- assign --------------- */
2409
do_multi_assign(CurlMultiObject *self, PyObject *args)
2412
curl_socket_t socket;
2415
if (!PyArg_ParseTuple(args, "iO:assign", &socket, &obj))
2417
if (check_multi_state(self, 1 | 2, "assign") != 0) {
2422
res = curl_multi_assign(self->multi_handle, socket, obj);
2423
if (res != CURLM_OK) {
2424
CURLERROR_MSG("assign failed");
2432
/* --------------- socket_all --------------- */
2435
do_multi_socket_all(CurlMultiObject *self)
2440
if (check_multi_state(self, 1 | 2, "socket_all") != 0) {
2444
/* Release global lock and start */
2445
self->state = PyThreadState_Get();
2446
assert(self->state != NULL);
2447
Py_BEGIN_ALLOW_THREADS
2448
res = curl_multi_socket_all(self->multi_handle, &running);
2449
Py_END_ALLOW_THREADS
2452
/* We assume these errors are ok, otherwise throw exception */
2453
if (res != CURLM_OK && res != CURLM_CALL_MULTI_PERFORM) {
2454
CURLERROR_MSG("perform failed");
2457
/* Return a tuple with the result and the number of running handles */
2458
return Py_BuildValue("(ii)", (int)res, running);
2184
2462
/* --------------- perform --------------- */
2187
2464
static PyObject *
2188
2465
do_multi_perform(CurlMultiObject *self)
3036
3321
insint_c(d, "INFOTYPE_SSL_DATA_OUT", CURLINFO_SSL_DATA_OUT);
3038
3323
/* CURLcode: error codes */
3039
/* FIXME: lots of error codes are missing */
3040
3324
insint_c(d, "E_OK", CURLE_OK);
3041
3325
insint_c(d, "E_UNSUPPORTED_PROTOCOL", CURLE_UNSUPPORTED_PROTOCOL);
3326
insint_c(d, "E_FAILED_INIT", CURLE_FAILED_INIT);
3327
insint_c(d, "E_URL_MALFORMAT", CURLE_URL_MALFORMAT);
3328
insint_c(d, "E_COULDNT_RESOLVE_PROXY", CURLE_COULDNT_RESOLVE_PROXY);
3329
insint_c(d, "E_COULDNT_RESOLVE_HOST", CURLE_COULDNT_RESOLVE_HOST);
3330
insint_c(d, "E_COULDNT_CONNECT", CURLE_COULDNT_CONNECT);
3331
insint_c(d, "E_FTP_WEIRD_SERVER_REPLY", CURLE_FTP_WEIRD_SERVER_REPLY);
3332
insint_c(d, "E_FTP_ACCESS_DENIED", CURLE_FTP_ACCESS_DENIED);
3333
insint_c(d, "E_FTP_WEIRD_PASS_REPLY", CURLE_FTP_WEIRD_PASS_REPLY);
3334
insint_c(d, "E_FTP_WEIRD_USER_REPLY", CURLE_FTP_WEIRD_USER_REPLY);
3335
insint_c(d, "E_FTP_WEIRD_PASV_REPLY", CURLE_FTP_WEIRD_PASV_REPLY);
3336
insint_c(d, "E_FTP_WEIRD_227_FORMAT", CURLE_FTP_WEIRD_227_FORMAT);
3337
insint_c(d, "E_FTP_CANT_GET_HOST", CURLE_FTP_CANT_GET_HOST);
3338
insint_c(d, "E_FTP_CANT_RECONNECT", CURLE_FTP_CANT_RECONNECT);
3339
insint_c(d, "E_FTP_COULDNT_SET_BINARY", CURLE_FTP_COULDNT_SET_BINARY);
3340
insint_c(d, "E_PARTIAL_FILE", CURLE_PARTIAL_FILE);
3341
insint_c(d, "E_FTP_COULDNT_RETR_FILE", CURLE_FTP_COULDNT_RETR_FILE);
3342
insint_c(d, "E_FTP_WRITE_ERROR", CURLE_FTP_WRITE_ERROR);
3343
insint_c(d, "E_FTP_QUOTE_ERROR", CURLE_FTP_QUOTE_ERROR);
3344
insint_c(d, "E_HTTP_RETURNED_ERROR", CURLE_HTTP_RETURNED_ERROR);
3345
insint_c(d, "E_WRITE_ERROR", CURLE_WRITE_ERROR);
3346
insint_c(d, "E_FTP_COULDNT_STOR_FILE", CURLE_FTP_COULDNT_STOR_FILE);
3347
insint_c(d, "E_READ_ERROR", CURLE_READ_ERROR);
3348
insint_c(d, "E_OUT_OF_MEMORY", CURLE_OUT_OF_MEMORY);
3349
insint_c(d, "E_OPERATION_TIMEOUTED", CURLE_OPERATION_TIMEOUTED);
3350
insint_c(d, "E_FTP_COULDNT_SET_ASCII", CURLE_FTP_COULDNT_SET_ASCII);
3351
insint_c(d, "E_FTP_PORT_FAILED", CURLE_FTP_PORT_FAILED);
3352
insint_c(d, "E_FTP_COULDNT_USE_REST", CURLE_FTP_COULDNT_USE_REST);
3353
insint_c(d, "E_FTP_COULDNT_GET_SIZE", CURLE_FTP_COULDNT_GET_SIZE);
3354
insint_c(d, "E_HTTP_RANGE_ERROR", CURLE_HTTP_RANGE_ERROR);
3355
insint_c(d, "E_HTTP_POST_ERROR", CURLE_HTTP_POST_ERROR);
3356
insint_c(d, "E_SSL_CONNECT_ERROR", CURLE_SSL_CONNECT_ERROR);
3357
insint_c(d, "E_BAD_DOWNLOAD_RESUME", CURLE_BAD_DOWNLOAD_RESUME);
3358
insint_c(d, "E_FILE_COULDNT_READ_FILE", CURLE_FILE_COULDNT_READ_FILE);
3359
insint_c(d, "E_LDAP_CANNOT_BIND", CURLE_LDAP_CANNOT_BIND);
3360
insint_c(d, "E_LDAP_SEARCH_FAILED", CURLE_LDAP_SEARCH_FAILED);
3361
insint_c(d, "E_LIBRARY_NOT_FOUND", CURLE_LIBRARY_NOT_FOUND);
3362
insint_c(d, "E_FUNCTION_NOT_FOUND", CURLE_FUNCTION_NOT_FOUND);
3363
insint_c(d, "E_ABORTED_BY_CALLBACK", CURLE_ABORTED_BY_CALLBACK);
3364
insint_c(d, "E_BAD_FUNCTION_ARGUMENT", CURLE_BAD_FUNCTION_ARGUMENT);
3365
insint_c(d, "E_INTERFACE_FAILED", CURLE_INTERFACE_FAILED);
3366
insint_c(d, "E_TOO_MANY_REDIRECTS", CURLE_TOO_MANY_REDIRECTS);
3367
insint_c(d, "E_UNKNOWN_TELNET_OPTION", CURLE_UNKNOWN_TELNET_OPTION);
3368
insint_c(d, "E_TELNET_OPTION_SYNTAX", CURLE_TELNET_OPTION_SYNTAX);
3369
insint_c(d, "E_SSL_PEER_CERTIFICATE", CURLE_SSL_PEER_CERTIFICATE);
3370
insint_c(d, "E_GOT_NOTHING", CURLE_GOT_NOTHING);
3371
insint_c(d, "E_SSL_ENGINE_NOTFOUND", CURLE_SSL_ENGINE_NOTFOUND);
3372
insint_c(d, "E_SSL_ENGINE_SETFAILED", CURLE_SSL_ENGINE_SETFAILED);
3373
insint_c(d, "E_SEND_ERROR", CURLE_SEND_ERROR);
3374
insint_c(d, "E_RECV_ERROR", CURLE_RECV_ERROR);
3375
insint_c(d, "E_SHARE_IN_USE", CURLE_SHARE_IN_USE);
3376
insint_c(d, "E_SSL_CERTPROBLEM", CURLE_SSL_CERTPROBLEM);
3377
insint_c(d, "E_SSL_CIPHER", CURLE_SSL_CIPHER);
3378
insint_c(d, "E_SSL_CACERT", CURLE_SSL_CACERT);
3379
insint_c(d, "E_BAD_CONTENT_ENCODING", CURLE_BAD_CONTENT_ENCODING);
3380
insint_c(d, "E_LDAP_INVALID_URL", CURLE_LDAP_INVALID_URL);
3381
insint_c(d, "E_FILESIZE_EXCEEDED", CURLE_FILESIZE_EXCEEDED);
3382
insint_c(d, "E_FTP_SSL_FAILED", CURLE_FTP_SSL_FAILED);
3383
insint_c(d, "E_SEND_FAIL_REWIND", CURLE_SEND_FAIL_REWIND);
3384
insint_c(d, "E_SSL_ENGINE_INITFAILED", CURLE_SSL_ENGINE_INITFAILED);
3385
insint_c(d, "E_LOGIN_DENIED", CURLE_LOGIN_DENIED);
3386
insint_c(d, "E_TFTP_NOTFOUND", CURLE_TFTP_NOTFOUND);
3387
insint_c(d, "E_TFTP_PERM", CURLE_TFTP_PERM);
3388
insint_c(d, "E_TFTP_DISKFULL",CURLE_TFTP_DISKFULL );
3389
insint_c(d, "E_TFTP_ILLEGAL",CURLE_TFTP_ILLEGAL );
3390
insint_c(d, "E_TFTP_UNKNOWNID",CURLE_TFTP_UNKNOWNID );
3391
insint_c(d, "E_TFTP_EXISTS", CURLE_TFTP_EXISTS);
3392
insint_c(d, "E_TFTP_NOSUCHUSER",CURLE_TFTP_NOSUCHUSER );
3393
insint_c(d, "E_CONV_FAILED",CURLE_CONV_FAILED );
3394
insint_c(d, "E_CONV_REQD",CURLE_CONV_REQD );
3395
insint_c(d, "E_SSL_CACERT_BADFILE", CURLE_SSL_CACERT_BADFILE);
3396
insint_c(d, "E_REMOTE_FILE_NOT_FOUND",CURLE_REMOTE_FILE_NOT_FOUND );
3397
insint_c(d, "E_SSH",CURLE_SSH );
3398
insint_c(d, "E_SSL_SHUTDOWN_FAILED",CURLE_SSL_SHUTDOWN_FAILED );
3043
3400
/* curl_proxytype: constants for setopt(PROXYTYPE, x) */
3044
3401
insint_c(d, "PROXYTYPE_HTTP", CURLPROXY_HTTP);
3179
3541
insint_c(d, "FTP_SSL", CURLOPT_FTP_SSL);
3180
3542
insint_c(d, "POSTFIELDSIZE_LARGE", CURLOPT_POSTFIELDSIZE_LARGE);
3181
3543
insint_c(d, "TCP_NODELAY", CURLOPT_TCP_NODELAY);
3182
insint_c(d, "SOURCE_USERPWD", CURLOPT_SOURCE_USERPWD);
3183
insint_c(d, "SOURCE_PREQUOTE", CURLOPT_SOURCE_PREQUOTE);
3184
insint_c(d, "SOURCE_POSTQUOTE", CURLOPT_SOURCE_POSTQUOTE);
3185
3544
insint_c(d, "FTPSSLAUTH", CURLOPT_FTPSSLAUTH);
3186
3545
insint_c(d, "IOCTLFUNCTION", CURLOPT_IOCTLFUNCTION);
3187
3546
insint_c(d, "IOCTLDATA", CURLOPT_IOCTLDATA);
3188
insint_c(d, "SOURCE_URL", CURLOPT_SOURCE_URL);
3189
insint_c(d, "SOURCE_QUOTE", CURLOPT_SOURCE_QUOTE);
3190
3547
insint_c(d, "FTP_ACCOUNT", CURLOPT_FTP_ACCOUNT);
3191
3548
insint_c(d, "IGNORE_CONTENT_LENGTH", CURLOPT_IGNORE_CONTENT_LENGTH);
3192
3549
insint_c(d, "COOKIELIST", CURLOPT_COOKIELIST);
3193
3550
insint_c(d, "FTP_SKIP_PASV_IP", CURLOPT_FTP_SKIP_PASV_IP);
3551
insint_c(d, "FTP_FILEMETHOD", CURLOPT_FTP_FILEMETHOD);
3194
3552
insint_c(d, "CONNECT_ONLY", CURLOPT_CONNECT_ONLY);
3195
3553
insint_c(d, "LOCALPORT", CURLOPT_LOCALPORT);
3196
3554
insint_c(d, "LOCALPORTRANGE", CURLOPT_LOCALPORTRANGE);
3197
3555
insint_c(d, "FTP_ALTERNATIVE_TO_USER", CURLOPT_FTP_ALTERNATIVE_TO_USER);
3198
3556
insint_c(d, "MAX_SEND_SPEED_LARGE", CURLOPT_MAX_SEND_SPEED_LARGE);
3199
3557
insint_c(d, "MAX_RECV_SPEED_LARGE", CURLOPT_MAX_RECV_SPEED_LARGE);
3558
insint_c(d, "SSL_SESSIONID_CACHE", CURLOPT_SSL_SESSIONID_CACHE);
3559
insint_c(d, "SSH_AUTH_TYPES", CURLOPT_SSH_AUTH_TYPES);
3560
insint_c(d, "SSH_PUBLIC_KEYFILE", CURLOPT_SSH_PUBLIC_KEYFILE);
3561
insint_c(d, "SSH_PRIVATE_KEYFILE", CURLOPT_SSH_PRIVATE_KEYFILE);
3562
insint_c(d, "FTP_SSL_CCC", CURLOPT_FTP_SSL_CCC);
3563
insint_c(d, "TIMEOUT_MS", CURLOPT_TIMEOUT_MS);
3564
insint_c(d, "CONNECTTIMEOUT_MS", CURLOPT_CONNECTTIMEOUT_MS);
3565
insint_c(d, "HTTP_TRANSFER_DECODING", CURLOPT_HTTP_TRANSFER_DECODING);
3566
insint_c(d, "HTTP_CONTENT_DECODING", CURLOPT_HTTP_CONTENT_DECODING);
3568
insint_c(d, "M_TIMERFUNCTION", CURLMOPT_TIMERFUNCTION);
3569
insint_c(d, "M_SOCKETFUNCTION", CURLMOPT_SOCKETFUNCTION);
3570
insint_c(d, "M_PIPELINING", CURLMOPT_PIPELINING);
3201
3572
/* constants for setopt(IPRESOLVE, x) */
3202
3573
insint_c(d, "IPRESOLVE_WHATEVER", CURL_IPRESOLVE_WHATEVER);