Search in sources :

Example 16 with ServletOutputStream

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

the class PushCacheFilterTest method testRecursivePush.

@Test
public void testRecursivePush() throws Exception {
    final String primaryResource = "/primary.html";
    final String secondaryResource1 = "/secondary1.css";
    final String secondaryResource2 = "/secondary2.js";
    final String tertiaryResource = "/tertiary.png";
    start(new HttpServlet() {

        @Override
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            String requestURI = request.getRequestURI();
            final ServletOutputStream output = response.getOutputStream();
            if (requestURI.endsWith(primaryResource))
                output.print("<html><head></head><body>PRIMARY</body></html>");
            else if (requestURI.endsWith(secondaryResource1))
                output.print("body { background-image: url(\"" + tertiaryResource + "\"); }");
            else if (requestURI.endsWith(secondaryResource2))
                output.print("(function() { window.alert('HTTP/2'); })()");
            if (requestURI.endsWith(tertiaryResource))
                output.write("TERTIARY".getBytes(StandardCharsets.UTF_8));
        }
    });
    final Session session = newClient(new Session.Listener.Adapter());
    // Request for the primary, secondary and tertiary resource to build the cache.
    final String primaryURI = newURI(primaryResource);
    HttpFields primaryFields = new HttpFields();
    MetaData.Request primaryRequest = newRequest("GET", primaryResource, primaryFields);
    final CountDownLatch warmupLatch = new CountDownLatch(2);
    session.newStream(new HeadersFrame(primaryRequest, null, true), new Promise.Adapter<>(), new Stream.Listener.Adapter() {

        @Override
        public void onData(Stream stream, DataFrame frame, Callback callback) {
            callback.succeeded();
            if (frame.isEndStream()) {
                // Request for the secondary resources.
                String secondaryURI1 = newURI(secondaryResource1);
                HttpFields secondaryFields1 = new HttpFields();
                secondaryFields1.put(HttpHeader.REFERER, primaryURI);
                MetaData.Request secondaryRequest1 = newRequest("GET", secondaryResource1, secondaryFields1);
                session.newStream(new HeadersFrame(secondaryRequest1, null, true), new Promise.Adapter<>(), new Stream.Listener.Adapter() {

                    @Override
                    public void onData(Stream stream, DataFrame frame, Callback callback) {
                        callback.succeeded();
                        if (frame.isEndStream()) {
                            // Request for the tertiary resource.
                            HttpFields tertiaryFields = new HttpFields();
                            tertiaryFields.put(HttpHeader.REFERER, secondaryURI1);
                            MetaData.Request tertiaryRequest = newRequest("GET", tertiaryResource, tertiaryFields);
                            session.newStream(new HeadersFrame(tertiaryRequest, null, true), new Promise.Adapter<>(), new Adapter() {

                                @Override
                                public void onData(Stream stream, DataFrame frame, Callback callback) {
                                    callback.succeeded();
                                    if (frame.isEndStream())
                                        warmupLatch.countDown();
                                }
                            });
                        }
                    }
                });
                HttpFields secondaryFields2 = new HttpFields();
                secondaryFields2.put(HttpHeader.REFERER, primaryURI);
                MetaData.Request secondaryRequest2 = newRequest("GET", secondaryResource2, secondaryFields2);
                session.newStream(new HeadersFrame(secondaryRequest2, null, true), new Promise.Adapter<>(), new Stream.Listener.Adapter() {

                    @Override
                    public void onData(Stream stream, DataFrame frame, Callback callback) {
                        callback.succeeded();
                        if (frame.isEndStream())
                            warmupLatch.countDown();
                    }
                });
            }
        }
    });
    Assert.assertTrue(warmupLatch.await(5, TimeUnit.SECONDS));
    Thread.sleep(1000);
    // Request again the primary resource, we should get the secondary and tertiary resources pushed.
    primaryRequest = newRequest("GET", primaryResource, primaryFields);
    final CountDownLatch primaryResponseLatch = new CountDownLatch(1);
    final CountDownLatch primaryPushesLatch = new CountDownLatch(3);
    final CountDownLatch recursiveLatch = new CountDownLatch(1);
    session.newStream(new HeadersFrame(primaryRequest, null, true), new Promise.Adapter<>(), new Stream.Listener.Adapter() {

        @Override
        public void onData(Stream stream, DataFrame frame, Callback callback) {
            callback.succeeded();
            if (frame.isEndStream())
                primaryResponseLatch.countDown();
        }

        @Override
        public Stream.Listener onPush(Stream stream, PushPromiseFrame frame) {
            // The stream id of the PUSH_PROMISE must
            // always be a client stream and therefore odd.
            Assert.assertEquals(1, frame.getStreamId() & 1);
            return new Adapter() {

                @Override
                public void onData(Stream stream, DataFrame frame, Callback callback) {
                    callback.succeeded();
                    if (frame.isEndStream())
                        primaryPushesLatch.countDown();
                }

                @Override
                public Stream.Listener onPush(Stream stream, PushPromiseFrame frame) {
                    return new Adapter() {

                        @Override
                        public void onData(Stream stream, DataFrame frame, Callback callback) {
                            callback.succeeded();
                            if (frame.isEndStream())
                                recursiveLatch.countDown();
                        }
                    };
                }
            };
        }
    });
    Assert.assertTrue(primaryPushesLatch.await(5, TimeUnit.SECONDS));
    Assert.assertFalse(recursiveLatch.await(1, TimeUnit.SECONDS));
    Assert.assertTrue(primaryResponseLatch.await(5, TimeUnit.SECONDS));
    // Make sure that explicitly requesting a secondary resource, we get the tertiary pushed.
    CountDownLatch secondaryResponseLatch = new CountDownLatch(1);
    CountDownLatch secondaryPushLatch = new CountDownLatch(1);
    MetaData.Request secondaryRequest = newRequest("GET", secondaryResource1, new HttpFields());
    session.newStream(new HeadersFrame(secondaryRequest, null, true), new Promise.Adapter<>(), new Stream.Listener.Adapter() {

        @Override
        public void onData(Stream stream, DataFrame frame, Callback callback) {
            callback.succeeded();
            if (frame.isEndStream())
                secondaryResponseLatch.countDown();
        }

        @Override
        public Stream.Listener onPush(Stream stream, PushPromiseFrame frame) {
            return new Adapter() {

                @Override
                public void onData(Stream stream, DataFrame frame, Callback callback) {
                    callback.succeeded();
                    if (frame.isEndStream())
                        secondaryPushLatch.countDown();
                }
            };
        }
    });
    Assert.assertTrue(secondaryPushLatch.await(5, TimeUnit.SECONDS));
    Assert.assertTrue(secondaryResponseLatch.await(5, TimeUnit.SECONDS));
}
Also used : ServletOutputStream(javax.servlet.ServletOutputStream) HeadersFrame(org.eclipse.jetty.http2.frames.HeadersFrame) HttpServletRequest(javax.servlet.http.HttpServletRequest) ServletException(javax.servlet.ServletException) MetaData(org.eclipse.jetty.http.MetaData) HttpFields(org.eclipse.jetty.http.HttpFields) Stream(org.eclipse.jetty.http2.api.Stream) ServletOutputStream(javax.servlet.ServletOutputStream) HttpServlet(javax.servlet.http.HttpServlet) HttpServletRequest(javax.servlet.http.HttpServletRequest) HttpServletResponse(javax.servlet.http.HttpServletResponse) IOException(java.io.IOException) DataFrame(org.eclipse.jetty.http2.frames.DataFrame) CountDownLatch(java.util.concurrent.CountDownLatch) PushPromiseFrame(org.eclipse.jetty.http2.frames.PushPromiseFrame) Promise(org.eclipse.jetty.util.Promise) Callback(org.eclipse.jetty.util.Callback) Session(org.eclipse.jetty.http2.api.Session) Test(org.junit.Test)

Example 17 with ServletOutputStream

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

the class PushCacheFilterTest method testSelfPush.

@Test
public void testSelfPush() throws Exception {
    // The test case is that of a login page, for example.
    // When the user sends the credentials to the login page,
    // the login may fail and redirect to the same login page,
    // perhaps with different query parameters.
    // In this case a request for the login page will push
    // the login page itself, which will generate the pushed
    // request for the login page, which will push the login
    // page itself, etc. which is not the desired behavior.
    final String primaryResource = "/login.html";
    start(new HttpServlet() {

        @Override
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            ServletOutputStream output = response.getOutputStream();
            String credentials = request.getParameter("credentials");
            if (credentials == null) {
                output.print("<html><head></head><body>LOGIN</body></html>");
            } else if ("secret".equals(credentials)) {
                output.print("<html><head></head><body>OK</body></html>");
            } else {
                response.setStatus(HttpStatus.TEMPORARY_REDIRECT_307);
                response.setHeader(HttpHeader.LOCATION.asString(), primaryResource);
            }
        }
    });
    final String primaryURI = newURI(primaryResource);
    final Session session = newClient(new Session.Listener.Adapter());
    // Login with the wrong credentials, causing a redirect to self.
    HttpFields primaryFields = new HttpFields();
    MetaData.Request primaryRequest = newRequest("GET", primaryResource + "?credentials=wrong", primaryFields);
    final CountDownLatch warmupLatch = new CountDownLatch(1);
    session.newStream(new HeadersFrame(primaryRequest, null, true), new Promise.Adapter<>(), new Stream.Listener.Adapter() {

        @Override
        public void onHeaders(Stream stream, HeadersFrame frame) {
            if (frame.isEndStream()) {
                MetaData.Response response = (MetaData.Response) frame.getMetaData();
                if (response.getStatus() == HttpStatus.TEMPORARY_REDIRECT_307) {
                    // Follow the redirect.
                    String location = response.getFields().get(HttpHeader.LOCATION);
                    HttpFields redirectFields = new HttpFields();
                    redirectFields.put(HttpHeader.REFERER, primaryURI);
                    MetaData.Request redirectRequest = newRequest("GET", location, redirectFields);
                    session.newStream(new HeadersFrame(redirectRequest, null, true), new Promise.Adapter<>(), new Adapter() {

                        @Override
                        public void onData(Stream stream, DataFrame frame, Callback callback) {
                            callback.succeeded();
                            if (frame.isEndStream())
                                warmupLatch.countDown();
                        }
                    });
                }
            }
        }
    });
    Assert.assertTrue(warmupLatch.await(5, TimeUnit.SECONDS));
    Thread.sleep(1000);
    // Login with the right credentials, there must be no push.
    primaryRequest = newRequest("GET", primaryResource + "?credentials=secret", primaryFields);
    final CountDownLatch primaryResponseLatch = new CountDownLatch(1);
    final CountDownLatch pushLatch = new CountDownLatch(1);
    session.newStream(new HeadersFrame(primaryRequest, null, true), new Promise.Adapter<>(), new Stream.Listener.Adapter() {

        @Override
        public void onData(Stream stream, DataFrame frame, Callback callback) {
            callback.succeeded();
            if (frame.isEndStream())
                primaryResponseLatch.countDown();
        }

        @Override
        public Stream.Listener onPush(Stream stream, PushPromiseFrame frame) {
            pushLatch.countDown();
            return null;
        }
    });
    Assert.assertFalse(pushLatch.await(1, TimeUnit.SECONDS));
    Assert.assertTrue(primaryResponseLatch.await(5, TimeUnit.SECONDS));
}
Also used : ServletOutputStream(javax.servlet.ServletOutputStream) HeadersFrame(org.eclipse.jetty.http2.frames.HeadersFrame) HttpServletRequest(javax.servlet.http.HttpServletRequest) ServletException(javax.servlet.ServletException) MetaData(org.eclipse.jetty.http.MetaData) HttpFields(org.eclipse.jetty.http.HttpFields) Stream(org.eclipse.jetty.http2.api.Stream) ServletOutputStream(javax.servlet.ServletOutputStream) HttpServlet(javax.servlet.http.HttpServlet) HttpServletRequest(javax.servlet.http.HttpServletRequest) HttpServletResponse(javax.servlet.http.HttpServletResponse) IOException(java.io.IOException) DataFrame(org.eclipse.jetty.http2.frames.DataFrame) CountDownLatch(java.util.concurrent.CountDownLatch) PushPromiseFrame(org.eclipse.jetty.http2.frames.PushPromiseFrame) HttpServletResponse(javax.servlet.http.HttpServletResponse) Promise(org.eclipse.jetty.util.Promise) Callback(org.eclipse.jetty.util.Callback) Session(org.eclipse.jetty.http2.api.Session) Test(org.junit.Test)

Example 18 with ServletOutputStream

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

the class AsyncTimeoutCompleteWrite method onTimeout.

@Override
public void onTimeout(AsyncEvent event) throws IOException {
    HttpServletRequest request = (HttpServletRequest) event.getSuppliedRequest();
    HttpServletResponse response = (HttpServletResponse) event.getSuppliedResponse();
    String fileName = (String) request.getAttribute("filename");
    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);
    event.getAsyncContext().complete();
}
Also used : HttpServletRequest(javax.servlet.http.HttpServletRequest) ServletOutputStream(javax.servlet.ServletOutputStream) HttpServletResponse(javax.servlet.http.HttpServletResponse)

Example 19 with ServletOutputStream

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

the class TestServletTypeStreamLengthWrite method doGet.

@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    String fileName = request.getServletPath();
    byte[] dataBytes = loadContentFileBytes(fileName);
    if (fileName.endsWith("txt"))
        response.setContentType("text/plain");
    else if (fileName.endsWith("mp3"))
        response.setContentType("audio/mpeg");
    response.setHeader("ETag", "W/etag-" + fileName);
    ServletOutputStream out = response.getOutputStream();
    response.setContentLength(dataBytes.length);
    out.write(dataBytes);
}
Also used : ServletOutputStream(javax.servlet.ServletOutputStream)

Example 20 with ServletOutputStream

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

the class TestStaticMimeTypeServlet method doGet.

@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    String fileName = request.getServletPath();
    byte[] dataBytes = loadContentFileBytes(fileName);
    response.setContentLength(dataBytes.length);
    response.setHeader("ETag", "W/etag-" + fileName);
    String mime = mimeTypes.getMimeByExtension(fileName);
    if (mime == null)
        response.setContentType("application/octet-stream");
    else
        response.setContentType(mime);
    ServletOutputStream out = response.getOutputStream();
    out.write(dataBytes);
}
Also used : ServletOutputStream(javax.servlet.ServletOutputStream)

Aggregations

ServletOutputStream (javax.servlet.ServletOutputStream)515 IOException (java.io.IOException)211 HttpServletResponse (javax.servlet.http.HttpServletResponse)148 Test (org.junit.Test)112 HttpServletRequest (javax.servlet.http.HttpServletRequest)108 ServletException (javax.servlet.ServletException)90 InputStream (java.io.InputStream)63 File (java.io.File)57 ByteArrayOutputStream (java.io.ByteArrayOutputStream)40 FileInputStream (java.io.FileInputStream)40 PrintWriter (java.io.PrintWriter)27 CountDownLatch (java.util.concurrent.CountDownLatch)27 WriteListener (javax.servlet.WriteListener)27 ContentResponse (org.eclipse.jetty.client.api.ContentResponse)27 HttpServlet (javax.servlet.http.HttpServlet)25 AsyncContext (javax.servlet.AsyncContext)23 ServletInputStream (javax.servlet.ServletInputStream)23 ArrayList (java.util.ArrayList)21 AbstractHandler (org.eclipse.jetty.server.handler.AbstractHandler)20 ByteArrayInputStream (java.io.ByteArrayInputStream)19