Ответ 1
Могу поспорить, что это связано с неправильным заголовком Content-Length
отправленным партнером. Мой совет: пусть curl сам устанавливает длину.
при извлечении данных из URL с использованием curl я иногда (в 80% случаев) получаю
ошибка 18: передача закрыта с оставшимися незавершенными данными чтения
Часть возвращаемых данных отсутствует. Странно то, что это никогда не происходит, когда для CURLOPT_RETURNTRANSFER установлено значение false, то есть функция curl_exec не возвращает данные, а отображает содержимое напрямую.
В чем может быть проблема? Могу ли я установить некоторые параметры, чтобы избежать такого поведения?
Могу поспорить, что это связано с неправильным заголовком Content-Length
отправленным партнером. Мой совет: пусть curl сам устанавливает длину.
Строка ошибки - это просто то, что видит libcurl: поскольку он получает поток закодированного кодирования, он знает, когда есть данные, оставшиеся в куске для получения. Когда соединение закрыто, libcurl знает, что последний полученный фрагмент был неполным. Затем вы получите этот код ошибки.
Нет ничего, что можно было бы сделать, чтобы избежать этой ошибки при неизменном запросе, но вы можете попытаться обойти это, выпустив вместо этого запрос HTTP 1.0 (поскольку кодирование с коротким промежутком не произойдет), но факт в том, что это больше всего вероятно, недостаток на сервере или в вашей сети/настройке как-то.
У меня была та же проблема, но мне удалось исправить ее, подавив заголовок "Expect: 100-continue", который обычно отправляет cURL (следующий код PHP, но должен работать аналогично другим API cURL):
curl_setopt($curl, CURLOPT_HTTPHEADER, array('Expect:'));
Кстати, я отправляю вызовы на HTTP-сервер, который входит в состав JDK 6 REST, который имеет всевозможные проблемы. В этом случае он сначала отправляет 100 ответов, а затем с некоторыми запросами не отправляет последующий ответ 200.
Я получил эту ошибку, когда мой серверный процесс получил исключение на полпути во время генерации ответа и просто закрыл соединение, не попрощавшись. curl все еще ожидал данные от соединения и жаловался (по праву).
У меня была эта проблема с pycurl, и я решил ее с помощью
c.setopt(pycurl.HTTP_VERSION, pycurl.CURL_HTTP_VERSION_1_0)
как Эрик Карон говорит.
Я решил эту ошибку таким образом.
$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;
Ошибка все еще происходит, но я могу обрабатывать данные ответа в переменной.
Я получил эту ошибку, когда я случайно загружал файл на себя.
(Я создал символическую ссылку в sshfs-монтировании удаленного каталога, чтобы сделать его доступным для загрузки, забыл переключить рабочий каталог и использовал -OJ
).
Я думаю, что это не очень поможет вам, когда вы прочитаете это, так как это означает, что ваш файл был уничтожен.
Видя эту ошибку также во время использования Guzzle. Следующий заголовок исправил это для меня:
'headers' => [
'accept-encoding' => 'gzip, deflate',
],
Я отправил запрос почтальону, который дал мне полный ответ и без ошибок. Затем я начал добавлять заголовки, которые Почтальон отправляет в запрос Guzzle, и это было тем, что исправило это.