Tenho batido minha cabeça contra esse bug absolutamente irritante nas últimas 48 horas, então pensei em finalmente jogar a toalha e tentar perguntar aqui antes de jogar meu laptop pela janela.
Estou tentando analisar o XML de resposta de uma chamada que fiz para AWS SimpleDB. A resposta está voltando muito bem; por exemplo, pode ser parecido com:
<?xml version="1.0" encoding="utf-8"?>
<ListDomainsResponse xmlns="http://sdb.amazonaws.com/doc/2009-04-15/">
<ListDomainsResult>
<DomainName>Audio</DomainName>
<DomainName>Course</DomainName>
<DomainName>DocumentContents</DomainName>
<DomainName>LectureSet</DomainName>
<DomainName>MetaData</DomainName>
<DomainName>Professors</DomainName>
<DomainName>Tag</DomainName>
</ListDomainsResult>
<ResponseMetadata>
<RequestId>42330b4a-e134-6aec-e62a-5869ac2b4575</RequestId>
<BoxUsage>0.0000071759</BoxUsage>
</ResponseMetadata>
</ListDomainsResponse>
Eu passo este XML para um analisador com
XMLEventReader eventReader = xmlInputFactory.createXMLEventReader(response.getContent());
e ligar eventReader.nextEvent();
várias vezes para obter os dados que desejo.
Aqui está a parte bizarra - funciona muito bem dentro do servidor local. A resposta chega, eu analiso, todos estão felizes. O problema é que, quando implanto o código no Google App Engine, a solicitação de saída ainda funciona e o XML de resposta parece 100% idêntico e correto para mim, mas a resposta falha ao analisar com a seguinte exceção:
com.amazonaws.http.HttpClient handleResponse: Unable to unmarshall response (ParseError at [row,col]:[1,1]
Message: Content is not allowed in prolog.): <?xml version="1.0" encoding="utf-8"?>
<ListDomainsResponse xmlns="http://sdb.amazonaws.com/doc/2009-04-15/"><ListDomainsResult><DomainName>Audio</DomainName><DomainName>Course</DomainName><DomainName>DocumentContents</DomainName><DomainName>LectureSet</DomainName><DomainName>MetaData</DomainName><DomainName>Professors</DomainName><DomainName>Tag</DomainName></ListDomainsResult><ResponseMetadata><RequestId>42330b4a-e134-6aec-e62a-5869ac2b4575</RequestId><BoxUsage>0.0000071759</BoxUsage></ResponseMetadata></ListDomainsResponse>
javax.xml.stream.XMLStreamException: ParseError at [row,col]:[1,1]
Message: Content is not allowed in prolog.
at com.sun.org.apache.xerces.internal.impl.XMLStreamReaderImpl.next(Unknown Source)
at com.sun.xml.internal.stream.XMLEventReaderImpl.nextEvent(Unknown Source)
at com.amazonaws.transform.StaxUnmarshallerContext.nextEvent(StaxUnmarshallerContext.java:153)
... (rest of lines omitted)
Eu verifiquei duplo, triplo, quádruplo neste XML para 'caracteres invisíveis' ou caracteres não codificados em UTF8, etc. Eu olhei para ele byte a byte em uma matriz para marcas de ordem de byte ou algo dessa natureza. Nada; ele passa em todos os testes de validação que eu poderia lançar nele. Ainda mais estranho, isso acontece se eu usar um analisador baseado em saxão também - mas SOMENTE no GAE, ele sempre funciona bem no meu ambiente local.
Isso torna muito difícil rastrear o código para problemas quando eu só posso executar o depurador em um ambiente que funciona perfeitamente (não encontrei nenhuma boa maneira de depurar remotamente no GAE). No entanto, usando os meios primitivos que tenho, tentei um milhão de abordagens, incluindo:
- XML com e sem prólogo
- Com e sem novas linhas
- Com e sem o atributo "encoding =" no prólogo
- Ambos os estilos de nova linha
- Com e sem as informações de chunking presentes no fluxo HTTP
E eu tentei a maioria deles em várias combinações onde fazia sentido que eles interagissem - nada! Estou perdendo o juízo. Alguém já viu um problema como este antes que possa lançar alguma luz sobre ele?
Obrigado!