Https encoding fail for non-ISO-8859-1 filename, cause IllegalArgumentException

XMLWordPrintable

    • Type: Bug
    • Resolution: Fixed
    • Priority: Major
    • 10.2.0
    • Affects Version/s: 10.0.0, 9.6.5
    • Component/s: None
    • Security Level: Jimmy
    • None

      Steps to Reproduce

      Ask me for reproducing project
      download a file using non latin-1 characters

      Current Result

      Causes exception:

      java.lang.IllegalArgumentException: The Unicode character [?] at code point [53,580] cannot be encoded as it is outside the permitted range of 0 to 255
              at org.apache.tomcat.util.buf.MessageBytes.toBytesSimple(MessageBytes.java:286) ~[tomcat-embed-core-10.1.1.jar!/:na]
              at org.apache.tomcat.util.buf.MessageBytes.toBytes(MessageBytes.java:255) ~[tomcat-embed-core-10.1.1.jar!/:na]
              at org.apache.coyote.http11.Http11OutputBuffer.write(Http11OutputBuffer.java:394) ~[tomcat-embed-core-10.1.1.jar!/:na]
              at org.apache.coyote.http11.Http11OutputBuffer.sendHeader(Http11OutputBuffer.java:372) ~[tomcat-embed-core-10.1.1.jar!/:na]
              at org.apache.coyote.http11.Http11Processor.prepareResponse(Http11Processor.java:1066) ~[tomcat-embed-core-10.1.1.jar!/:na]
              at org.apache.coyote.AbstractProcessor.action(AbstractProcessor.java:381) ~[tomcat-embed-core-10.1.1.jar!/:na]
              at org.apache.coyote.Response.action(Response.java:210) ~[tomcat-embed-core-10.1.1.jar!/:na]
              at org.apache.coyote.http11.Http11OutputBuffer.doWrite(Http11OutputBuffer.java:188) ~[tomcat-embed-core-10.1.1.jar!/:na]
              at org.apache.coyote.Response.doWrite(Response.java:625) ~[tomcat-embed-core-10.1.1.jar!/:na]
              at org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:336) ~[tomcat-embed-core-10.1.1.jar!/:na]
              at org.apache.catalina.connector.OutputBuffer.flushByteBuffer(OutputBuffer.java:780) ~[tomcat-embed-core-10.1.1.jar!/:na]
              at org.apache.catalina.connector.OutputBuffer.append(OutputBuffer.java:685) ~[tomcat-embed-core-10.1.1.jar!/:na]
              at org.apache.catalina.connector.OutputBuffer.writeBytes(OutputBuffer.java:384) ~[tomcat-embed-core-10.1.1.jar!/:na]
              at org.apache.catalina.connector.OutputBuffer.write(OutputBuffer.java:362) ~[tomcat-embed-core-10.1.1.jar!/:na]
              at org.apache.catalina.connector.CoyoteOutputStream.write(CoyoteOutputStream.java:96) ~[tomcat-embed-core-10.1.1.jar!/:na]
              at org.zkoss.io.Files.copy(Files.java:108) ~[zcommon-9.6.0-jakarta.jar!/:9.6.0-migrated-1.0.0]
              at org.zkoss.web.servlet.http.Https.write(Https.java:480) ~[zweb-9.6.0-jakarta.jar!/:9.6.0-migrated-1.0.0]
              at org.zkoss.zk.au.http.AuDynaMediar.service(AuDynaMediar.java:181) ~[zk-9.6.0-jakarta.jar!/:9.6.0-migrated-1.0.0]
              at org.zkoss.zk.au.http.DHtmlUpdateServlet.doGet(DHtmlUpdateServlet.java:419) ~[zk-9.6.0-jakarta.jar!/:9.6.0-migrated-1.0.0]
              at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:705) ~[tomcat-embed-core-10.1.1.jar!/:na]
              at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:814) ~[tomcat-embed-core-10.1.1.jar!/:na]
              at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:223) ~[tomcat-embed-core-10.1.1.jar!/:na]
              at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:158) ~[tomcat-embed-core-10.1.1.jar!/:na]
              at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) ~[tomcat-embed-websocket-10.1.1.jar!/:na]
              at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:185) ~[tomcat-embed-core-10.1.1.jar!/:na]
              at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:158) ~[tomcat-embed-core-10.1.1.jar!/:na]
              at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-6.0.2.jar!/:6.0.2]
              at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-6.0.2.jar!/:6.0.2]
              at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:185) ~[tomcat-embed-core-10.1.1.jar!/:na]
              at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:158) ~[tomcat-embed-core-10.1.1.jar!/:na]
              at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-6.0.2.jar!/:6.0.2]
              at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-6.0.2.jar!/:6.0.2]
              at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:185) ~[tomcat-embed-core-10.1.1.jar!/:na]
              at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:158) ~[tomcat-embed-core-10.1.1.jar!/:na]
              at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-6.0.2.jar!/:6.0.2]
              at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-6.0.2.jar!/:6.0.2]
              at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:185) ~[tomcat-embed-core-10.1.1.jar!/:na]
              at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:158) ~[tomcat-embed-core-10.1.1.jar!/:na]
              at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:197) ~[tomcat-embed-core-10.1.1.jar!/:na]
              at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97) ~[tomcat-embed-core-10.1.1.jar!/:na]
              at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:542) ~[tomcat-embed-core-10.1.1.jar!/:na]
              at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:119) ~[tomcat-embed-core-10.1.1.jar!/:na]
              at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) ~[tomcat-embed-core-10.1.1.jar!/:na]
              at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78) ~[tomcat-embed-core-10.1.1.jar!/:na]
              at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:357) ~[tomcat-embed-core-10.1.1.jar!/:na]
              at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:400) ~[tomcat-embed-core-10.1.1.jar!/:na]
              at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) ~[tomcat-embed-core-10.1.1.jar!/:na]
              at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:861) ~[tomcat-embed-core-10.1.1.jar!/:na]
              at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1739) ~[tomcat-embed-core-10.1.1.jar!/:na]
              at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52) ~[tomcat-embed-core-10.1.1.jar!/:na]
              at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191) ~[tomcat-embed-core-10.1.1.jar!/:na]
              at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) ~[tomcat-embed-core-10.1.1.jar!/:na]
              at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) ~[tomcat-embed-core-10.1.1.jar!/:na]
              at java.base/java.lang.Thread.run(Thread.java:833) ~[na:na]
      

      Expected Result

      no exception

      Debug Information

      https://github.com/zkoss/zk/blob/master/zweb/src/main/java/org/zkoss/web/servlet/http/Https.java#L560-L562

      Https uses the encodeFileName method if update-uri is undefined, and there is no jsessionid in the request
      https://github.com/zkoss/zk/blob/master/zweb/src/main/java/org/zkoss/web/servlet/http/Https.java#L692-L706

      EncodeFileName just removes backslashes, but doesn't actually encode characters, which cause the file name to be passed in the content-disposition header, instead of just "attachement".

      headers don't support non latin-1, causes exception

      Workaround

      attached workaround Https class for 9.1.0
      deploy under stated package to replace default class

            Assignee:
            DevChu
            Reporter:
            MDuchemin
            Votes:
            0 Vote for this issue
            Watchers:
            2 Start watching this issue

              Created:
              Updated:
              Resolved: