Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-8190678

JDK 8 update 151 causes an issue with tomcat gzip compression that did NOT occur using the same version of tomcat and JDK 8 update 144

    XMLWordPrintable

    Details

      Description

      FULL PRODUCT VERSION :
      java version "1.8.0_151"
      Java(TM) SE Runtime Environment (build 1.8.0_151-b12)
      Java HotSpot(TM) 64-Bit Server VM (build 25.151-b12, mixed mode)

      ADDITIONAL OS VERSION INFORMATION :
      Ubuntu Linux 16.04 LTS

      A DESCRIPTION OF THE PROBLEM :
      Although this looks like a Tomcat issue, the issue only happens with Oracle JDK 8 updates 151 and 152, which indicates that there is probably something wrong with the JDK itself.

      In Tomcat server, while enabling gzip compression, calling flush() on the servlet response PrintWriter object causes the servlet output to be corrupted.

      REGRESSION. Last worked in version 8u144

      STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
      1. Use tomcat server.
      2. Enable compression on tomcat (add compression="on" attribute to HTTP <Connector> tag in server.xml)
      3. Create a servlet that produces some output and call flush() on the response's PrintWriter object in the end.
      4. Look at generated output using a browser or an HTTP client tool.

      EXPECTED VERSUS ACTUAL BEHAVIOR :
      EXPECTED -
      Response should be correct, as generated from the servlet.
      ACTUAL -
      Response is corrupted.

      REPRODUCIBILITY :
      This bug can be reproduced always.

      ---------- BEGIN SOURCE ----------

      import java.io.IOException;
      import java.io.PrintWriter;

      import javax.servlet.ServletException;
      import javax.servlet.annotation.WebServlet;
      import javax.servlet.http.HttpServlet;
      import javax.servlet.http.HttpServletRequest;
      import javax.servlet.http.HttpServletResponse;

      @WebServlet("/gzip-test")
      public class GzipTest extends HttpServlet {
          private static final long serialVersionUID = 1L;
             
          protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
              response.setContentType("text/html");
              
              PrintWriter out = response.getWriter();
              out.println("Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse iaculis purus eu dolor dapibus imperdiet. Pellentesque sodales odio in viverra porttitor. Vestibulum in risus egestas, feugiat ante sed, sollicitudin mi. Etiam at tempus dui. Nam venenatis sit amet arcu ac sodales. Mauris magna libero, rhoncus non tempus ut, condimentum et ipsum. Cras suscipit euismod enim, ac commodo velit luctus et.");
              out.println("Nullam porta interdum tellus, nec cursus mauris ullamcorper nec. Sed quis pulvinar ex, non fermentum magna. Nullam in tellus pellentesque, ultricies erat nec, viverra risus. Nunc semper condimentum enim id sagittis. Nulla condimentum tincidunt imperdiet. Suspendisse et vestibulum purus, vitae efficitur orci. Nullam elementum eget nulla rhoncus fermentum. Fusce eu sapien faucibus quam ultricies posuere. Ut massa tortor, convallis eu sagittis a, commodo sit amet odio. Aenean sed sem sed nulla egestas condimentum vitae et mi. Etiam ut purus ligula. Etiam ut arcu sed ex tempus venenatis non nec enim. Suspendisse tincidunt dolor accumsan, pharetra arcu id, dictum nulla. Donec in pharetra orci. Quisque sed bibendum odio. Sed congue scelerisque nibh, eu sagittis eros laoreet condimentum.");
              out.println("Aenean pellentesque erat massa, quis aliquet purus fringilla in. Aenean iaculis risus nec eleifend luctus. Sed viverra vulputate congue. Integer mattis eu massa quis pharetra. Proin id mi molestie tortor blandit cursus. In feugiat ultricies tellus, vel consectetur dui facilisis malesuada. Proin elementum, ipsum ut aliquam luctus, tortor augue volutpat ipsum, ac hendrerit elit diam eget dolor. Sed sit amet magna scelerisque justo fermentum accumsan nec sit amet leo. Nunc leo sapien, feugiat eu dolor vel, cursus tincidunt mi. Pellentesque ut ultricies enim. Nunc elementum fermentum est, et porta mauris pellentesque et. Duis sed posuere diam, quis luctus lectus. In eget justo dignissim, semper mauris ac, pharetra eros.");
              out.println("Fusce faucibus vehicula efficitur. Proin tempor vestibulum odio. Sed non urna ac nisl vulputate vestibulum nec eget quam. In at sem porta, suscipit ipsum eget, aliquet lorem. Nulla maximus neque lobortis efficitur consequat. Proin sodales euismod dui, nec varius tortor pellentesque id. Donec nec finibus augue. Curabitur vitae blandit libero, sodales efficitur dui. Fusce mollis tortor ex, eu elementum purus blandit eleifend. Proin ac nisi bibendum, suscipit lorem tempor, gravida lacus. Sed lobortis lobortis tortor at hendrerit. Sed at ornare urna.");
              out.println("Quisque dapibus sit amet arcu sit amet hendrerit. Nulla accumsan tristique laoreet. Pellentesque molestie malesuada enim. Cras lacinia facilisis sem ac sollicitudin. Cras at est et ex semper tincidunt. Aenean rhoncus hendrerit ullamcorper. Maecenas vel faucibus lacus. Nam viverra nec velit id tempus. Suspendisse tempus, tellus et suscipit fermentum, eros elit viverra tortor, non tincidunt leo leo vel libero. Curabitur scelerisque enim id ligula interdum, eget scelerisque ipsum pretium. Nam quis elit fringilla, pretium mauris et, fringilla dolor. Nulla id mi sed ex bibendum pharetra quis ac elit. Sed in lectus in nulla pellentesque pellentesque. Mauris sit amet sagittis metus. In vitae laoreet est. Integer risus erat, egestas nec leo ut, fermentum accumsan tellus.");
              out.println("Aliquam auctor lacinia augue sit amet pharetra. Fusce id egestas ex. Phasellus nec mi nisi. Pellentesque orci nibh, gravida non cursus quis, euismod non nulla. Phasellus sodales venenatis diam vitae viverra. Nunc pulvinar, neque eu suscipit tristique, augue odio molestie lectus, id malesuada ipsum orci nec dui. Morbi eleifend tincidunt libero ac pretium.");
              out.println("Vestibulum rutrum fermentum sollicitudin. Praesent luctus velit lacinia mattis sodales. Pellentesque ullamcorper nisi dui, ac dignissim orci efficitur a. Donec pharetra neque ut lorem lacinia ullamcorper. Nam consequat in mauris a dictum. Quisque ut magna scelerisque, elementum nunc ultrices, maximus neque. Donec condimentum eu enim a laoreet. Nunc non turpis sit amet nisi sodales vehicula. Pellentesque et sodales ante. Sed tincidunt, justo sit amet pharetra sollicitudin, purus metus tincidunt mi, a pellentesque justo augue quis metus. Donec vel convallis felis. Mauris quis eros vestibulum, pulvinar diam ut, tristique augue. Nulla at laoreet arcu. Vivamus elementum leo nec feugiat volutpat. Nulla interdum nunc vitae enim fringilla, vitae lacinia erat luctus. Vivamus congue mauris ut nunc convallis venenatis.");
              out.println("Vestibulum rutrum augue vel molestie efficitur. Sed leo massa, molestie eget nisl vel, tempor cursus massa. Cras commodo justo sit amet neque viverra, id tempus diam finibus. Integer ut tellus suscipit, molestie mauris ut, volutpat ex. Nunc et sollicitudin nibh. Aenean rutrum convallis augue. Sed blandit lacus eros, sit amet lacinia nibh rhoncus non. Nullam diam est, lacinia ut magna vitae, cursus cursus sem. Maecenas ullamcorper nibh sem, quis pulvinar diam luctus vitae.");
              out.println("Praesent et malesuada nulla. Nullam in malesuada lorem. Morbi vitae lorem et neque interdum porta sit amet sed felis. Donec nibh mi, placerat quis suscipit vitae, congue lobortis urna. Nulla ultrices, massa consectetur tempus pretium, augue tortor maximus ipsum, quis consectetur ex nulla eu ipsum. Aenean finibus augue vel elementum mattis. Aenean eleifend egestas finibus. Cras molestie eros libero, at egestas arcu convallis vitae. Morbi a imperdiet ex.");
              out.println("Sed non dapibus turpis, et egestas diam. Maecenas augue est, condimentum in erat quis, eleifend euismod nibh. Duis sodales enim et ex tincidunt, non sagittis augue interdum. Interdum et malesuada fames ac ante ipsum primis in faucibus. Proin vestibulum tempus tellus vitae luctus. Fusce sit amet mauris vel eros gravida vulputate lobortis eleifend mauris. Donec nisl neque, facilisis pulvinar ullamcorper vel, mollis in ipsum. Sed vitae pulvinar tellus. Integer eu ligula magna. Proin eros augue, rutrum sed faucibus eget, lobortis pellentesque ipsum. Etiam efficitur justo non ante commodo, at pretium velit sagittis. Maecenas lacinia condimentum viverra. Vestibulum non ante varius, suscipit dui non, sodales ligula. Aliquam erat volutpat.");
              out.println("Maecenas consectetur ante lorem, id commodo tortor tincidunt vel. Duis facilisis est quam, at condimentum metus placerat sit amet. Vivamus nec purus a nunc euismod dictum eu vel tellus. Phasellus dignissim nunc vitae odio aliquam faucibus. Proin eget dui nunc. Sed accumsan suscipit velit nec rutrum. Nam augue nisl, rhoncus a sapien vel, dapibus sagittis urna. Duis ut enim urna. Phasellus eu eros eu ante bibendum dignissim eu fringilla purus. Donec malesuada tortor a tellus gravida interdum ut id sapien. Aliquam egestas lorem nisi, a ultricies nulla gravida a. Sed tempor justo risus, eu laoreet diam vestibulum eget. Aenean commodo mi consectetur, convallis.");

              // This line causes the issue
              out.flush();
          }

          protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
              doGet(request, response);
          }
      }
      ---------- END SOURCE ----------

      CUSTOMER SUBMITTED WORKAROUND :
      - Do not call flush()
      - Do not use compression
      - Use an earlier JDK version

        Attachments

          Issue Links

            Activity

              People

              Assignee:
              psonal Pallavi Sonal (Inactive)
              Reporter:
              webbuggrp Webbug Group
              Votes:
              0 Vote for this issue
              Watchers:
              2 Start watching this issue

                Dates

                Created:
                Updated:
                Resolved: