Ошибка лотка 18 - передача закрыта с оставленными оставленными данными чтения

при извлечении данных из URL с использованием curl я иногда (в 80% случаев) получаю

ошибка 18: передача закрыта с оставшимися незавершенными данными чтения

Часть возвращаемых данных отсутствует. Странно то, что это никогда не происходит, когда для CURLOPT_RETURNTRANSFER установлено значение false, то есть функция curl_exec не возвращает данные, а отображает содержимое напрямую.

В чем может быть проблема? Могу ли я установить некоторые параметры, чтобы избежать такого поведения?

Ответ 1

Могу поспорить, что это связано с неправильным заголовком Content-Length отправленным партнером. Мой совет: пусть curl сам устанавливает длину.

Ответ 2

Строка ошибки - это просто то, что видит libcurl: поскольку он получает поток закодированного кодирования, он знает, когда есть данные, оставшиеся в куске для получения. Когда соединение закрыто, libcurl знает, что последний полученный фрагмент был неполным. Затем вы получите этот код ошибки.

Нет ничего, что можно было бы сделать, чтобы избежать этой ошибки при неизменном запросе, но вы можете попытаться обойти это, выпустив вместо этого запрос HTTP 1.0 (поскольку кодирование с коротким промежутком не произойдет), но факт в том, что это больше всего вероятно, недостаток на сервере или в вашей сети/настройке как-то.

Ответ 3

У меня была та же проблема, но мне удалось исправить ее, подавив заголовок "Expect: 100-continue", который обычно отправляет cURL (следующий код PHP, но должен работать аналогично другим API cURL):

curl_setopt($curl, CURLOPT_HTTPHEADER, array('Expect:'));

Кстати, я отправляю вызовы на HTTP-сервер, который входит в состав JDK 6 REST, который имеет всевозможные проблемы. В этом случае он сначала отправляет 100 ответов, а затем с некоторыми запросами не отправляет последующий ответ 200.

Ответ 4

Я получил эту ошибку, когда мой серверный процесс получил исключение на полпути во время генерации ответа и просто закрыл соединение, не попрощавшись. curl все еще ожидал данные от соединения и жаловался (по праву).

Ответ 5

У меня была эта проблема с pycurl, и я решил ее с помощью

c.setopt(pycurl.HTTP_VERSION, pycurl.CURL_HTTP_VERSION_1_0) 

как Эрик Карон говорит.

Ответ 6

Я решил эту ошибку таким образом.

$ch = curl_init ();
curl_setopt ( $ch, CURLOPT_URL, 'http://www.someurl/' );
curl_setopt ( $ch, CURLOPT_TIMEOUT, 30);
ob_start();
$response = curl_exec ( $ch );
$data = ob_get_clean();
if(curl_getinfo($ch, CURLINFO_HTTP_CODE) == 200 ) success;

Ошибка все еще происходит, но я могу обрабатывать данные ответа в переменной.

Ответ 7

Я получил эту ошибку, когда я случайно загружал файл на себя.
(Я создал символическую ссылку в sshfs-монтировании удаленного каталога, чтобы сделать его доступным для загрузки, забыл переключить рабочий каталог и использовал -OJ).

Я думаю, что это не очень поможет вам, когда вы прочитаете это, так как это означает, что ваш файл был уничтожен.

Ответ 8

Видя эту ошибку также во время использования Guzzle. Следующий заголовок исправил это для меня:

'headers' => [
    'accept-encoding' => 'gzip, deflate',
],

Я отправил запрос почтальону, который дал мне полный ответ и без ошибок. Затем я начал добавлять заголовки, которые Почтальон отправляет в запрос Guzzle, и это было тем, что исправило это.