我检查了pycurl.CurlMulti.info_read 的源代码,它显示:
/* 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 是从L781 检索到的:
/* 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 和co->error 设置为src/easy.c#L52:
/* 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 对象没有被重用于另一个连接或被销毁,在pycurl.CurlMulti.info_read() 的返回值中使用curl error message 应该是相当安全的。
这个答案给了我另一个有趣的事实:
在pycurl.Curl 对象上设置CURLOPT_PRIVATE 是不安全的。