Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'jetty-servlets/src/test/java/org/eclipse/jetty/server/handler/gzip/AsyncScheduledDispatchWrite.java')
-rw-r--r--jetty-servlets/src/test/java/org/eclipse/jetty/server/handler/gzip/AsyncScheduledDispatchWrite.java121
1 files changed, 121 insertions, 0 deletions
diff --git a/jetty-servlets/src/test/java/org/eclipse/jetty/server/handler/gzip/AsyncScheduledDispatchWrite.java b/jetty-servlets/src/test/java/org/eclipse/jetty/server/handler/gzip/AsyncScheduledDispatchWrite.java
new file mode 100644
index 0000000000..01f74b1f99
--- /dev/null
+++ b/jetty-servlets/src/test/java/org/eclipse/jetty/server/handler/gzip/AsyncScheduledDispatchWrite.java
@@ -0,0 +1,121 @@
+//
+// ========================================================================
+// Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
+// ------------------------------------------------------------------------
+// All rights reserved. This program and the accompanying materials
+// are made available under the terms of the Eclipse Public License v1.0
+// and Apache License v2.0 which accompanies this distribution.
+//
+// The Eclipse Public License is available at
+// http://www.eclipse.org/legal/epl-v10.html
+//
+// The Apache License v2.0 is available at
+// http://www.opensource.org/licenses/apache2.0.php
+//
+// You may elect to redistribute this code under either of these licenses.
+// ========================================================================
+//
+
+package org.eclipse.jetty.server.handler.gzip;
+
+import java.io.IOException;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.TimeUnit;
+
+import javax.servlet.AsyncContext;
+import javax.servlet.ServletConfig;
+import javax.servlet.ServletException;
+import javax.servlet.ServletOutputStream;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+@SuppressWarnings("serial")
+public abstract class AsyncScheduledDispatchWrite extends TestDirContentServlet
+{
+ public static class Default extends AsyncScheduledDispatchWrite
+ {
+ public Default()
+ {
+ super(true);
+ }
+ }
+
+ public static class Passed extends AsyncScheduledDispatchWrite
+ {
+ public Passed()
+ {
+ super(false);
+ }
+ }
+
+ private static class DispatchBack implements Runnable
+ {
+ private final AsyncContext ctx;
+
+ public DispatchBack(AsyncContext ctx)
+ {
+ this.ctx = ctx;
+ }
+
+ @Override
+ public void run()
+ {
+ ctx.dispatch();
+ }
+ }
+
+ private final boolean originalReqResp;
+ private ScheduledExecutorService scheduler;
+
+ public AsyncScheduledDispatchWrite(boolean originalReqResp)
+ {
+ this.originalReqResp = originalReqResp;
+ }
+
+ public void init(ServletConfig config) throws ServletException
+ {
+ super.init(config);
+ scheduler = Executors.newScheduledThreadPool(3);
+ }
+
+ @Override
+ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
+ {
+ Boolean suspended = (Boolean)request.getAttribute("SUSPENDED");
+ if (suspended == null || !suspended)
+ {
+ request.setAttribute("SUSPENDED",Boolean.TRUE);
+ AsyncContext ctx;
+ if (originalReqResp)
+ {
+ // Use Original Request & Response
+ ctx = request.startAsync();
+ }
+ else
+ {
+ // Pass Request & Response
+ ctx = request.startAsync(request,response);
+ }
+ ctx.setTimeout(0);
+ scheduler.schedule(new DispatchBack(ctx),500,TimeUnit.MILLISECONDS);
+ }
+ else
+ {
+ String fileName = request.getServletPath();
+ byte[] dataBytes = loadContentFileBytes(fileName);
+
+ response.setContentLength(dataBytes.length);
+
+ ServletOutputStream out = response.getOutputStream();
+
+ if (fileName.endsWith("txt"))
+ response.setContentType("text/plain");
+ else if (fileName.endsWith("mp3"))
+ response.setContentType("audio/mpeg");
+ response.setHeader("ETag","W/etag-" + fileName);
+
+ out.write(dataBytes);
+ }
+ }
+}

Back to the top