Можно ли использовать возвращаемое значение pycurl.CurlMulti.info_read после вызова remove_handle? - PullRequest
0 голосов
/ 01 мая 2019

Я использую pycurl.CurlMulti интерфейс в python3 и хочу использовать info_read для проверки успешных и неудачных соединений.

В соответствии с документацией интерфейса c curl_multi_info_read из libcurl:

ПРЕДУПРЕЖДЕНИЕ: данные, на которые указывает возвращенный указатель, не сохранятся, вызывая curl_multi_cleanup, curl_multi_remove_handle или curl_easy_cleanup.

Однако документация pycurl.CurlMulti не упоминает, является ли curl error message в возвращаемом значении pycurl.CurlMulti.info_read() допустимым после вызова curl_multi_remove_handle.

Единственный способ проверить это - прочитатьисходный код pycurl.

1 Ответ

0 голосов
/ 01 мая 2019

Я проверил исходный код для 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объект не используется повторно для другого соединения или разрушен, поэтому довольно безопасно использовать curl error message в возвращаемом значении pycurl.CurlMulti.info_read().

Этот ответ дает мне еще один интересный факт:

Необязательно устанавливать CURLOPT_PRIVATE для объекта pycurl.Curl.

...