Search in sources :

Example 16 with AsyncContext

use of javax.servlet.AsyncContext in project jetty.project by eclipse.

the class AsyncIOServletTest method testAsyncWriteClosed.

@Test
public void testAsyncWriteClosed() throws Exception {
    String text = "Now is the winter of our discontent. How Now Brown Cow. The quick brown fox jumped over the lazy dog.\n";
    for (int i = 0; i < 10; i++) text = text + text;
    byte[] data = text.getBytes(StandardCharsets.UTF_8);
    CountDownLatch errorLatch = new CountDownLatch(1);
    start(new HttpServlet() {

        @Override
        protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            assertScope();
            response.flushBuffer();
            AsyncContext async = request.startAsync();
            ServletOutputStream out = response.getOutputStream();
            out.setWriteListener(new WriteListener() {

                @Override
                public void onWritePossible() throws IOException {
                    assertScope();
                    // Wait for the failure to arrive to
                    // the server while we are about to write.
                    sleep(1000);
                    out.write(data);
                }

                @Override
                public void onError(Throwable t) {
                    assertScope();
                    async.complete();
                    errorLatch.countDown();
                }
            });
        }
    });
    CountDownLatch clientLatch = new CountDownLatch(1);
    client.newRequest(newURI()).path(servletPath).onResponseHeaders(response -> {
        if (response.getStatus() == HttpStatus.OK_200)
            response.abort(new IOException("explicitly_closed_by_test"));
    }).send(result -> {
        if (result.isFailed())
            clientLatch.countDown();
    });
    assertTrue(errorLatch.await(5, TimeUnit.SECONDS));
    assertTrue(clientLatch.await(5, TimeUnit.SECONDS));
}
Also used : Request(org.eclipse.jetty.server.Request) ServletException(javax.servlet.ServletException) Context(org.eclipse.jetty.server.handler.ContextHandler.Context) ByteBuffer(java.nio.ByteBuffer) Assert.assertThat(org.junit.Assert.assertThat) ContentResponse(org.eclipse.jetty.client.api.ContentResponse) BufferUtil.toArray(org.eclipse.jetty.util.BufferUtil.toArray) ByteArrayInputStream(java.io.ByteArrayInputStream) AtomicInteger(java.util.concurrent.atomic.AtomicInteger) DeferredContentProvider(org.eclipse.jetty.client.util.DeferredContentProvider) HttpStatus(org.eclipse.jetty.http.HttpStatus) HttpInput(org.eclipse.jetty.server.HttpInput) Response(org.eclipse.jetty.client.api.Response) HttpServlet(javax.servlet.http.HttpServlet) BufferingResponseListener(org.eclipse.jetty.client.util.BufferingResponseListener) HTTP2Session(org.eclipse.jetty.http2.HTTP2Session) StandardCharsets(java.nio.charset.StandardCharsets) Executors(java.util.concurrent.Executors) UncheckedIOException(java.io.UncheckedIOException) Matchers.instanceOf(org.hamcrest.Matchers.instanceOf) CountDownLatch(java.util.concurrent.CountDownLatch) Session(org.eclipse.jetty.http2.api.Session) FuturePromise(org.eclipse.jetty.util.FuturePromise) Content(org.eclipse.jetty.server.HttpInput.Content) StacklessLogging(org.eclipse.jetty.util.log.StacklessLogging) Matchers.is(org.hamcrest.Matchers.is) Queue(java.util.Queue) Matchers.containsString(org.hamcrest.Matchers.containsString) HttpConnectionOverHTTP(org.eclipse.jetty.client.http.HttpConnectionOverHTTP) BufferUtil(org.eclipse.jetty.util.BufferUtil) ConcurrentLinkedQueue(java.util.concurrent.ConcurrentLinkedQueue) Result(org.eclipse.jetty.client.api.Result) Handler(org.eclipse.jetty.server.Handler) ByteArrayOutputStream(java.io.ByteArrayOutputStream) HttpChannel(org.eclipse.jetty.server.HttpChannel) ServletInputStream(javax.servlet.ServletInputStream) ByteBuffer.wrap(java.nio.ByteBuffer.wrap) AtomicBoolean(java.util.concurrent.atomic.AtomicBoolean) CompletableFuture(java.util.concurrent.CompletableFuture) StringContentProvider(org.eclipse.jetty.client.util.StringContentProvider) Deque(java.util.Deque) InterruptedIOException(java.io.InterruptedIOException) AsyncContext(javax.servlet.AsyncContext) HttpHeader(org.eclipse.jetty.http.HttpHeader) HttpServletRequest(javax.servlet.http.HttpServletRequest) ServletOutputStream(javax.servlet.ServletOutputStream) WriteListener(javax.servlet.WriteListener) InputStreamContentProvider(org.eclipse.jetty.client.util.InputStreamContentProvider) HttpConnectionOverHTTP2(org.eclipse.jetty.http2.client.http.HttpConnectionOverHTTP2) Assume(org.junit.Assume) Executor(java.util.concurrent.Executor) HttpServletResponse(javax.servlet.http.HttpServletResponse) Matchers(org.hamcrest.Matchers) Assert.assertTrue(org.junit.Assert.assertTrue) IOException(java.io.IOException) Test(org.junit.Test) ContextHandler(org.eclipse.jetty.server.handler.ContextHandler) TimeUnit(java.util.concurrent.TimeUnit) HttpMethod(org.eclipse.jetty.http.HttpMethod) Connection(org.eclipse.jetty.io.Connection) LinkedBlockingDeque(java.util.concurrent.LinkedBlockingDeque) ReadListener(javax.servlet.ReadListener) DispatcherType(javax.servlet.DispatcherType) Destination(org.eclipse.jetty.client.api.Destination) Assert(org.junit.Assert) Assert.assertEquals(org.junit.Assert.assertEquals) ServletOutputStream(javax.servlet.ServletOutputStream) HttpServlet(javax.servlet.http.HttpServlet) HttpServletResponse(javax.servlet.http.HttpServletResponse) AsyncContext(javax.servlet.AsyncContext) Matchers.containsString(org.hamcrest.Matchers.containsString) UncheckedIOException(java.io.UncheckedIOException) InterruptedIOException(java.io.InterruptedIOException) IOException(java.io.IOException) CountDownLatch(java.util.concurrent.CountDownLatch) HttpServletRequest(javax.servlet.http.HttpServletRequest) ServletException(javax.servlet.ServletException) WriteListener(javax.servlet.WriteListener) Test(org.junit.Test)

Example 17 with AsyncContext

use of javax.servlet.AsyncContext in project jetty.project by eclipse.

the class AsyncIOServletTest method testEmptyAsyncRead.

@Test
public void testEmptyAsyncRead() throws Exception {
    AtomicBoolean oda = new AtomicBoolean();
    CountDownLatch latch = new CountDownLatch(1);
    start(new HttpServlet() {

        @Override
        protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            assertScope();
            AsyncContext asyncContext = request.startAsync(request, response);
            response.setStatus(200);
            response.getOutputStream().close();
            request.getInputStream().setReadListener(new ReadListener() {

                @Override
                public void onDataAvailable() throws IOException {
                    assertScope();
                    oda.set(true);
                }

                @Override
                public void onAllDataRead() throws IOException {
                    assertScope();
                    asyncContext.complete();
                    latch.countDown();
                }

                @Override
                public void onError(Throwable t) {
                    assertScope();
                    t.printStackTrace();
                    asyncContext.complete();
                }
            });
        }
    });
    ContentResponse response = client.newRequest(newURI()).path(servletPath).header(HttpHeader.CONNECTION, "close").timeout(5, TimeUnit.SECONDS).send();
    assertThat(response.getStatus(), Matchers.equalTo(HttpStatus.OK_200));
    assertTrue(latch.await(5, TimeUnit.SECONDS));
    // onDataAvailable must not be called.
    Assert.assertFalse(oda.get());
}
Also used : HttpServletRequest(javax.servlet.http.HttpServletRequest) ServletException(javax.servlet.ServletException) AtomicBoolean(java.util.concurrent.atomic.AtomicBoolean) ContentResponse(org.eclipse.jetty.client.api.ContentResponse) HttpServlet(javax.servlet.http.HttpServlet) HttpServletResponse(javax.servlet.http.HttpServletResponse) AsyncContext(javax.servlet.AsyncContext) UncheckedIOException(java.io.UncheckedIOException) InterruptedIOException(java.io.InterruptedIOException) IOException(java.io.IOException) CountDownLatch(java.util.concurrent.CountDownLatch) ReadListener(javax.servlet.ReadListener) Test(org.junit.Test)

Example 18 with AsyncContext

use of javax.servlet.AsyncContext in project jetty.project by eclipse.

the class ChatServlet method sendMessageToAllMembers.

private void sendMessageToAllMembers(String message, String username, Map<String, Member> room) {
    LOG.debug("Sending message: {} from: {}", message, username);
    for (Member m : room.values()) {
        synchronized (m) {
            // from
            m._queue.add(username);
            // chat
            m._queue.add(message);
            // wakeup member if polling
            AsyncContext async = m._async.get();
            LOG.debug("Async found: {}", async);
            if (async != null & m._async.compareAndSet(async, null)) {
                LOG.debug("dispatch");
                async.dispatch();
            }
        }
    }
}
Also used : AsyncContext(javax.servlet.AsyncContext)

Example 19 with AsyncContext

use of javax.servlet.AsyncContext in project jetty.project by eclipse.

the class ChatServlet method doPost.

// Handle Ajax calls from browser
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    // Ajax calls are form encoded
    boolean join = Boolean.parseBoolean(request.getParameter("join"));
    String message = request.getParameter("message");
    String username = request.getParameter("user");
    LOG.debug("doPost called. join={},message={},username={}", join, message, username);
    if (username == null) {
        LOG.debug("no paramter user set, sending 503");
        response.sendError(503, "user==null");
        return;
    }
    Map<String, Member> room = getRoom(request.getPathInfo());
    Member member = getMember(username, room);
    if (message != null) {
        sendMessageToAllMembers(message, username, room);
    }
    // next message or long poll again.
    if (message == null || join) {
        synchronized (member) {
            LOG.debug("Queue size: {}", member._queue.size());
            if (member._queue.size() > 0) {
                sendSingleMessage(response, member);
            } else {
                LOG.debug("starting async");
                AsyncContext async = request.startAsync();
                async.setTimeout(asyncTimeout);
                async.addListener(member);
                member._async.set(async);
            }
        }
    }
}
Also used : AsyncContext(javax.servlet.AsyncContext)

Example 20 with AsyncContext

use of javax.servlet.AsyncContext in project jetty.project by eclipse.

the class Dump method doGet.

/* ------------------------------------------------------------ */
@Override
public void doGet(final HttpServletRequest request, final HttpServletResponse response) throws ServletException, IOException {
    if (request.getRemoteUser() == null) {
        try {
            request.login("user", "password");
        } catch (ServletException se) {
            getServletContext().log(se.toString());
        }
    }
    // Handle a dump of data
    final String data = request.getParameter("data");
    final String chars = request.getParameter("chars");
    final String block = request.getParameter("block");
    final String dribble = request.getParameter("dribble");
    final boolean flush = request.getParameter("flush") != null ? Boolean.parseBoolean(request.getParameter("flush")) : false;
    if (request.getPathInfo() != null && request.getPathInfo().toLowerCase(Locale.ENGLISH).indexOf("script") != -1) {
        response.sendRedirect(response.encodeRedirectURL(getServletContext().getContextPath() + "/dump/info"));
        return;
    }
    request.setCharacterEncoding("UTF-8");
    if (request.getParameter("busy") != null) {
        long end = System.currentTimeMillis() + Long.parseLong(request.getParameter("busy"));
        while (System.currentTimeMillis() < end) {
        }
    }
    if (request.getParameter("empty") != null) {
        response.setStatus(200);
        response.flushBuffer();
        return;
    }
    if (request.getParameter("sleep") != null) {
        try {
            long s = Long.parseLong(request.getParameter("sleep"));
            if (request.getHeader("Expect") != null && request.getHeader("Expect").indexOf("102") >= 0) {
                Thread.sleep(s / 2);
                response.sendError(102);
                Thread.sleep(s / 2);
            } else
                Thread.sleep(s);
        } catch (InterruptedException e) {
            return;
        } catch (Exception e) {
            throw new ServletException(e);
        }
    }
    if (request.getParameter("startAsync") != null && request.getAttribute("ASYNC") != Boolean.TRUE) {
        request.setAttribute("ASYNC", Boolean.TRUE);
        try {
            final AsyncContext async = request.startAsync(request, response);
            async.setTimeout(Long.parseLong(request.getParameter("startAsync")));
            async.addListener(new AsyncListener() {

                @Override
                public void onTimeout(AsyncEvent event) throws IOException {
                    response.addHeader("Dump", "onTimeout");
                    try {
                        if (!dump(response, data, chars, block, dribble, flush)) {
                            response.setContentType("text/plain");
                            response.getOutputStream().println("EXPIRED");
                        }
                        async.complete();
                    } catch (IOException e) {
                        getServletContext().log("", e);
                    }
                }

                @Override
                public void onStartAsync(AsyncEvent event) throws IOException {
                    response.addHeader("Dump", "onStartAsync");
                }

                @Override
                public void onError(AsyncEvent event) throws IOException {
                    response.addHeader("Dump", "onError");
                }

                @Override
                public void onComplete(AsyncEvent event) throws IOException {
                    response.addHeader("Dump", "onComplete");
                }
            });
            if (request.getParameter("dispatch") != null) {
                request.setAttribute("RESUME", Boolean.TRUE);
                final long resume = Long.parseLong(request.getParameter("dispatch"));
                _timer.schedule(new TimerTask() {

                    @Override
                    public void run() {
                        async.dispatch();
                    }
                }, resume);
            }
            if (request.getParameter("complete") != null) {
                final long complete = Long.parseLong(request.getParameter("complete"));
                _timer.schedule(new TimerTask() {

                    @Override
                    public void run() {
                        try {
                            response.setContentType("text/html");
                            response.getOutputStream().println("<h1>COMPLETED</h1>");
                            async.complete();
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                }, complete);
            }
            return;
        } catch (Exception e) {
            throw new ServletException(e);
        }
    }
    request.setAttribute("Dump", this);
    getServletContext().setAttribute("Dump", this);
    // getServletContext().log("dump "+request.getRequestURI());
    // Force a content length response
    String length = request.getParameter("length");
    if (length != null && length.length() > 0) {
        response.setContentLength(Integer.parseInt(length));
    }
    // Handle a dump of data
    if (dump(response, data, chars, block, dribble, flush))
        return;
    // handle an exception
    String info = request.getPathInfo();
    if (info != null && info.endsWith("Exception")) {
        try {
            throw (Throwable) Thread.currentThread().getContextClassLoader().loadClass(info.substring(1)).newInstance();
        } catch (Throwable th) {
            throw new ServletException(th);
        }
    }
    // test a reset
    String reset = request.getParameter("reset");
    if (reset != null && reset.length() > 0) {
        response.getOutputStream().println("THIS SHOULD NOT BE SEEN!");
        response.setHeader("SHOULD_NOT", "BE SEEN");
        response.reset();
    }
    // handle an redirect
    String redirect = request.getParameter("redirect");
    if (redirect != null && redirect.length() > 0) {
        response.getOutputStream().println("THIS SHOULD NOT BE SEEN!");
        response.sendRedirect(response.encodeRedirectURL(redirect));
        try {
            response.getOutputStream().println("THIS SHOULD NOT BE SEEN!");
        } catch (IOException e) {
        // ignored as stream is closed.
        }
        return;
    }
    // handle an error
    String error = request.getParameter("error");
    if (error != null && error.length() > 0 && request.getAttribute(RequestDispatcher.ERROR_STATUS_CODE) == null) {
        response.getOutputStream().println("THIS SHOULD NOT BE SEEN!");
        response.sendError(Integer.parseInt(error));
        try {
            response.getOutputStream().println("THIS SHOULD NOT BE SEEN!");
        } catch (IllegalStateException e) {
            try {
                response.getWriter().println("NOR THIS!!");
            } catch (IOException e2) {
            }
        } catch (IOException e) {
        }
        return;
    }
    // Handle a extra headers
    String headers = request.getParameter("headers");
    if (headers != null && headers.length() > 0) {
        long h = Long.parseLong(headers);
        for (int i = 0; i < h; i++) response.addHeader("Header" + i, "Value" + i);
    }
    String buffer = request.getParameter("buffer");
    if (buffer != null && buffer.length() > 0)
        response.setBufferSize(Integer.parseInt(buffer));
    String charset = request.getParameter("charset");
    if (charset == null)
        charset = "UTF-8";
    response.setCharacterEncoding(charset);
    response.setContentType("text/html");
    if (info != null && info.indexOf("Locale/") >= 0) {
        try {
            String locale_name = info.substring(info.indexOf("Locale/") + 7);
            Field f = java.util.Locale.class.getField(locale_name);
            response.setLocale((Locale) f.get(null));
        } catch (Exception e) {
            e.printStackTrace();
            response.setLocale(Locale.getDefault());
        }
    }
    String cn = request.getParameter("cookie");
    String cv = request.getParameter("cookiev");
    if (cn != null && cv != null) {
        Cookie cookie = new Cookie(cn, cv);
        if (request.getParameter("version") != null)
            cookie.setVersion(Integer.parseInt(request.getParameter("version")));
        cookie.setComment("Cookie from dump servlet");
        response.addCookie(cookie);
    }
    String pi = request.getPathInfo();
    if (pi != null && pi.startsWith("/ex")) {
        OutputStream out = response.getOutputStream();
        out.write("</H1>This text should be reset</H1>".getBytes());
        if ("/ex0".equals(pi))
            throw new ServletException("test ex0", new Throwable());
        else if ("/ex1".equals(pi))
            throw new IOException("test ex1");
        else if ("/ex2".equals(pi))
            throw new UnavailableException("test ex2");
        else if (pi.startsWith("/ex3/"))
            throw new UnavailableException("test ex3", Integer.parseInt(pi.substring(5)));
        throw new RuntimeException("test");
    }
    if ("true".equals(request.getParameter("close")))
        response.setHeader("Connection", "close");
    String buffered = request.getParameter("buffered");
    PrintWriter pout = null;
    try {
        pout = response.getWriter();
    } catch (IllegalStateException e) {
        pout = new PrintWriter(new OutputStreamWriter(response.getOutputStream(), charset));
    }
    if (buffered != null)
        pout = new PrintWriter(new BufferedWriter(pout, Integer.parseInt(buffered)));
    try {
        pout.write("<html>\n<body>\n");
        pout.write("<h1>Dump Servlet</h1>\n");
        pout.write("<table width=\"95%\">");
        pout.write("<tr>\n");
        pout.write("<th align=\"right\">getContentLength:&nbsp;</th>");
        pout.write("<td>" + Integer.toString(request.getContentLength()) + "</td>");
        pout.write("</tr><tr>\n");
        pout.write("<th align=\"right\">getContentType:&nbsp;</th>");
        pout.write("<td>" + notag(request.getContentType()) + "</td>");
        pout.write("</tr><tr>\n");
        pout.write("<th align=\"right\">getContextPath:&nbsp;</th>");
        pout.write("<td>" + request.getContextPath() + "</td>");
        pout.write("</tr><tr>\n");
        pout.write("<th align=\"right\">getDispatcherType:&nbsp;</th>");
        pout.write("<td>" + request.getDispatcherType() + "</td>");
        pout.write("</tr><tr>\n");
        pout.write("<th align=\"right\">getLocale:&nbsp;</th>");
        pout.write("<td>" + request.getLocale() + "</td>");
        pout.write("</tr><tr>\n");
        pout.write("<th align=\"right\">getLocalName:&nbsp;</th>");
        pout.write("<td>" + request.getLocalName() + "</td>");
        pout.write("</tr><tr>\n");
        pout.write("<th align=\"right\">getLocalAddr:&nbsp;</th>");
        pout.write("<td>" + request.getLocalAddr() + "</td>");
        pout.write("</tr><tr>\n");
        pout.write("<th align=\"right\">getLocalPort:&nbsp;</th>");
        pout.write("<td>" + Integer.toString(request.getLocalPort()) + "</td>");
        pout.write("</tr><tr>\n");
        pout.write("<th align=\"right\">getMethod:&nbsp;</th>");
        pout.write("<td>" + notag(request.getMethod()) + "</td>");
        pout.write("</tr><tr>\n");
        pout.write("<th align=\"right\">getPathInfo:&nbsp;</th>");
        pout.write("<td>" + notag(request.getPathInfo()) + "</td>");
        pout.write("</tr><tr>\n");
        pout.write("<th align=\"right\">getPathTranslated:&nbsp;</th>");
        pout.write("<td>" + notag(request.getPathTranslated()) + "</td>");
        pout.write("</tr><tr>\n");
        pout.write("<th align=\"right\">getProtocol:&nbsp;</th>");
        pout.write("<td>" + request.getProtocol() + "</td>");
        pout.write("</tr><tr>\n");
        pout.write("<th align=\"right\">getQueryString:&nbsp;</th>");
        pout.write("<td>" + notag(request.getQueryString()) + "</td>");
        pout.write("</tr><tr>\n");
        pout.write("<th align=\"right\">getRemoteAddr:&nbsp;</th>");
        pout.write("<td>" + request.getRemoteAddr() + "</td>");
        pout.write("</tr><tr>\n");
        pout.write("<th align=\"right\">getRemoteHost:&nbsp;</th>");
        pout.write("<td>" + request.getRemoteHost() + "</td>");
        pout.write("</tr><tr>\n");
        pout.write("<th align=\"right\">getRemotePort:&nbsp;</th>");
        pout.write("<td>" + request.getRemotePort() + "</td>");
        pout.write("</tr><tr>\n");
        pout.write("<th align=\"right\">getRemoteUser:&nbsp;</th>");
        pout.write("<td>" + request.getRemoteUser() + "</td>");
        pout.write("</tr><tr>\n");
        pout.write("<th align=\"right\">getRequestedSessionId:&nbsp;</th>");
        pout.write("<td>" + request.getRequestedSessionId() + "</td>");
        pout.write("</tr><tr>\n");
        pout.write("<th align=\"right\">getRequestURI:&nbsp;</th>");
        pout.write("<td>" + notag(request.getRequestURI()) + "</td>");
        pout.write("</tr><tr>\n");
        pout.write("<th align=\"right\">getRequestURL:&nbsp;</th>");
        pout.write("<td>" + notag(request.getRequestURL().toString()) + "</td>");
        pout.write("</tr><tr>\n");
        pout.write("<th align=\"right\">getScheme:&nbsp;</th>");
        pout.write("<td>" + request.getScheme() + "</td>");
        pout.write("</tr><tr>\n");
        pout.write("<th align=\"right\">getServerName:&nbsp;</th>");
        pout.write("<td>" + notag(request.getServerName()) + "</td>");
        pout.write("</tr><tr>\n");
        pout.write("<th align=\"right\">getServletPath:&nbsp;</th>");
        pout.write("<td>" + notag(request.getServletPath()) + "</td>");
        pout.write("</tr><tr>\n");
        pout.write("<th align=\"right\">getServerPort:&nbsp;</th>");
        pout.write("<td>" + Integer.toString(request.getServerPort()) + "</td>");
        pout.write("</tr><tr>\n");
        pout.write("<th align=\"right\">getUserPrincipal:&nbsp;</th>");
        pout.write("<td>" + request.getUserPrincipal() + "</td>");
        pout.write("</tr><tr>\n");
        pout.write("<th align=\"right\">isAsyncStarted():&nbsp;</th>");
        pout.write("<td>" + request.isAsyncStarted() + "</td>");
        pout.write("</tr><tr>\n");
        pout.write("<th align=\"right\">isAsyncSupported():&nbsp;</th>");
        pout.write("<td>" + request.isAsyncSupported() + "</td>");
        pout.write("</tr><tr>\n");
        pout.write("<th align=\"right\">isSecure():&nbsp;</th>");
        pout.write("<td>" + request.isSecure() + "</td>");
        pout.write("</tr><tr>\n");
        pout.write("<th align=\"right\">isUserInRole(admin):&nbsp;</th>");
        pout.write("<td>" + request.isUserInRole("admin") + "</td>");
        pout.write("</tr><tr>\n");
        pout.write("<th align=\"right\">encodeRedirectURL(/foo?bar):&nbsp;</th>");
        pout.write("<td>" + response.encodeRedirectURL("/foo?bar") + "</td>");
        Enumeration<Locale> locales = request.getLocales();
        while (locales.hasMoreElements()) {
            pout.write("</tr><tr>\n");
            pout.write("<th align=\"right\">getLocales:&nbsp;</th>");
            pout.write("<td>" + locales.nextElement() + "</td>");
        }
        pout.write("</tr><tr>\n");
        pout.write("<th align=\"left\" colspan=\"2\"><big><br/>Other HTTP Headers:</big></th>");
        Enumeration<String> h = request.getHeaderNames();
        String name;
        while (h.hasMoreElements()) {
            name = (String) h.nextElement();
            Enumeration<String> h2 = request.getHeaders(name);
            while (h2.hasMoreElements()) {
                String hv = (String) h2.nextElement();
                pout.write("</tr><tr>\n");
                pout.write("<th align=\"right\">" + notag(name) + ":&nbsp;</th>");
                pout.write("<td>" + notag(hv) + "</td>");
            }
        }
        pout.write("</tr><tr>\n");
        pout.write("<th align=\"left\" colspan=\"2\"><big><br/>Request Parameters:</big></th>");
        h = request.getParameterNames();
        while (h.hasMoreElements()) {
            name = (String) h.nextElement();
            pout.write("</tr><tr>\n");
            pout.write("<th align=\"right\">" + notag(name) + ":&nbsp;</th>");
            pout.write("<td>" + notag(request.getParameter(name)) + "</td>");
            String[] values = request.getParameterValues(name);
            if (values == null) {
                pout.write("</tr><tr>\n");
                pout.write("<th align=\"right\">" + notag(name) + " Values:&nbsp;</th>");
                pout.write("<td>" + "NULL!" + "</td>");
            } else if (values.length > 1) {
                for (int i = 0; i < values.length; i++) {
                    pout.write("</tr><tr>\n");
                    pout.write("<th align=\"right\">" + notag(name) + "[" + i + "]:&nbsp;</th>");
                    pout.write("<td>" + notag(values[i]) + "</td>");
                }
            }
        }
        pout.write("</tr><tr>\n");
        pout.write("<th align=\"left\" colspan=\"2\"><big><br/>Cookies:</big></th>");
        Cookie[] cookies = request.getCookies();
        for (int i = 0; cookies != null && i < cookies.length; i++) {
            Cookie cookie = cookies[i];
            pout.write("</tr><tr>\n");
            pout.write("<th align=\"right\">" + notag(cookie.getName()) + ":&nbsp;</th>");
            pout.write("<td>" + notag(cookie.getValue()) + "</td>");
        }
        String content_type = request.getContentType();
        if (content_type != null && !content_type.startsWith("application/x-www-form-urlencoded") && !content_type.startsWith("multipart/form-data")) {
            pout.write("</tr><tr>\n");
            pout.write("<th align=\"left\" valign=\"top\" colspan=\"2\"><big><br/>Content:</big></th>");
            pout.write("</tr><tr>\n");
            pout.write("<td><pre>");
            char[] content = new char[4096];
            int len;
            try {
                Reader in = request.getReader();
                while ((len = in.read(content)) >= 0) pout.write(notag(new String(content, 0, len)));
            } catch (IOException e) {
                pout.write(e.toString());
            }
            pout.write("</pre></td>");
        }
        pout.write("</tr><tr>\n");
        pout.write("<th align=\"left\" colspan=\"2\"><big><br/>Request Attributes:</big></th>");
        Enumeration<String> a = request.getAttributeNames();
        while (a.hasMoreElements()) {
            name = (String) a.nextElement();
            pout.write("</tr><tr>\n");
            pout.write("<th align=\"right\" valign=\"top\">" + name.replace(".", " .") + ":&nbsp;</th>");
            Object value = request.getAttribute(name);
            if (value instanceof File) {
                File file = (File) value;
                pout.write("<td>" + "<pre>" + file.getName() + " (" + file.length() + " " + new Date(file.lastModified()) + ")</pre>" + "</td>");
            } else
                pout.write("<td>" + "<pre>" + toString(request.getAttribute(name)) + "</pre>" + "</td>");
        }
        request.setAttribute("org.eclipse.jetty.servlet.MultiPartFilter.files", null);
        pout.write("</tr><tr>\n");
        pout.write("<th align=\"left\" colspan=\"2\"><big><br/>Servlet InitParameters:</big></th>");
        a = getInitParameterNames();
        while (a.hasMoreElements()) {
            name = (String) a.nextElement();
            pout.write("</tr><tr>\n");
            pout.write("<th align=\"right\">" + name + ":&nbsp;</th>");
            pout.write("<td>" + toString(getInitParameter(name)) + "</td>");
        }
        pout.write("</tr><tr>\n");
        pout.write("<th align=\"left\" colspan=\"2\"><big><br/>Context InitParameters:</big></th>");
        a = getServletContext().getInitParameterNames();
        while (a.hasMoreElements()) {
            name = (String) a.nextElement();
            pout.write("</tr><tr>\n");
            pout.write("<th align=\"right\" valign=\"top\">" + name.replace(".", " .") + ":&nbsp;</th>");
            pout.write("<td>" + toString(getServletContext().getInitParameter(name)) + "</td>");
        }
        pout.write("</tr><tr>\n");
        pout.write("<th align=\"left\" colspan=\"2\"><big><br/>Context Attributes:</big></th>");
        a = getServletContext().getAttributeNames();
        while (a.hasMoreElements()) {
            name = (String) a.nextElement();
            pout.write("</tr><tr>\n");
            pout.write("<th align=\"right\" valign=\"top\">" + name.replace(".", " .") + ":&nbsp;</th>");
            pout.write("<td>" + "<pre>" + toString(getServletContext().getAttribute(name)) + "</pre>" + "</td>");
        }
        String res = request.getParameter("resource");
        if (res != null && res.length() > 0) {
            pout.write("</tr><tr>\n");
            pout.write("<th align=\"left\" colspan=\"2\"><big><br/>Get Resource: \"" + res + "\"</big></th>");
            pout.write("</tr><tr>\n");
            pout.write("<th align=\"right\">getServletContext().getResource(...):&nbsp;</th>");
            try {
                pout.write("<td>" + getServletContext().getResource(res) + "</td>");
            } catch (Exception e) {
                pout.write("<td>" + "" + e + "</td>");
            }
            pout.write("</tr><tr>\n");
            pout.write("<th align=\"right\">getServletContext().getResourcePaths(...):&nbsp;</th>");
            try {
                pout.write("<td>" + getServletContext().getResourcePaths(res) + "</td>");
            } catch (Exception e) {
                pout.write("<td>" + "" + e + "</td>");
            }
            pout.write("</tr><tr>\n");
            pout.write("<th align=\"right\">getServletContext().getRealPath(...):&nbsp;</th>");
            try {
                pout.write("<td>" + getServletContext().getRealPath(res) + "</td>");
            } catch (Exception e) {
                pout.write("<td>" + "" + e + "</td>");
            }
            pout.write("</tr><tr>\n");
            pout.write("<th align=\"right\">getServletContext().getContext(...):&nbsp;</th>");
            ServletContext context = getServletContext().getContext(res);
            pout.write("<td>" + context + "</td>");
            if (context != null) {
                pout.write("</tr><tr>\n");
                pout.write("<th align=\"right\">getServletContext().getContext(...).getResource(...):&nbsp;</th>");
                try {
                    pout.write("<td>" + context.getResource(res) + "</td>");
                } catch (Exception e) {
                    pout.write("<td>" + "" + e + "</td>");
                }
                pout.write("</tr><tr>\n");
                pout.write("<th align=\"right\">getServletContext().getContext(...).getResourcePaths(...):&nbsp;</th>");
                try {
                    pout.write("<td>" + context.getResourcePaths(res) + "</td>");
                } catch (Exception e) {
                    pout.write("<td>" + "" + e + "</td>");
                }
                String cp = context.getContextPath();
                if (cp == null || "/".equals(cp))
                    cp = "";
                pout.write("</tr><tr>\n");
                pout.write("<th align=\"right\">getServletContext().getContext(...).getRequestDispatcher(...):&nbsp;</th>");
                pout.write("<td>" + context.getRequestDispatcher(res.substring(cp.length())) + "</td>");
                pout.write("</tr><tr>\n");
                pout.write("<th align=\"right\">getServletContext().getContext(...).getRealPath(...):&nbsp;</th>");
                pout.write("<td>" + context.getRealPath(res.substring(cp.length())) + "</td>");
            }
            pout.write("</tr><tr>\n");
            pout.write("<th align=\"right\">this.getClass().getResource(...):&nbsp;</th>");
            pout.write("<td>" + this.getClass().getResource(res) + "</td>");
            pout.write("</tr><tr>\n");
            pout.write("<th align=\"right\">this.getClass().getClassLoader().getResource(...):&nbsp;</th>");
            pout.write("<td>" + this.getClass().getClassLoader().getResource(res) + "</td>");
            pout.write("</tr><tr>\n");
            pout.write("<th align=\"right\">Thread.currentThread().getContextClassLoader().getResource(...):&nbsp;</th>");
            pout.write("<td>" + Thread.currentThread().getContextClassLoader().getResource(res) + "</td>");
            pout.write("</tr><tr>\n");
            pout.write("<th align=\"right\">Thread.currentThread().getContextClassLoader().getResources(...):&nbsp;</th>");
            Enumeration<URL> urls = Thread.currentThread().getContextClassLoader().getResources(res);
            if (urls == null)
                pout.write("<td>null</td>");
            else
                pout.write("<td>" + Collections.list(urls) + "</td>");
        }
        pout.write("</tr></table>\n");
        /* ------------------------------------------------------------ */
        pout.write("<h2>Request Wrappers</h2>\n");
        ServletRequest rw = request;
        int w = 0;
        while (rw != null) {
            pout.write((w++) + ": " + rw.getClass().getName() + "<br/>");
            if (rw instanceof HttpServletRequestWrapper)
                rw = ((HttpServletRequestWrapper) rw).getRequest();
            else if (rw instanceof ServletRequestWrapper)
                rw = ((ServletRequestWrapper) rw).getRequest();
            else
                rw = null;
        }
        /* ------------------------------------------------------------ */
        pout.write("<h2>Response Wrappers</h2>\n");
        ServletResponse rsw = response;
        w = 0;
        while (rsw != null) {
            pout.write((w++) + ": " + rsw.getClass().getName() + "<br/>");
            if (rsw instanceof HttpServletResponseWrapper)
                rsw = ((HttpServletResponseWrapper) rsw).getResponse();
            else if (rsw instanceof ServletResponseWrapper)
                rsw = ((ServletResponseWrapper) rsw).getResponse();
            else
                rsw = null;
        }
        pout.write("<br/>");
        pout.write("<h2>International Characters (UTF-8)</h2>");
        pout.write("LATIN LETTER SMALL CAPITAL AE<br/>\n");
        pout.write("Directly uni encoded(\\u1d01): ᴁ<br/>");
        pout.write("HTML reference (&amp;AElig;): &AElig;<br/>");
        pout.write("Decimal (&amp;#7425;): &#7425;<br/>");
        pout.write("Javascript unicode (\\u1d01) : <script language='javascript'>document.write(\"ᴁ\");</script><br/>");
        pout.write("<br/>");
        pout.write("<h2>Form to generate GET content</h2>");
        pout.write("<form method=\"GET\" action=\"" + response.encodeURL(getURI(request)) + "\">");
        pout.write("TextField: <input type=\"text\" name=\"TextField\" value=\"value\"/><br/>\n");
        pout.write("<input type=\"submit\" name=\"Action\" value=\"Submit\">");
        pout.write("</form>");
        pout.write("<br/>");
        pout.write("<h2>Form to generate POST content</h2>");
        pout.write("<form method=\"POST\" accept-charset=\"utf-8\" action=\"" + response.encodeURL(getURI(request)) + "\">");
        pout.write("TextField: <input type=\"text\" name=\"TextField\" value=\"value\"/><br/>\n");
        pout.write("Select: <select multiple name=\"Select\">\n");
        pout.write("<option>ValueA</option>");
        pout.write("<option>ValueB1,ValueB2</option>");
        pout.write("<option>ValueC</option>");
        pout.write("</select><br/>");
        pout.write("<input type=\"submit\" name=\"Action\" value=\"Submit\"><br/>");
        pout.write("</form>");
        pout.write("<br/>");
        pout.write("<h2>Form to generate UPLOAD content</h2>");
        pout.write("<form method=\"POST\" enctype=\"multipart/form-data\" accept-charset=\"utf-8\" action=\"" + response.encodeURL(getURI(request)) + (request.getQueryString() == null ? "" : ("?" + request.getQueryString())) + "\">");
        pout.write("TextField: <input type=\"text\" name=\"TextField\" value=\"comment\"/><br/>\n");
        pout.write("File 1: <input type=\"file\" name=\"file1\" /><br/>\n");
        pout.write("File 2: <input type=\"file\" name=\"file2\" /><br/>\n");
        pout.write("<input type=\"submit\" name=\"Action\" value=\"Submit\"><br/>");
        pout.write("</form>");
        pout.write("<h2>Form to set Cookie</h2>");
        pout.write("<form method=\"POST\" action=\"" + response.encodeURL(getURI(request)) + "\">");
        pout.write("cookie: <input type=\"text\" name=\"cookie\" /><br/>\n");
        pout.write("value: <input type=\"text\" name=\"cookiev\" /><br/>\n");
        pout.write("<input type=\"submit\" name=\"Action\" value=\"setCookie\">");
        pout.write("</form>\n");
        pout.write("<h2>Form to get Resource</h2>");
        pout.write("<form method=\"POST\" action=\"" + response.encodeURL(getURI(request)) + "\">");
        pout.write("resource: <input type=\"text\" name=\"resource\" /><br/>\n");
        pout.write("<input type=\"submit\" name=\"Action\" value=\"getResource\">");
        pout.write("</form>\n");
    } catch (Exception e) {
        getServletContext().log("dump " + e);
    }
    String lines = request.getParameter("lines");
    if (lines != null) {
        char[] line = "<span>A line of characters. Blah blah blah blah.  blooble blooble</span></br>\n".toCharArray();
        for (int l = Integer.parseInt(lines); l-- > 0; ) {
            pout.write("<span>" + l + " </span>");
            pout.write(line);
        }
    }
    pout.write("</body>\n</html>\n");
    pout.close();
    if (pi != null) {
        if ("/ex4".equals(pi))
            throw new ServletException("test ex4", new Throwable());
        if ("/ex5".equals(pi))
            throw new IOException("test ex5");
        if ("/ex6".equals(pi))
            throw new UnavailableException("test ex6");
    }
}
Also used : Locale(java.util.Locale) HttpServletRequest(javax.servlet.http.HttpServletRequest) ServletRequest(javax.servlet.ServletRequest) OutputStream(java.io.OutputStream) UnavailableException(javax.servlet.UnavailableException) HttpServletResponseWrapper(javax.servlet.http.HttpServletResponseWrapper) Reader(java.io.Reader) AsyncContext(javax.servlet.AsyncContext) URL(java.net.URL) BufferedWriter(java.io.BufferedWriter) ServletException(javax.servlet.ServletException) Field(java.lang.reflect.Field) TimerTask(java.util.TimerTask) HttpServletRequestWrapper(javax.servlet.http.HttpServletRequestWrapper) ServletContext(javax.servlet.ServletContext) ServletResponseWrapper(javax.servlet.ServletResponseWrapper) HttpServletResponseWrapper(javax.servlet.http.HttpServletResponseWrapper) PrintWriter(java.io.PrintWriter) Cookie(javax.servlet.http.Cookie) HttpServletResponse(javax.servlet.http.HttpServletResponse) ServletResponse(javax.servlet.ServletResponse) HttpServletRequestWrapper(javax.servlet.http.HttpServletRequestWrapper) ServletRequestWrapper(javax.servlet.ServletRequestWrapper) IOException(java.io.IOException) AsyncEvent(javax.servlet.AsyncEvent) ServletException(javax.servlet.ServletException) IOException(java.io.IOException) UnavailableException(javax.servlet.UnavailableException) Date(java.util.Date) AsyncListener(javax.servlet.AsyncListener) OutputStreamWriter(java.io.OutputStreamWriter) File(java.io.File)

Aggregations

AsyncContext (javax.servlet.AsyncContext)194 IOException (java.io.IOException)90 HttpServletResponse (javax.servlet.http.HttpServletResponse)78 HttpServletRequest (javax.servlet.http.HttpServletRequest)76 ServletException (javax.servlet.ServletException)61 Test (org.junit.Test)57 CountDownLatch (java.util.concurrent.CountDownLatch)38 AsyncEvent (javax.servlet.AsyncEvent)35 AsyncListener (javax.servlet.AsyncListener)35 HttpServlet (javax.servlet.http.HttpServlet)34 ServletOutputStream (javax.servlet.ServletOutputStream)27 InterruptedIOException (java.io.InterruptedIOException)24 ReadListener (javax.servlet.ReadListener)20 ServletInputStream (javax.servlet.ServletInputStream)20 ContentResponse (org.eclipse.jetty.client.api.ContentResponse)18 Request (org.eclipse.jetty.server.Request)16 WriteListener (javax.servlet.WriteListener)15 PrintWriter (java.io.PrintWriter)14 UncheckedIOException (java.io.UncheckedIOException)14 ByteBuffer (java.nio.ByteBuffer)13