ошибка скручивания 18 - передача закрыта с оставшимися незавершенными данными чтения - PullRequest
57 голосов
/ 19 ноября 2009

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

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

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

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

Ответы [ 8 ]

42 голосов
/ 04 декабря 2009

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

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

27 голосов
/ 19 ноября 2009

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

5 голосов
/ 04 декабря 2009

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

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

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

1 голос
/ 30 апреля 2019

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

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

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

1 голос
/ 05 февраля 2015

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

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

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

1 голос
/ 27 июля 2014

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

0 голосов
/ 26 января 2019

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

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

0 голосов
/ 24 октября 2012

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

$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;

Ошибка по-прежнему возникает, но я могу обработать данные ответа в переменной.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...