Pergunta

Estou usando um script perl para POST no aplicativo Google Appengine.Posto um arquivo de texto contendo algum XML usando a opção -F.

http://www.cpan.org/authors/id/E/EL/ELIJAH/bget-1.1

Existe uma versão 1.2, já testada e apresenta o mesmo problema.A postagem é mais ou menos assim.

Host: foo.appspot.com
User-Agent: lwp-request/1.38
Content-Type: text/plain
Content-Length: 202

<XML>
   <BLAH>Hello World</BLAH>
</XML>

Modifiquei o exemplo para que o 202 não esteja certo, não se preocupe com isso.Vamos ao problema.O Content-Length corresponde ao número de bytes no arquivo, no entanto, a menos que eu aumente manualmente o Content-Length, ele não envia todo o arquivo, alguns bytes serão truncados.O número de bytes truncados não é o mesmo para arquivos de tamanhos diferentes.Usei a opção -r no script e consigo ver o que ele está enviando e todo o arquivo está sendo enviado, mas o Google Appengine self.request.body mostra que nem tudo foi recebido.Acho que a solução é obter o número certo para Content-Length e, aparentemente, não é tão simples quanto o número de bytes no arquivo ou o script perl o está destruindo de alguma forma.

Atualizar:Obrigado a Erickson pela resposta certa.Usei printf para acrescentar caracteres ao final do arquivo e ele sempre truncou exatamente o número de linhas do arquivo.Suponho que poderia descobrir o que está sendo adicionado iterando cada caractere no lado do servidor, mas não vale a pena.Isso nem foi respondido nos grupos do Google configurados para o app engine!

Foi útil?

Solução

O número de bytes extras necessários é igual ao número de linhas no arquivo?Pergunto porque talvez seja possível que, de alguma forma, as devoluções de transporte estejam sendo introduzidas, mas não contadas.

Outras dicas

Já tive problemas semelhantes antes.

Presumo que você esteja usando a função length() para determinar o tamanho do arquivo.Nesse caso, é provável que os dados que você está postando estejam codificados em UTF-8, em vez de ASCII.

Para obter a contagem correta, pode ser necessário adicionar um "Use bytes" " Pragma no topo do seu script ou envolva a chamada de comprimento em um bloco:

my $size;
do {use bytes; $size = length($file_data)}

Na página de manual do perlfunc:

"Observe os personagens:se EXPR estiver em Unicode, você obterá o número de caracteres, não o número de bytes."

Como você está obtendo o número de bytes?..Observando o tamanho do arquivo no sistema de arquivos?

Você pode usar "-s" para obter o tamanho do arquivo.

Ou, se quiser fazer mais, você pode usar Arquivo::Estat.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top