我正在pycurl.CurlMulti
中使用python3
接口,并且想使用info_read
检查连接成功与否。
根据c
的{{1}}接口curl_multi_info_read的文档:
警告:返回的指针所指向的数据将无法通过调用curl_multi_cleanup,curl_multi_remove_handle或curl_easy_cleanup而保留。
但是,pycurl.CurlMulti的文档没有提及在调用libcurl
之后,curl error message
的返回值中的pycurl.CurlMulti.info_read()
是否有效。
唯一的检查方法是读取curl_multi_remove_handle
的源代码。
答案 0 :(得分:0)
我检查了pycurl.CurlMulti.info_read的源代码,它表明:
pycurl
从L781中检索 /* When an error occurs */
else {
/* Create a result tuple that will get added to err_list. */
PyObject *v = Py_BuildValue("(Ois)", (PyObject *)co, (int)msg->data.result, co->error);
/* Append curl object to list of objects which failed */
if (v == NULL || PyList_Append(err_list, v) != 0) {
Py_XDECREF(v);
goto error;
}
Py_DECREF(v);
}
的地方:
co
并将 /* Fetch the curl object that corresponds to the curl handle in the message */
res = curl_easy_getinfo(msg->easy_handle, CURLINFO_PRIVATE, (char **) &co);
和CURLINFO_PRIVATE
设置为src/easy.c#L52:
co->error
这意味着给定 /* Set curl error buffer and zero it */
res = curl_easy_setopt(self->handle, CURLOPT_ERRORBUFFER, self->error);
if (res != CURLE_OK) {
return (-1);
}
memset(self->error, 0, sizeof(self->error));
/* Set backreference */
res = curl_easy_setopt(self->handle, CURLOPT_PRIVATE, (char *) self);
if (res != CURLE_OK) {
return (-1);
}
对象不会再用于其他连接或被销毁,在返回值pycurl.Curl
中使用curl error message
应该很安全。
这个答案给了我另一个有趣的事实:
在pycurl.CurlMulti.info_read()
对象上设置CURLOPT_PRIVATE
是不安全的。