googleads / googleads-java-lib

Google Ad Manager SOAP API Client Library for Java
Apache License 2.0
226 stars 360 forks source link

Invalid XML Character fails CMS Metada Service API #226

Open mmfaizals opened 3 years ago

mmfaizals commented 3 years ago

Invalid XML character in cms metadata API response causes failure in parsing

Example response :

<getCmsMetadataValuesByStatementResponse
                        xmlns="https://www.google.com/apis/ads/publisher/v202105">
                        <rval>
                            <totalResultSetSize>4743558</totalResultSetSize>
                            <startIndex>1562500</startIndex>
                            <results>
                                <cmsMetadataValueId>5921712000</cmsMetadataValueId>
                                <valueName>&#xD83D;&#xDD34; minecraft xbox mini games livestream</valueName>
                                <key>
                                    <id>12697</id>
                                    <name>keywords</name>
                                    <status>ACTIVE</status>
                                </key>
                                <status>ACTIVE</status>
                            </results>

Stacktrace :

Fatal Error] :1:58805: Character reference "&#xD83D" is an invalid XML character.
[Sep 09 07:20:36] [d9f62cac6bf545bfbdb16acd85aef077/247051] WARN  com.google.api.ads.common.lib.utils.logging.AdsServiceLoggers.ads_api_lib (PrettyPrinter.java:123) - Unable to pretty print XML: {}
javax.xml.transform.TransformerException: org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 58805; Character reference "&#xD83D" is an invalid XML character.
        at org.apache.xalan.transformer.TransformerIdentityImpl.transform(TransformerIdentityImpl.java:501)
        at com.google.api.ads.common.lib.utils.logging.PrettyPrinter.formatXml(PrettyPrinter.java:120)
        at com.google.api.ads.common.lib.utils.logging.PrettyPrinter.prettyPrint(PrettyPrinter.java:106)
        at com.google.api.ads.common.lib.utils.logging.RemoteCallLoggerDelegate.logRequestDetails(RemoteCallLoggerDelegate.java:108)
        at com.google.api.ads.common.lib.utils.logging.AdsServiceLoggers.logRequest(AdsServiceLoggers.java:61)
        at com.google.api.ads.common.lib.client.AdsServiceClient.logSoapCall(AdsServiceClient.java:94)
        at com.google.api.ads.common.lib.soap.SoapServiceClient.invoke(SoapServiceClient.java:95)
        at com.sun.proxy.$Proxy121.getCmsMetadataValuesByStatement(Unknown Source)
nwbirnie commented 3 years ago

Hey @christopherseeley could you take a look?

christopherseeley commented 2 years ago

This is an issue with how the library handles logging. The response is correctly read by the Axis SOAP deserializer, but not by our logger's XML parser.

This doesn't block your application from getting the data, but you will have spurious error logs.