Cela fait 48 heures que je me bats contre ce bug absolument exaspérant, alors j'ai pensé jeter l'éponge et essayer de poser la question ici avant de jeter mon ordinateur portable par la fenêtre.
J'essaie d'analyser la réponse XML d'un appel que j'ai fait à AWS SimpleDB. La réponse revient correctement sur le fil ; par exemple, elle peut ressembler à ce qui suit :
<?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>
Je transmets ce XML à un analyseur syntaxique avec
XMLEventReader eventReader = xmlInputFactory.createXMLEventReader(response.getContent());
et appeler eventReader.nextEvent();
plusieurs fois pour obtenir les données souhaitées.
Voici la partie la plus bizarre : cela fonctionne parfaitement sur le serveur local. La réponse arrive, je l'analyse, tout le monde est content. Le problème est que lorsque je déploie le code sur Google App Engine, la requête sortante fonctionne toujours, et le XML de la réponse me semble 100% identique et correct, mais la réponse ne parvient pas à être analysée avec l'exception suivante :
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)
J'ai vérifié deux fois, trois fois, quatre fois ce XML à la recherche de "caractères invisibles" ou de caractères non codés en UTF8, etc. Je l'ai examiné octet par octet dans un tableau à la recherche de marques d'ordre d'octet ou de quelque chose de ce genre. Je l'ai examiné octet par octet dans un tableau à la recherche de marques d'ordre d'octet ou de quelque chose de ce genre. Plus étrange encore, cela se produit également si j'utilise un analyseur basé sur Saxon - mais UNIQUEMENT sur GAE, cela fonctionne toujours très bien dans mon environnement local.
Cela rend très difficile la recherche de problèmes dans le code lorsque je ne peux exécuter le débogueur que dans un environnement qui fonctionne parfaitement (je n'ai pas trouvé de bon moyen de déboguer à distance sur GAE). Néanmoins, avec les moyens primitifs dont je dispose, j'ai essayé un million d'approches, y compris :
- XML avec et sans prologue
- Avec et sans nouvelles lignes
- Avec et sans l'attribut "encoding=" dans le prologue
- Les deux styles de retour à la ligne
- Avec et sans les informations de découpage présentes dans le flux HTTP
Et j'ai essayé la plupart d'entre eux dans de multiples combinaisons où il était logique qu'ils interagissent - rien ! Je ne sais plus où donner de la tête. Est-ce que quelqu'un a déjà rencontré un problème de ce type et pourrait, si possible, m'éclairer ?
Gracias.