"Illegal hex characters in escape (%) pattern" when doing s3.listObjects()

3.5k Views Asked by At

I'm facing a curious problem. I have a Java webapp that uses the AWS sdk My Local setup is

  • Latest Docker
  • Container with Centos7 + tomcat9.0.13 + JDK 1.8.0_161

One of my object key name is ".Test%Test%&Name.jpg",

When I attempt a s3.listObject() I get

by: java.lang.IllegalArgumentException: URLDecoder: Illegal hex characters in escape (%) pattern - For input string: "TE" at java.net.URLDecoder.decode(URLDecoder.java:194) ~[na:1.8.0_161] at com.amazonaws.util.SdkHttpUtils.urlDecode(SdkHttpUtils.java:114) ~[aws-java-sdk-core-1.11.283.jar:na]

However.... for the exact same webapp (same war) and the same setup (EC2 centos 7, jdk 1.8.161, tomcat 9.0.13) and with the same key in S3 s3.listObject() does not through that exception ?

This definitely something dodgy with how the JVM loads the libraries but I cannot understand how I can check what is loaded.

I'd like to compare which XML parser is loaded on my EC2 and which parser is loaded on my local Docker setup.

Full Stack trace:

Caused by: java.lang.IllegalArgumentException: URLDecoder: Illegal hex characters in escape (%) pattern - For input string: "TE"
    at java.net.URLDecoder.decode(URLDecoder.java:194) ~[na:1.8.0_161]
    at com.amazonaws.util.SdkHttpUtils.urlDecode(SdkHttpUtils.java:114) ~[aws-java-sdk-core-1.11.283.jar:na]
    at com.amazonaws.services.s3.model.transform.XmlResponsesSaxParser.decodeIfSpecified(XmlResponsesSaxParser.java:302) ~[aws-java-sdk-s3-1.11.283.jar:na]
    at com.amazonaws.services.s3.model.transform.XmlResponsesSaxParser.access$200(XmlResponsesSaxParser.java:100) ~[aws-java-sdk-s3-1.11.283.jar:na]
    at com.amazonaws.services.s3.model.transform.XmlResponsesSaxParser$ListBucketHandler.doEndElement(XmlResponsesSaxParser.java:699) ~[aws-java-sdk-s3-1.11.283.jar:na]
    at com.amazonaws.services.s3.model.transform.AbstractHandler.endElement(AbstractHandler.java:52) ~[aws-java-sdk-s3-1.11.283.jar:na]
    at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.endElement(AbstractSAXParser.java:609) ~[na:1.8.0_161]
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanEndElement(XMLDocumentFragmentScannerImpl.java:1782) ~[na:1.8.0_161]
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2967) ~[na:1.8.0_161]
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:602) ~[na:1.8.0_161]
    at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:112) ~[na:1.8.0_161]
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:505) ~[na:1.8.0_161]
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:842) ~[na:1.8.0_161]
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:771) ~[na:1.8.0_161]
    at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:141) ~[na:1.8.0_161]
    at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1213) ~[na:1.8.0_161]
    at com.amazonaws.services.s3.model.transform.XmlResponsesSaxParser.parseXmlInputStream(XmlResponsesSaxParser.java:147) ~[aws-java-sdk-s3-1.11.283.jar:na]
    ... 163 common frames omitted
1

There are 1 best solutions below

0
matt On

As the error points, it is not a valid HEX character. HEX characters start with '%'. You need to escape it to %25, which is its equivalent.

Then your escaped key name would be:

".Test%25Test%25&Name.jpg"

Hope it helps!