调用remove_handle之后,pycurl.CurlMulti.info_read的返回值是否仍然可用?

时间:2019-05-01 12:20:05

标签: libcurl pycurl

我正在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的源代码。

1 个答案:

答案 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是不安全的。