php - tipos - transferencia abierta o cerrada
Curl error 18-transferencia cerrada con datos de lectura pendientes remanentes (6)
Apuesto a que esto está relacionado con un encabezado de longitud de contenido incorrecto enviado por el par. Mi consejo es dejar que curl establezca la longitud por sí mismo.
cuando recupero datos de una URL usando curl, a veces (en 80% de los casos) obtengo
error 18: transferencia cerrada con datos pendientes de lectura restantes
Parte de los datos devueltos falta entonces. Lo extraño es que esto nunca ocurre cuando el CURLOPT_RETURNTRANSFER se establece en falso, es decir, la función curl_exec no devuelve los datos, sino que muestra el contenido directamente.
¿Cual podría ser el problema? ¿Puedo establecer algunas de las opciones para evitar dicho comportamiento?
¡Muchas gracias por sus sugerencias!
He resuelto este error de esta manera.
$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;
Aún se produce un error, pero puedo manejar los datos de respuesta en la variable.
La cadena de error es exactamente lo que libcurl ve: dado que recibe una secuencia de codificación fragmentada, sabe cuándo quedan datos en un fragmento para recibir. Cuando se cierra la conexión, libcurl sabe que el último fragmento recibido estaba incompleto. Entonces obtienes este código de error.
No hay nada que pueda hacer para evitar este error con la solicitud sin modificar, pero puede intentar solucionarlo emitiendo una solicitud de HTTP 1.0 en su lugar (ya que la codificación fragmentada no se producirá), pero el hecho es que es muy probable que se trate de un error en el servidor o en su red / configuración de alguna manera.
Recibí este error cuando mi proceso de servidor recibió una excepción a mitad de camino durante la generación de la respuesta y simplemente cerré la conexión sin decir adiós. curl todavía esperaba datos de la conexión y se quejó (con razón).
Tuve el mismo problema, pero logré solucionarlo suprimiendo el encabezado ''Expect: 100-continue'' que generalmente envía cURL (el siguiente es código PHP, pero debería funcionar de manera similar con otras API de cURL):
curl_setopt($curl, CURLOPT_HTTPHEADER, array(''Expect:''));
Por cierto, estoy enviando llamadas al servidor HTTP que está incluido en el material JDK 6 REST, que tiene todo tipo de problemas. En este caso, primero envía una respuesta de 100, y luego con algunas solicitudes no envía la siguiente respuesta 200 correctamente.
Tuve este problema trabajando con pycurl y lo resolví usando
c.setopt(pycurl.HTTP_VERSION, pycurl.CURL_HTTP_VERSION_1_0)
como dice Eric Caron .