cURL adicionando espaço em branco para postar conteúdo?
Pergunta
Estou tentando POST no servidor de um fornecedor usando PHP 5.2 com cURL.Estou lendo um documento XML para postar no servidor e depois lendo uma resposta:
$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);
Esse código, por si só, funciona bem, mas o outro servidor retorna uma resposta de seu analisador XML informando:
Conteúdo não permitido no prólogo
Procurei esse erro e isso normalmente é causado por espaços em branco antes do XML, mas me certifiquei de que o arquivo XML em si não tivesse espaços em branco e o trim() deveria esclarecer isso de qualquer maneira.Fiz um TCPDump na conexão enquanto executava o código e foi isso que foi enviado:
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 e depois da linha [SNIP], há espaços em branco visíveis quando reproduzo a sessão no Ethereal.É isso que está causando o problema e, em caso afirmativo, como posso removê-lo ou estou procurando longe demais e isso pode ser um problema com o servidor no qual estou postando?
Solução 2
Acontece que é um problema de codificação.O aplicativo aparentemente precisa do XML em www-form-urlencoded em vez de form-data, então tive que mudar:
# This sets the encoding to multipart/form-data
curl_setopt($curlHandle, CURLOPT_POSTFIELDS, array('XML'=>$request));
para
# This sets it to application/x-www-form-urlencoded
curl_setopt($curlHandle, CURLOPT_POSTFIELDS, 'XML=' . urlencode($request));
Outras dicas
Não é uma resposta, mas acho toda essa coisa de fopen/fread/fclose muito chata de ler quando se olha o código.
Você pode substituir:
$file = 'test.xml';
$fileHandle = fopen($file, 'r');
$request = fread($fileHandle, filesize($file));
fclose($fileHandle);
$request = trim($request);
Com:
$request = trim(file_get_contents('test.xml'));
Mas de qualquer maneira - para a sua pergunta;se esses são os cabeçalhos que estão sendo enviados, não deverá haver problema com o servidor remoto.Tente alterar o conteúdo do seu arquivo xml e usar var_dump() para verificar a saída exata (incluindo o comprimento da string, para que você possa procurar coisas que faltam)
espero que ajude
Eu fiz um wc -m test.xml
e voltou com 743 caracteres no arquivo XML e o var_dump
sobre $request
volta com 742 caracteres, então algo está sendo removido trim()
(Eu assumo).
Eu fiz um:
print "=====" . $request . "=====";
e o início e o fim do XML vão até ===== sem espaço em branco.