cURL de agregar espacio en blanco para publicar contenido?
Pregunta
Yo estoy intentando POST en contra de un proveedor de servidor usando PHP 5.2 con cURL.Estoy leyendo en un documento XML para publicar en contra de su servidor y, a continuación, leer en una respuesta:
$request = trim(file_get_contents('test.xml'));
$curlHandle = curl_init($servletURL);
curl_setopt($curlHandle, CURLOPT_POST, TRUE);
curl_setopt($curlHandle, CURLOPT_POSTFIELDS, array('XML'=>$request));
curl_setopt($curlHandle, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($curlHandle, CURLOPT_HEADER, FALSE); # Have also tried leaving this out
$response = curl_exec($curlHandle);
Ese código, en una de por sí, funciona bien, pero el otro servidor devuelve una respuesta desde el analizador XML que indica:
El contenido no permitido en prolog
Yo esperaba que de error y esto normalmente es causado por un espacio en blanco antes de que el XML, pero estaba seguro de que el archivo XML en sí no tiene espacios en blanco y el trim() debería aclarar eso de todos modos.Hice un TCPDump en la conexión mientras corrí el código y esto es lo que se envía:
POST {serverURL} HTTP/1.1
Host: {ip of server}:8080
Accept: */*
Content-Length: 921
Expect: 100-continue
Content-Type: multipart/form-data; boundry:---------------------------01e7cda3896f
---------------------------01e7cda3896f
Content-Disposition: form-data; name="XML"
[SNIP - the XML was displayed]
---------------------------01e7cda3896f--
Antes y después de la [SNIP] de la línea no es visible en los espacios en blanco cuando puedo volver a jugar a la sesión en Etéreo.Esto es lo que está causando el problema y, si es así, ¿cómo puedo quitar, o estoy mirando demasiado lejos y esto puede ser un problema con el servidor que voy a postear en contra?
Solución 2
Resulta que es un problema de codificación.La aplicación aparentemente necesidades de los XML en www-form-urlencoded en lugar de la forma-datos, por lo que tuve que cambiar:
# This sets the encoding to multipart/form-data
curl_setopt($curlHandle, CURLOPT_POSTFIELDS, array('XML'=>$request));
a
# This sets it to application/x-www-form-urlencoded
curl_setopt($curlHandle, CURLOPT_POSTFIELDS, 'XML=' . urlencode($request));
Otros consejos
No una respuesta, pero me parece que todo el fopen/fread/fclose cosa muy aburrido para leer cuando se mira en el código.
Puede reemplazar:
$file = 'test.xml';
$fileHandle = fopen($file, 'r');
$request = fread($fileHandle, filesize($file));
fclose($fileHandle);
$request = trim($request);
Con:
$request = trim(file_get_contents('test.xml'));
Pero de todos modos a su pregunta;si esos son los encabezados que están siendo enviados, entonces no debería ser un problema con el servidor remoto.Pruebe a cambiar el contenido de su archivo xml y el uso de la función var_dump() para comprobar el resultado exacto (incluyendo la longitud de la cuerda, de modo que usted puede buscar que faltan cosas)
Espero que ayude
Hice un wc -m test.xml
y volvió con 743 caracteres en el archivo XML y el var_dump
en $request
vuelve con 742 caracteres para que algo se está poniendo despojado con trim()
(Asumo).
Yo hice:
print "=====" . $request . "=====";
y el inicio y el final de la XML colillas de arriba a la derecha contra el ===== con ningún espacio en blanco.