diff options
Diffstat (limited to 'jetty-spdy/spdy-http-server/src/test/java/org/eclipse/jetty/spdy/server/http/ServerHTTPSPDYTest.java')
-rw-r--r-- | jetty-spdy/spdy-http-server/src/test/java/org/eclipse/jetty/spdy/server/http/ServerHTTPSPDYTest.java | 1625 |
1 files changed, 0 insertions, 1625 deletions
diff --git a/jetty-spdy/spdy-http-server/src/test/java/org/eclipse/jetty/spdy/server/http/ServerHTTPSPDYTest.java b/jetty-spdy/spdy-http-server/src/test/java/org/eclipse/jetty/spdy/server/http/ServerHTTPSPDYTest.java deleted file mode 100644 index cbc577b553..0000000000 --- a/jetty-spdy/spdy-http-server/src/test/java/org/eclipse/jetty/spdy/server/http/ServerHTTPSPDYTest.java +++ /dev/null @@ -1,1625 +0,0 @@ -// -// ======================================================================== -// 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.spdy.server.http; - -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.nio.ByteBuffer; -import java.nio.charset.StandardCharsets; -import java.util.Arrays; -import java.util.concurrent.CountDownLatch; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.TimeoutException; -import java.util.concurrent.atomic.AtomicInteger; -import javax.servlet.AsyncContext; -import javax.servlet.AsyncEvent; -import javax.servlet.AsyncListener; -import javax.servlet.ServletException; -import javax.servlet.ServletOutputStream; -import javax.servlet.http.Cookie; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -import org.eclipse.jetty.http.HttpHeader; -import org.eclipse.jetty.server.HttpChannel; -import org.eclipse.jetty.server.Request; -import org.eclipse.jetty.server.handler.AbstractHandler; -import org.eclipse.jetty.spdy.api.BytesDataInfo; -import org.eclipse.jetty.spdy.api.DataInfo; -import org.eclipse.jetty.spdy.api.ReplyInfo; -import org.eclipse.jetty.spdy.api.Session; -import org.eclipse.jetty.spdy.api.Stream; -import org.eclipse.jetty.spdy.api.StreamFrameListener; -import org.eclipse.jetty.spdy.api.StringDataInfo; -import org.eclipse.jetty.spdy.api.SynInfo; -import org.eclipse.jetty.spdy.http.HTTPSPDYHeader; -import org.eclipse.jetty.util.Fields; -import org.eclipse.jetty.util.log.StdErrLog; -import org.junit.Assert; -import org.junit.Test; - -import static org.hamcrest.CoreMatchers.containsString; -import static org.hamcrest.CoreMatchers.is; -import static org.hamcrest.CoreMatchers.notNullValue; -import static org.hamcrest.core.IsInstanceOf.instanceOf; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertThat; -import static org.junit.Assert.assertTrue; -import static org.junit.Assert.fail; - -public class ServerHTTPSPDYTest extends AbstractHTTPSPDYTest -{ - public static final String SUSPENDED_ATTRIBUTE = ServerHTTPSPDYTest.class.getName() + ".SUSPENDED"; - - public ServerHTTPSPDYTest(short version) - { - super(version); - } - - @Test - public void testSimpleGET() throws Exception - { - final String path = "/foo"; - final CountDownLatch handlerLatch = new CountDownLatch(1); - Session session = startClient(version, startHTTPServer(version, new AbstractHandler() - { - @Override - public void handle(String target, Request request, HttpServletRequest httpRequest, HttpServletResponse httpResponse) - throws IOException, ServletException - { - request.setHandled(true); - assertEquals("GET", httpRequest.getMethod()); - assertEquals(path, target); - assertEquals(path, httpRequest.getRequestURI()); - assertThat("accept-encoding is set to gzip, even if client didn't set it", - httpRequest.getHeader("accept-encoding"), containsString("gzip")); - assertThat(httpRequest.getHeader("host"), is("localhost:" + connector.getLocalPort())); - handlerLatch.countDown(); - } - }, 30000), null); - - Fields headers = SPDYTestUtils.createHeaders("localhost", connector.getLocalPort(), version, "GET", path); - final CountDownLatch replyLatch = new CountDownLatch(1); - session.syn(new SynInfo(headers, true), new StreamFrameListener.Adapter() - { - @Override - public void onReply(Stream stream, ReplyInfo replyInfo) - { - assertTrue(replyInfo.isClose()); - Fields replyHeaders = replyInfo.getHeaders(); - assertThat(replyHeaders.get(HTTPSPDYHeader.STATUS.name(version)).getValue().contains("200"), is(true)); - assertThat(replyHeaders.get(HttpHeader.SERVER.asString()), is(notNullValue())); - assertThat(replyHeaders.get(HttpHeader.X_POWERED_BY.asString()), is(notNullValue())); - replyLatch.countDown(); - } - }); - assertTrue(handlerLatch.await(5, TimeUnit.SECONDS)); - assertTrue(replyLatch.await(5, TimeUnit.SECONDS)); - } - - @Test - public void testGETWithQueryString() throws Exception - { - final String path = "/foo"; - final String query = "p=1"; - final String uri = path + "?" + query; - final CountDownLatch handlerLatch = new CountDownLatch(1); - Session session = startClient(version, startHTTPServer(version, new AbstractHandler() - { - @Override - public void handle(String target, Request request, HttpServletRequest httpRequest, HttpServletResponse httpResponse) - throws IOException, ServletException - { - request.setHandled(true); - assertEquals("GET", httpRequest.getMethod()); - assertEquals(path, target); - assertEquals(path, httpRequest.getRequestURI()); - assertEquals(query, httpRequest.getQueryString()); - handlerLatch.countDown(); - } - }, 30000), null); - - Fields headers = SPDYTestUtils.createHeaders("localhost", connector.getPort(), version, "GET", uri); - final CountDownLatch replyLatch = new CountDownLatch(1); - session.syn(new SynInfo(headers, true), new StreamFrameListener.Adapter() - { - @Override - public void onReply(Stream stream, ReplyInfo replyInfo) - { - assertTrue(replyInfo.isClose()); - Fields replyHeaders = replyInfo.getHeaders(); - assertTrue(replyHeaders.get(HTTPSPDYHeader.STATUS.name(version)).getValue().contains("200")); - replyLatch.countDown(); - } - }); - assertTrue(handlerLatch.await(5, TimeUnit.SECONDS)); - assertTrue(replyLatch.await(5, TimeUnit.SECONDS)); - } - - @Test - public void testGETWithCookies() throws Exception - { - final String path = "/foo"; - final String uri = path; - final String cookie1 = "cookie1"; - final String cookie2 = "cookie2"; - final String cookie1Value = "cookie 1 value"; - final String cookie2Value = "cookie 2 value"; - final CountDownLatch handlerLatch = new CountDownLatch(1); - Session session = startClient(version, startHTTPServer(version, new AbstractHandler() - { - @Override - public void handle(String target, Request request, HttpServletRequest httpRequest, HttpServletResponse httpResponse) - throws IOException, ServletException - { - request.setHandled(true); - httpResponse.addCookie(new Cookie(cookie1, cookie1Value)); - httpResponse.addCookie(new Cookie(cookie2, cookie2Value)); - assertThat("method is GET", httpRequest.getMethod(), is("GET")); - assertThat("target is /foo", target, is(path)); - assertThat("requestUri is /foo", httpRequest.getRequestURI(), is(path)); - handlerLatch.countDown(); - } - }, 30000), null); - - Fields headers = SPDYTestUtils.createHeaders("localhost", connector.getPort(), version, "GET", uri); - final CountDownLatch replyLatch = new CountDownLatch(1); - session.syn(new SynInfo(headers, true), new StreamFrameListener.Adapter() - { - @Override - public void onReply(Stream stream, ReplyInfo replyInfo) - { - assertThat("isClose is true", replyInfo.isClose(), is(true)); - Fields replyHeaders = replyInfo.getHeaders(); - assertThat("response code is 200 OK", replyHeaders.get(HTTPSPDYHeader.STATUS.name(version)).getValue() - .contains("200"), is(true)); - assertThat(replyInfo.getHeaders().get("Set-Cookie").getValues().get(0), is(cookie1 + "=\"" + cookie1Value + - "\";Version=1")); - assertThat(replyInfo.getHeaders().get("Set-Cookie").getValues().get(1), is(cookie2 + "=\"" + cookie2Value + - "\";Version=1")); - replyLatch.countDown(); - } - }); - assertTrue(handlerLatch.await(5, TimeUnit.SECONDS)); - assertTrue(replyLatch.await(5, TimeUnit.SECONDS)); - } - - @Test - public void testHEAD() throws Exception - { - final String path = "/foo"; - final CountDownLatch handlerLatch = new CountDownLatch(1); - Session session = startClient(version, startHTTPServer(version, new AbstractHandler() - { - @Override - public void handle(String target, Request request, HttpServletRequest httpRequest, HttpServletResponse httpResponse) - throws IOException, ServletException - { - request.setHandled(true); - assertEquals("HEAD", httpRequest.getMethod()); - assertEquals(path, target); - assertEquals(path, httpRequest.getRequestURI()); - httpResponse.getWriter().write("body that shouldn't be sent on a HEAD request"); - handlerLatch.countDown(); - } - }, 30000), null); - - Fields headers = SPDYTestUtils.createHeaders("localhost", connector.getPort(), version, "HEAD", path); - final CountDownLatch replyLatch = new CountDownLatch(1); - session.syn(new SynInfo(headers, true), new StreamFrameListener.Adapter() - { - @Override - public void onReply(Stream stream, ReplyInfo replyInfo) - { - assertTrue(replyInfo.isClose()); - Fields replyHeaders = replyInfo.getHeaders(); - assertTrue(replyHeaders.get(HTTPSPDYHeader.STATUS.name(version)).getValue().contains("200")); - replyLatch.countDown(); - } - - @Override - public void onData(Stream stream, DataInfo dataInfo) - { - fail("HEAD request shouldn't send any data"); - } - }); - assertTrue(handlerLatch.await(5, TimeUnit.SECONDS)); - assertTrue(replyLatch.await(5, TimeUnit.SECONDS)); - } - - @Test - public void testPOSTWithDelayedContentBody() throws Exception - { - final String path = "/foo"; - final CountDownLatch handlerLatch = new CountDownLatch(1); - Session session = startClient(version, startHTTPServer(version, new AbstractHandler() - { - @Override - public void handle(String target, Request request, HttpServletRequest httpRequest, HttpServletResponse httpResponse) - throws IOException, ServletException - { - // don't read the request body, reply immediately - request.setHandled(true); - handlerLatch.countDown(); - } - }, 30000), null); - - Fields headers = SPDYTestUtils.createHeaders("localhost", connector.getPort(), version, "POST", path); - headers.put("content-type", "application/x-www-form-urlencoded"); - final CountDownLatch replyLatch = new CountDownLatch(1); - Stream stream = session.syn(new SynInfo(5, TimeUnit.SECONDS, headers, false, (byte)0), - new StreamFrameListener.Adapter() - { - @Override - public void onReply(Stream stream, ReplyInfo replyInfo) - { - assertTrue(replyInfo.isClose()); - Fields replyHeaders = replyInfo.getHeaders(); - assertTrue(replyHeaders.get(HTTPSPDYHeader.STATUS.name(version)).getValue().contains("200")); - replyLatch.countDown(); - } - }); - stream.data(new StringDataInfo("a", false)); - assertTrue(handlerLatch.await(5, TimeUnit.SECONDS)); - assertTrue(replyLatch.await(5, TimeUnit.SECONDS)); - stream.data(new StringDataInfo("b", true)); - } - - @Test - public void testPOSTWithParameters() throws Exception - { - final String path = "/foo"; - final String data = "a=1&b=2"; - final CountDownLatch handlerLatch = new CountDownLatch(1); - Session session = startClient(version, startHTTPServer(version, new AbstractHandler() - { - @Override - public void handle(String target, Request request, HttpServletRequest httpRequest, HttpServletResponse httpResponse) - throws IOException, ServletException - { - request.setHandled(true); - assertEquals("POST", httpRequest.getMethod()); - assertEquals("1", httpRequest.getParameter("a")); - assertEquals("2", httpRequest.getParameter("b")); - assertNotNull(httpRequest.getRemoteHost()); - assertNotNull(httpRequest.getRemotePort()); - assertNotNull(httpRequest.getRemoteAddr()); - assertNotNull(httpRequest.getLocalPort()); - assertNotNull(httpRequest.getLocalName()); - assertNotNull(httpRequest.getLocalAddr()); - assertNotNull(httpRequest.getServerPort()); - assertNotNull(httpRequest.getServerName()); - handlerLatch.countDown(); - } - }, 30000), null); - - Fields headers = SPDYTestUtils.createHeaders("localhost", connector.getPort(), version, "POST", path); - headers.put("content-type", "application/x-www-form-urlencoded"); - final CountDownLatch replyLatch = new CountDownLatch(1); - Stream stream = session.syn(new SynInfo(5, TimeUnit.SECONDS, headers, false, (byte)0), - new StreamFrameListener.Adapter() - { - @Override - public void onReply(Stream stream, ReplyInfo replyInfo) - { - assertTrue(replyInfo.isClose()); - Fields replyHeaders = replyInfo.getHeaders(); - assertTrue(replyHeaders.get(HTTPSPDYHeader.STATUS.name(version)).getValue().contains("200")); - replyLatch.countDown(); - } - }); - stream.data(new StringDataInfo(data, true)); - - assertTrue(handlerLatch.await(5, TimeUnit.SECONDS)); - assertTrue(replyLatch.await(5, TimeUnit.SECONDS)); - } - - @Test - public void testPOSTWithParametersInTwoFramesTwoReads() throws Exception - { - final String path = "/foo"; - final String data1 = "a=1&"; - final String data2 = "b=2"; - final CountDownLatch handlerLatch = new CountDownLatch(1); - Session session = startClient(version, startHTTPServer(version, new AbstractHandler() - { - @Override - public void handle(String target, Request request, HttpServletRequest httpRequest, HttpServletResponse httpResponse) - throws IOException, ServletException - { - request.setHandled(true); - assertEquals("POST", httpRequest.getMethod()); - assertEquals("1", httpRequest.getParameter("a")); - assertEquals("2", httpRequest.getParameter("b")); - handlerLatch.countDown(); - } - }, 30000), null); - - Fields headers = SPDYTestUtils.createHeaders("localhost", connector.getPort(), version, "POST", path); - headers.put("content-type", "application/x-www-form-urlencoded"); - final CountDownLatch replyLatch = new CountDownLatch(1); - Stream stream = session.syn(new SynInfo(5, TimeUnit.SECONDS, headers, false, (byte)0), - new StreamFrameListener.Adapter() - { - @Override - public void onReply(Stream stream, ReplyInfo replyInfo) - { - assertTrue(replyInfo.isClose()); - Fields replyHeaders = replyInfo.getHeaders(); - assertTrue(replyHeaders.get(HTTPSPDYHeader.STATUS.name(version)).getValue().contains("200")); - replyLatch.countDown(); - } - }); - // Sleep between the data frames so that they will be read in 2 reads - stream.data(new StringDataInfo(data1, false)); - Thread.sleep(1000); - stream.data(new StringDataInfo(data2, true)); - - assertTrue(handlerLatch.await(5, TimeUnit.SECONDS)); - assertTrue(replyLatch.await(5, TimeUnit.SECONDS)); - } - - @Test - public void testPOSTWithParametersInTwoFramesOneRead() throws Exception - { - final String path = "/foo"; - final String data1 = "a=1&"; - final String data2 = "b=2"; - final CountDownLatch handlerLatch = new CountDownLatch(1); - Session session = startClient(version, startHTTPServer(version, new AbstractHandler() - { - @Override - public void handle(String target, Request request, HttpServletRequest httpRequest, HttpServletResponse httpResponse) - throws IOException, ServletException - { - request.setHandled(true); - assertEquals("POST", httpRequest.getMethod()); - assertEquals("1", httpRequest.getParameter("a")); - assertEquals("2", httpRequest.getParameter("b")); - handlerLatch.countDown(); - } - }, 30000), null); - - Fields headers = SPDYTestUtils.createHeaders("localhost", connector.getPort(), version, "POST", path); - headers.put("content-type", "application/x-www-form-urlencoded"); - final CountDownLatch replyLatch = new CountDownLatch(1); - Stream stream = session.syn(new SynInfo(5, TimeUnit.SECONDS, headers, false, (byte)0), new StreamFrameListener.Adapter() - { - @Override - public void onReply(Stream stream, ReplyInfo replyInfo) - { - assertTrue(replyInfo.isClose()); - Fields replyHeaders = replyInfo.getHeaders(); - assertTrue(replyHeaders.toString(), replyHeaders.get(HTTPSPDYHeader.STATUS.name(version)).getValue().contains("200")); - replyLatch.countDown(); - } - }); - - // Send the data frames consecutively, so the server reads both frames in one read - stream.data(new StringDataInfo(data1, false)); - stream.data(new StringDataInfo(data2, true)); - - assertTrue(handlerLatch.await(5, TimeUnit.SECONDS)); - assertTrue(replyLatch.await(5, TimeUnit.SECONDS)); - } - - @Test - public void testGETWithSmallResponseContent() throws Exception - { - final String data = "0123456789ABCDEF"; - final CountDownLatch handlerLatch = new CountDownLatch(1); - Session session = startClient(version, startHTTPServer(version, new AbstractHandler() - { - @Override - public void handle(String target, Request request, HttpServletRequest httpRequest, HttpServletResponse httpResponse) - throws IOException, ServletException - { - request.setHandled(true); - httpResponse.setStatus(HttpServletResponse.SC_OK); - ServletOutputStream output = httpResponse.getOutputStream(); - output.write(data.getBytes(StandardCharsets.UTF_8)); - handlerLatch.countDown(); - } - }, 30000), null); - - Fields headers = SPDYTestUtils.createHeaders("localhost", connector.getPort(), version, "GET", "/foo"); - final CountDownLatch replyLatch = new CountDownLatch(1); - final CountDownLatch dataLatch = new CountDownLatch(1); - session.syn(new SynInfo(headers, true), new StreamFrameListener.Adapter() - { - @Override - public void onReply(Stream stream, ReplyInfo replyInfo) - { - Assert.assertFalse(replyInfo.isClose()); - Fields replyHeaders = replyInfo.getHeaders(); - assertTrue(replyHeaders.get(HTTPSPDYHeader.STATUS.name(version)).getValue().contains("200")); - replyLatch.countDown(); - } - - @Override - public void onData(Stream stream, DataInfo dataInfo) - { - assertTrue(dataInfo.isClose()); - assertEquals(data, dataInfo.asString(StandardCharsets.UTF_8, true)); - dataLatch.countDown(); - } - }); - assertTrue(handlerLatch.await(5, TimeUnit.SECONDS)); - assertTrue(replyLatch.await(5, TimeUnit.SECONDS)); - assertTrue(dataLatch.await(5, TimeUnit.SECONDS)); - } - - @Test - public void testGETWithOneByteResponseContent() throws Exception - { - final char data = 'x'; - final CountDownLatch handlerLatch = new CountDownLatch(1); - Session session = startClient(version, startHTTPServer(version, new AbstractHandler() - { - @Override - public void handle(String target, Request request, HttpServletRequest httpRequest, HttpServletResponse httpResponse) - throws IOException, ServletException - { - request.setHandled(true); - httpResponse.setStatus(HttpServletResponse.SC_OK); - ServletOutputStream output = httpResponse.getOutputStream(); - output.write(data); - handlerLatch.countDown(); - } - }, 30000), null); - - Fields headers = SPDYTestUtils.createHeaders("localhost", connector.getPort(), version, "GET", "/foo"); - final CountDownLatch replyLatch = new CountDownLatch(1); - final CountDownLatch dataLatch = new CountDownLatch(1); - session.syn(new SynInfo(headers, true), new StreamFrameListener.Adapter() - { - @Override - public void onReply(Stream stream, ReplyInfo replyInfo) - { - Assert.assertFalse(replyInfo.isClose()); - Fields replyHeaders = replyInfo.getHeaders(); - assertTrue(replyHeaders.get(HTTPSPDYHeader.STATUS.name(version)).getValue().contains("200")); - replyLatch.countDown(); - } - - @Override - public void onData(Stream stream, DataInfo dataInfo) - { - assertTrue(dataInfo.isClose()); - byte[] bytes = dataInfo.asBytes(true); - assertEquals(1, bytes.length); - assertEquals(data, bytes[0]); - dataLatch.countDown(); - } - }); - assertTrue(handlerLatch.await(5, TimeUnit.SECONDS)); - assertTrue(replyLatch.await(5, TimeUnit.SECONDS)); - assertTrue(dataLatch.await(5, TimeUnit.SECONDS)); - } - - @Test - public void testGETWithSmallResponseContentInTwoChunks() throws Exception - { - final String data1 = "0123456789ABCDEF"; - final String data2 = "FEDCBA9876543210"; - final CountDownLatch handlerLatch = new CountDownLatch(1); - Session session = startClient(version, startHTTPServer(version, new AbstractHandler() - { - @Override - public void handle(String target, Request request, HttpServletRequest httpRequest, HttpServletResponse httpResponse) - throws IOException, ServletException - { - request.setHandled(true); - httpResponse.setStatus(HttpServletResponse.SC_OK); - ServletOutputStream output = httpResponse.getOutputStream(); - output.write(data1.getBytes(StandardCharsets.UTF_8)); - output.flush(); - output.write(data2.getBytes(StandardCharsets.UTF_8)); - handlerLatch.countDown(); - } - }, 30000), null); - - Fields headers = SPDYTestUtils.createHeaders("localhost", connector.getPort(), version, "GET", "/foo"); - final CountDownLatch replyLatch = new CountDownLatch(1); - final CountDownLatch dataLatch = new CountDownLatch(2); - session.syn(new SynInfo(headers, true), new StreamFrameListener.Adapter() - { - private final AtomicInteger replyFrames = new AtomicInteger(); - private final AtomicInteger dataFrames = new AtomicInteger(); - - @Override - public void onReply(Stream stream, ReplyInfo replyInfo) - { - assertEquals(1, replyFrames.incrementAndGet()); - Assert.assertFalse(replyInfo.isClose()); - Fields replyHeaders = replyInfo.getHeaders(); - assertTrue(replyHeaders.get(HTTPSPDYHeader.STATUS.name(version)).getValue().contains("200")); - replyLatch.countDown(); - } - - @Override - public void onData(Stream stream, DataInfo dataInfo) - { - int data = dataFrames.incrementAndGet(); - assertTrue(data >= 1 && data <= 2); - if (data == 1) - assertEquals(data1, dataInfo.asString(StandardCharsets.UTF_8, true)); - else - assertEquals(data2, dataInfo.asString(StandardCharsets.UTF_8, true)); - dataLatch.countDown(); - } - }); - assertTrue(handlerLatch.await(5, TimeUnit.SECONDS)); - assertTrue(replyLatch.await(5, TimeUnit.SECONDS)); - assertTrue(dataLatch.await(5, TimeUnit.SECONDS)); - } - - @Test - public void testGETWithBigResponseContentInOneWrite() throws Exception - { - final byte[] data = new byte[128 * 1024]; - Arrays.fill(data, (byte)'x'); - final CountDownLatch handlerLatch = new CountDownLatch(1); - Session session = startClient(version, startHTTPServer(version, new AbstractHandler() - { - @Override - public void handle(String target, Request request, HttpServletRequest httpRequest, HttpServletResponse httpResponse) - throws IOException, ServletException - { - request.setHandled(true); - httpResponse.setStatus(HttpServletResponse.SC_OK); - ServletOutputStream output = httpResponse.getOutputStream(); - output.write(data); - handlerLatch.countDown(); - } - }, 30000), null); - - Fields headers = SPDYTestUtils.createHeaders("localhost", connector.getPort(), version, "GET", "/foo"); - final CountDownLatch replyLatch = new CountDownLatch(1); - final CountDownLatch dataLatch = new CountDownLatch(1); - session.syn(new SynInfo(headers, true), new StreamFrameListener.Adapter() - { - private final AtomicInteger contentBytes = new AtomicInteger(); - - @Override - public void onReply(Stream stream, ReplyInfo replyInfo) - { - Assert.assertFalse(replyInfo.isClose()); - Fields replyHeaders = replyInfo.getHeaders(); - assertTrue(replyHeaders.get(HTTPSPDYHeader.STATUS.name(version)).getValue().contains("200")); - replyLatch.countDown(); - } - - @Override - public void onData(Stream stream, DataInfo dataInfo) - { - contentBytes.addAndGet(dataInfo.asByteBuffer(true).remaining()); - if (dataInfo.isClose()) - { - assertEquals(data.length, contentBytes.get()); - dataLatch.countDown(); - } - } - }); - assertTrue(handlerLatch.await(5, TimeUnit.SECONDS)); - assertTrue(replyLatch.await(5, TimeUnit.SECONDS)); - assertTrue(dataLatch.await(5, TimeUnit.SECONDS)); - } - - @Test - public void testGETWithBigResponseContentInMultipleWrites() throws Exception - { - final byte[] data = new byte[4 * 1024]; - Arrays.fill(data, (byte)'x'); - final int writeTimes = 16; - final CountDownLatch handlerLatch = new CountDownLatch(1); - Session session = startClient(version, startHTTPServer(version, new AbstractHandler() - { - @Override - public void handle(String target, Request request, HttpServletRequest httpRequest, HttpServletResponse httpResponse) - throws IOException, ServletException - { - request.setHandled(true); - httpResponse.setStatus(HttpServletResponse.SC_OK); - ServletOutputStream output = httpResponse.getOutputStream(); - for (int i = 0; i < writeTimes; i++) - { - output.write(data); - } - handlerLatch.countDown(); - } - }, 30000), null); - - Fields headers = SPDYTestUtils.createHeaders("localhost", connector.getPort(), version, "GET", "/foo"); - final CountDownLatch replyLatch = new CountDownLatch(1); - final CountDownLatch dataLatch = new CountDownLatch(1); - session.syn(new SynInfo(headers, true), new StreamFrameListener.Adapter() - { - private final AtomicInteger contentBytes = new AtomicInteger(); - - @Override - public void onReply(Stream stream, ReplyInfo replyInfo) - { - Assert.assertFalse(replyInfo.isClose()); - Fields replyHeaders = replyInfo.getHeaders(); - assertTrue(replyHeaders.get(HTTPSPDYHeader.STATUS.name(version)).getValue().contains("200")); - replyLatch.countDown(); - } - - @Override - public void onData(Stream stream, DataInfo dataInfo) - { - contentBytes.addAndGet(dataInfo.asByteBuffer(true).remaining()); - if (dataInfo.isClose()) - { - assertEquals(data.length * writeTimes, contentBytes.get()); - dataLatch.countDown(); - } - } - }); - assertTrue(handlerLatch.await(5, TimeUnit.SECONDS)); - assertTrue(replyLatch.await(5, TimeUnit.SECONDS)); - assertTrue(dataLatch.await(5, TimeUnit.SECONDS)); - } - - @Test - public void testGETWithBigResponseContentInTwoWrites() throws Exception - { - final byte[] data = new byte[128 * 1024]; - Arrays.fill(data, (byte)'y'); - final CountDownLatch handlerLatch = new CountDownLatch(1); - Session session = startClient(version, startHTTPServer(version, new AbstractHandler() - { - @Override - public void handle(String target, Request request, HttpServletRequest httpRequest, HttpServletResponse httpResponse) - throws IOException, ServletException - { - request.setHandled(true); - httpResponse.setStatus(HttpServletResponse.SC_OK); - ServletOutputStream output = httpResponse.getOutputStream(); - output.write(data); - output.write(data); - handlerLatch.countDown(); - } - }, 30000), null); - - Fields headers = SPDYTestUtils.createHeaders("localhost", connector.getPort(), version, "GET", "/foo"); - final CountDownLatch replyLatch = new CountDownLatch(1); - final CountDownLatch dataLatch = new CountDownLatch(1); - session.syn(new SynInfo(headers, true), new StreamFrameListener.Adapter() - { - private final AtomicInteger contentBytes = new AtomicInteger(); - - @Override - public void onReply(Stream stream, ReplyInfo replyInfo) - { - Assert.assertFalse(replyInfo.isClose()); - Fields replyHeaders = replyInfo.getHeaders(); - assertTrue(replyHeaders.get(HTTPSPDYHeader.STATUS.name(version)).getValue().contains("200")); - replyLatch.countDown(); - } - - @Override - public void onData(Stream stream, DataInfo dataInfo) - { - contentBytes.addAndGet(dataInfo.asByteBuffer(true).remaining()); - if (dataInfo.isClose()) - { - assertEquals(2 * data.length, contentBytes.get()); - dataLatch.countDown(); - } - } - }); - assertTrue(handlerLatch.await(5, TimeUnit.SECONDS)); - assertTrue(replyLatch.await(5, TimeUnit.SECONDS)); - assertTrue(dataLatch.await(5, TimeUnit.SECONDS)); - } - - @Test - public void testGETWithOutputStreamFlushedAndClosed() throws Exception - { - final String data = "0123456789ABCDEF"; - final CountDownLatch handlerLatch = new CountDownLatch(1); - Session session = startClient(version, startHTTPServer(version, new AbstractHandler() - { - @Override - public void handle(String target, Request request, HttpServletRequest httpRequest, HttpServletResponse httpResponse) - throws IOException, ServletException - { - request.setHandled(true); - httpResponse.setStatus(HttpServletResponse.SC_OK); - ServletOutputStream output = httpResponse.getOutputStream(); - output.write(data.getBytes(StandardCharsets.UTF_8)); - output.flush(); - output.close(); - handlerLatch.countDown(); - } - }, 30000), null); - - Fields headers = SPDYTestUtils.createHeaders("localhost", connector.getPort(), version, "GET", "/foo"); - final CountDownLatch replyLatch = new CountDownLatch(1); - final CountDownLatch dataLatch = new CountDownLatch(1); - session.syn(new SynInfo(headers, true), new StreamFrameListener.Adapter() - { - private final ByteArrayOutputStream buffer = new ByteArrayOutputStream(); - - @Override - public void onReply(Stream stream, ReplyInfo replyInfo) - { - Assert.assertFalse(replyInfo.isClose()); - Fields replyHeaders = replyInfo.getHeaders(); - assertTrue(replyHeaders.get(HTTPSPDYHeader.STATUS.name(version)).getValue().contains("200")); - replyLatch.countDown(); - } - - @Override - public void onData(Stream stream, DataInfo dataInfo) - { - ByteBuffer byteBuffer = dataInfo.asByteBuffer(true); - while (byteBuffer.hasRemaining()) - buffer.write(byteBuffer.get()); - if (dataInfo.isClose()) - { - assertEquals(data, new String(buffer.toByteArray(), StandardCharsets.UTF_8)); - dataLatch.countDown(); - } - } - }); - assertTrue(handlerLatch.await(5, TimeUnit.SECONDS)); - assertTrue(replyLatch.await(5, TimeUnit.SECONDS)); - assertTrue(dataLatch.await(5, TimeUnit.SECONDS)); - } - - @Test - public void testGETWithResponseResetBuffer() throws Exception - { - final String data1 = "0123456789ABCDEF"; - final String data2 = "FEDCBA9876543210"; - final CountDownLatch handlerLatch = new CountDownLatch(1); - Session session = startClient(version, startHTTPServer(version, new AbstractHandler() - { - @Override - public void handle(String target, Request request, HttpServletRequest httpRequest, HttpServletResponse httpResponse) - throws IOException, ServletException - { - request.setHandled(true); - httpResponse.setStatus(HttpServletResponse.SC_OK); - ServletOutputStream output = httpResponse.getOutputStream(); - // Write some - output.write(data1.getBytes(StandardCharsets.UTF_8)); - // But then change your mind and reset the buffer - httpResponse.resetBuffer(); - output.write(data2.getBytes(StandardCharsets.UTF_8)); - handlerLatch.countDown(); - } - }, 30000), null); - - Fields headers = SPDYTestUtils.createHeaders("localhost", connector.getPort(), version, "GET", "/foo"); - final CountDownLatch replyLatch = new CountDownLatch(1); - final CountDownLatch dataLatch = new CountDownLatch(1); - session.syn(new SynInfo(headers, true), new StreamFrameListener.Adapter() - { - private final ByteArrayOutputStream buffer = new ByteArrayOutputStream(); - - @Override - public void onReply(Stream stream, ReplyInfo replyInfo) - { - Assert.assertFalse(replyInfo.isClose()); - Fields replyHeaders = replyInfo.getHeaders(); - assertTrue(replyHeaders.get(HTTPSPDYHeader.STATUS.name(version)).getValue().contains("200")); - replyLatch.countDown(); - } - - @Override - public void onData(Stream stream, DataInfo dataInfo) - { - ByteBuffer byteBuffer = dataInfo.asByteBuffer(true); - while (byteBuffer.hasRemaining()) - buffer.write(byteBuffer.get()); - if (dataInfo.isClose()) - { - assertEquals(data2, new String(buffer.toByteArray(), StandardCharsets.UTF_8)); - dataLatch.countDown(); - } - } - }); - assertTrue(handlerLatch.await(5, TimeUnit.SECONDS)); - assertTrue(replyLatch.await(5, TimeUnit.SECONDS)); - assertTrue(dataLatch.await(5, TimeUnit.SECONDS)); - } - - @Test - public void testGETWithRedirect() throws Exception - { - final String suffix = "/redirect"; - final CountDownLatch handlerLatch = new CountDownLatch(1); - Session session = startClient(version, startHTTPServer(version, new AbstractHandler() - { - @Override - public void handle(String target, Request request, HttpServletRequest httpRequest, HttpServletResponse httpResponse) - throws IOException, ServletException - { - request.setHandled(true); - String location = httpResponse.encodeRedirectURL(String.format("%s://%s:%d%s", - request.getScheme(), request.getLocalAddr(), request.getLocalPort(), target + suffix)); - httpResponse.sendRedirect(location); - handlerLatch.countDown(); - } - }, 30000), null); - - Fields headers = SPDYTestUtils.createHeaders("localhost", connector.getPort(), version, "GET", "/foo"); - final CountDownLatch replyLatch = new CountDownLatch(1); - session.syn(new SynInfo(headers, true), new StreamFrameListener.Adapter() - { - private final AtomicInteger replies = new AtomicInteger(); - - @Override - public void onReply(Stream stream, ReplyInfo replyInfo) - { - assertEquals(1, replies.incrementAndGet()); - assertTrue(replyInfo.isClose()); - Fields replyHeaders = replyInfo.getHeaders(); - assertTrue(replyHeaders.get(HTTPSPDYHeader.STATUS.name(version)).getValue().contains("302")); - assertTrue(replyHeaders.get("location").getValue().endsWith(suffix)); - replyLatch.countDown(); - } - }); - assertTrue(handlerLatch.await(5, TimeUnit.SECONDS)); - assertTrue(replyLatch.await(5, TimeUnit.SECONDS)); - } - - @Test - public void testGETWithSendError() throws Exception - { - final CountDownLatch handlerLatch = new CountDownLatch(1); - Session session = startClient(version, startHTTPServer(version, new AbstractHandler() - { - @Override - public void handle(String target, Request request, HttpServletRequest httpRequest, HttpServletResponse httpResponse) - throws IOException, ServletException - { - request.setHandled(true); - httpResponse.sendError(HttpServletResponse.SC_NOT_FOUND); - handlerLatch.countDown(); - } - }, 30000), null); - - Fields headers = SPDYTestUtils.createHeaders("localhost", connector.getPort(), version, "GET", "/foo"); - final CountDownLatch replyLatch = new CountDownLatch(1); - final CountDownLatch dataLatch = new CountDownLatch(1); - session.syn(new SynInfo(headers, true), new StreamFrameListener.Adapter() - { - private final AtomicInteger replies = new AtomicInteger(); - - @Override - public void onReply(Stream stream, ReplyInfo replyInfo) - { - assertEquals(1, replies.incrementAndGet()); - Assert.assertFalse(replyInfo.isClose()); - Fields replyHeaders = replyInfo.getHeaders(); - assertTrue(replyHeaders.get(HTTPSPDYHeader.STATUS.name(version)).getValue().contains("404")); - replyLatch.countDown(); - } - - @Override - public void onData(Stream stream, DataInfo dataInfo) - { - if (dataInfo.isClose()) - dataLatch.countDown(); - } - }); - assertTrue(handlerLatch.await(5, TimeUnit.SECONDS)); - assertTrue(replyLatch.await(5, TimeUnit.SECONDS)); - assertTrue(dataLatch.await(5, TimeUnit.SECONDS)); - } - - @Test - public void testGETWithException() throws Exception - { - StdErrLog log = StdErrLog.getLogger(HttpChannel.class); - log.setHideStacks(true); - - Session session = startClient(version, startHTTPServer(version, new AbstractHandler() - { - @Override - public void handle(String target, Request request, HttpServletRequest httpRequest, HttpServletResponse httpResponse) - throws IOException, ServletException - { - throw new NullPointerException("thrown_explicitly_by_the_test"); - } - }, 30000), null); - - Fields headers = SPDYTestUtils.createHeaders("localhost", connector.getPort(), version, "GET", "/foo"); - final CountDownLatch replyLatch = new CountDownLatch(1); - final CountDownLatch latch = new CountDownLatch(1); - session.syn(new SynInfo(headers, true), new StreamFrameListener.Adapter() - { - private final AtomicInteger replies = new AtomicInteger(); - - @Override - public void onReply(Stream stream, ReplyInfo replyInfo) - { - assertEquals(1, replies.incrementAndGet()); - Fields replyHeaders = replyInfo.getHeaders(); - assertTrue(replyHeaders.get(HTTPSPDYHeader.STATUS.name(version)).getValue().contains("500")); - replyLatch.countDown(); - if (replyInfo.isClose()) - latch.countDown(); - } - - @Override - public void onData(Stream stream, DataInfo dataInfo) - { - if (dataInfo.isClose()) - latch.countDown(); - } - }); - assertTrue(replyLatch.await(5, TimeUnit.SECONDS)); - assertTrue(latch.await(5, TimeUnit.SECONDS)); - - log.setHideStacks(false); - } - - @Test - public void testGETWithSmallResponseContentChunked() throws Exception - { - final String pangram1 = "the quick brown fox jumps over the lazy dog"; - final String pangram2 = "qualche vago ione tipo zolfo, bromo, sodio"; - final CountDownLatch handlerLatch = new CountDownLatch(1); - Session session = startClient(version, startHTTPServer(version, new AbstractHandler() - { - @Override - public void handle(String target, Request request, HttpServletRequest httpRequest, HttpServletResponse httpResponse) - throws IOException, ServletException - { - request.setHandled(true); - httpResponse.setHeader("Transfer-Encoding", "chunked"); - ServletOutputStream output = httpResponse.getOutputStream(); - output.write(pangram1.getBytes(StandardCharsets.UTF_8)); - httpResponse.setHeader("EXTRA", "X"); - output.flush(); - output.write(pangram2.getBytes(StandardCharsets.UTF_8)); - handlerLatch.countDown(); - } - }, 30000), null); - - Fields headers = SPDYTestUtils.createHeaders("localhost", connector.getPort(), version, "GET", "/foo"); - final CountDownLatch replyLatch = new CountDownLatch(1); - final CountDownLatch dataLatch = new CountDownLatch(2); - session.syn(new SynInfo(headers, true), new StreamFrameListener.Adapter() - { - private final AtomicInteger replyFrames = new AtomicInteger(); - private final AtomicInteger dataFrames = new AtomicInteger(); - - @Override - public void onReply(Stream stream, ReplyInfo replyInfo) - { - assertEquals(1, replyFrames.incrementAndGet()); - Assert.assertFalse(replyInfo.isClose()); - Fields replyHeaders = replyInfo.getHeaders(); - assertTrue(replyHeaders.get(HTTPSPDYHeader.STATUS.name(version)).getValue().contains("200")); - assertTrue(replyHeaders.get("extra").getValue().contains("X")); - replyLatch.countDown(); - } - - @Override - public void onData(Stream stream, DataInfo dataInfo) - { - int count = dataFrames.incrementAndGet(); - if (count == 1) - { - Assert.assertFalse(dataInfo.isClose()); - assertEquals(pangram1, dataInfo.asString(StandardCharsets.UTF_8, true)); - } - else if (count == 2) - { - assertTrue(dataInfo.isClose()); - assertEquals(pangram2, dataInfo.asString(StandardCharsets.UTF_8, true)); - } - dataLatch.countDown(); - } - }); - assertTrue(handlerLatch.await(5, TimeUnit.SECONDS)); - assertTrue(replyLatch.await(5, TimeUnit.SECONDS)); - assertTrue(dataLatch.await(5, TimeUnit.SECONDS)); - } - - @Test - public void testGETWithMediumContentAsBufferByPassed() throws Exception - { - final byte[] data = new byte[2048]; - - final CountDownLatch handlerLatch = new CountDownLatch(1); - Session session = startClient(version, startHTTPServer(version, new AbstractHandler() - { - @Override - public void handle(String target, Request request, HttpServletRequest httpRequest, HttpServletResponse httpResponse) - throws IOException, ServletException - { - request.setHandled(true); - request.getResponse().getHttpOutput().sendContent(ByteBuffer.wrap(data)); - handlerLatch.countDown(); - } - }, 30000), null); - - Fields headers = SPDYTestUtils.createHeaders("localhost", connector.getPort(), version, "GET", "/foo"); - final CountDownLatch replyLatch = new CountDownLatch(1); - final CountDownLatch dataLatch = new CountDownLatch(1); - session.syn(new SynInfo(headers, true), new StreamFrameListener.Adapter() - { - private final AtomicInteger replyFrames = new AtomicInteger(); - private final AtomicInteger contentLength = new AtomicInteger(); - - @Override - public void onReply(Stream stream, ReplyInfo replyInfo) - { - assertEquals(1, replyFrames.incrementAndGet()); - Assert.assertFalse(replyInfo.isClose()); - Fields replyHeaders = replyInfo.getHeaders(); - assertTrue(replyHeaders.get(HTTPSPDYHeader.STATUS.name(version)).getValue().contains("200")); - replyLatch.countDown(); - } - - @Override - public void onData(Stream stream, DataInfo dataInfo) - { - contentLength.addAndGet(dataInfo.asBytes(true).length); - if (dataInfo.isClose()) - { - Assert.assertEquals(data.length, contentLength.get()); - dataLatch.countDown(); - } - } - }); - assertTrue(handlerLatch.await(5, TimeUnit.SECONDS)); - assertTrue(replyLatch.await(5, TimeUnit.SECONDS)); - assertTrue(dataLatch.await(5, TimeUnit.SECONDS)); - } - - @Test - public void testGETWithMultipleMediumContentByPassed() throws Exception - { - final byte[] data = new byte[2048]; - Session session = startClient(version, startHTTPServer(version, new AbstractHandler() - { - @Override - public void handle(String target, Request request, HttpServletRequest httpRequest, HttpServletResponse httpResponse) - throws IOException, ServletException - { - // The sequence of write/flush/write/write below triggers a condition where - // HttpGenerator._bypass is set to true on the second write(), and the - // third write causes an infinite spin loop on the third write(). - request.setHandled(true); - OutputStream output = httpResponse.getOutputStream(); - output.write(data); - output.flush(); - output.write(data); - output.write(data); - } - }, 30000), null); - - Fields headers = SPDYTestUtils.createHeaders("localhost", connector.getPort(), version, "GET", "/foo"); - final CountDownLatch replyLatch = new CountDownLatch(1); - final CountDownLatch dataLatch = new CountDownLatch(1); - final AtomicInteger contentLength = new AtomicInteger(); - session.syn(new SynInfo(headers, true), new StreamFrameListener.Adapter() - { - @Override - public void onReply(Stream stream, ReplyInfo replyInfo) - { - Assert.assertFalse(replyInfo.isClose()); - Fields replyHeaders = replyInfo.getHeaders(); - assertTrue(replyHeaders.get(HTTPSPDYHeader.STATUS.name(version)).getValue().contains("200")); - replyLatch.countDown(); - } - - @Override - public void onData(Stream stream, DataInfo dataInfo) - { - dataInfo.consume(dataInfo.available()); - contentLength.addAndGet(dataInfo.length()); - if (dataInfo.isClose()) - dataLatch.countDown(); - } - }); - assertTrue(dataLatch.await(5, TimeUnit.SECONDS)); - assertEquals(3 * data.length, contentLength.get()); - } - - @Test - public void testPOSTThenSuspendRequestThenReadOneChunkThenComplete() throws Exception - { - final byte[] data = new byte[2000]; - final CountDownLatch latch = new CountDownLatch(1); - Session session = startClient(version, startHTTPServer(version, new AbstractHandler() - { - @Override - public void handle(String target, final Request request, HttpServletRequest httpRequest, HttpServletResponse httpResponse) - throws IOException, ServletException - { - request.setHandled(true); - final AsyncContext asyncContext = request.startAsync(); - new Thread() - { - @Override - public void run() - { - try - { - readRequestData(request, data.length); - asyncContext.complete(); - latch.countDown(); - } - catch (IOException x) - { - x.printStackTrace(); - } - } - }.start(); - } - }, 30000), null); - - Fields headers = SPDYTestUtils.createHeaders("localhost", connector.getPort(), version, "POST", "/foo"); - final CountDownLatch replyLatch = new CountDownLatch(1); - Stream stream = session.syn(new SynInfo(5, TimeUnit.SECONDS, headers, false, (byte)0), new StreamFrameListener.Adapter() - { - @Override - public void onReply(Stream stream, ReplyInfo replyInfo) - { - Fields replyHeaders = replyInfo.getHeaders(); - assertTrue(replyHeaders.get(HTTPSPDYHeader.STATUS.name(version)).getValue().contains("200")); - replyLatch.countDown(); - } - }); - stream.data(new BytesDataInfo(data, true)); - - assertTrue(latch.await(5, TimeUnit.SECONDS)); - assertTrue(replyLatch.await(5, TimeUnit.SECONDS)); - } - - @Test - public void testPOSTThenSuspendExpire() throws Exception - { - final CountDownLatch dispatchedAgainAfterExpire = new CountDownLatch(1); - Session session = startClient(version, startHTTPServer(version, new AbstractHandler() - { - @Override - public void handle(String target, final Request request, HttpServletRequest httpRequest, HttpServletResponse httpResponse) - throws IOException, ServletException - { - request.setHandled(true); - if (request.getAttribute(SUSPENDED_ATTRIBUTE) == Boolean.TRUE) - { - dispatchedAgainAfterExpire.countDown(); - } - else - { - AsyncContext asyncContext = request.startAsync(); - asyncContext.setTimeout(1000); - asyncContext.addListener(new AsyncListenerAdapter()); - request.setAttribute(SUSPENDED_ATTRIBUTE, Boolean.TRUE); - } - } - }, 30000), null); - - Fields headers = SPDYTestUtils.createHeaders("localhost", connector.getPort(), version, "POST", "/foo"); - final CountDownLatch replyLatch = new CountDownLatch(1); - session.syn(new SynInfo(5, TimeUnit.SECONDS, headers, true, (byte)0), new StreamFrameListener.Adapter() - { - @Override - public void onReply(Stream stream, ReplyInfo replyInfo) - { - Fields replyHeaders = replyInfo.getHeaders(); - assertTrue(replyHeaders.get(HTTPSPDYHeader.STATUS.name(version)).getValue().contains("200")); - replyLatch.countDown(); - } - }); - - assertTrue("Not dispatched again after expire", dispatchedAgainAfterExpire.await(5, - TimeUnit.SECONDS)); - assertTrue("Reply not sent", replyLatch.await(5, TimeUnit.SECONDS)); - } - - @Test - public void testPOSTThenSuspendExpireWithRequestData() throws Exception - { - final byte[] data = new byte[2000]; - final CountDownLatch dispatchedAgainAfterExpire = new CountDownLatch(1); - Session session = startClient(version, startHTTPServer(version, new AbstractHandler() - { - @Override - public void handle(String target, final Request request, HttpServletRequest httpRequest, HttpServletResponse httpResponse) - throws IOException, ServletException - { - request.setHandled(true); - if (request.getAttribute(SUSPENDED_ATTRIBUTE) == Boolean.TRUE) - { - dispatchedAgainAfterExpire.countDown(); - } - else - { - readRequestData(request, data.length); - AsyncContext asyncContext = request.startAsync(); - asyncContext.setTimeout(1000); - asyncContext.addListener(new AsyncListenerAdapter()); - request.setAttribute(SUSPENDED_ATTRIBUTE, Boolean.TRUE); - } - } - }, 30000), null); - - Fields headers = SPDYTestUtils.createHeaders("localhost", connector.getPort(), version, "POST", "/foo"); - final CountDownLatch replyLatch = new CountDownLatch(1); - Stream stream = session.syn(new SynInfo(5, TimeUnit.SECONDS, headers, false, (byte)0), new StreamFrameListener.Adapter() - { - @Override - public void onReply(Stream stream, ReplyInfo replyInfo) - { - Fields replyHeaders = replyInfo.getHeaders(); - assertTrue(replyHeaders.get(HTTPSPDYHeader.STATUS.name(version)).getValue().contains("200")); - replyLatch.countDown(); - } - }); - stream.data(new BytesDataInfo(data, true)); - - assertTrue("Not dispatched again after expire", dispatchedAgainAfterExpire.await(5, - TimeUnit.SECONDS)); - assertTrue("Reply not sent", replyLatch.await(5, TimeUnit.SECONDS)); - } - - private void readRequestData(Request request, int expectedDataLength) throws IOException - { - InputStream input = request.getInputStream(); - byte[] buffer = new byte[512]; - int read = 0; - while (read < expectedDataLength) - read += input.read(buffer); - } - - @Test - public void testPOSTThenSuspendRequestThenReadTwoChunksThenComplete() throws Exception - { - final byte[] data = new byte[2000]; - final CountDownLatch latch = new CountDownLatch(1); - Session session = startClient(version, startHTTPServer(version, new AbstractHandler() - { - @Override - public void handle(String target, final Request request, HttpServletRequest httpRequest, HttpServletResponse httpResponse) - throws IOException, ServletException - { - request.setHandled(true); - final AsyncContext asyncContext = request.startAsync(); - new Thread() - { - @Override - public void run() - { - try - { - InputStream input = request.getInputStream(); - byte[] buffer = new byte[512]; - int read = 0; - while (read < 2 * data.length) - read += input.read(buffer); - asyncContext.complete(); - latch.countDown(); - } - catch (IOException x) - { - x.printStackTrace(); - } - } - }.start(); - } - }, 30000), null); - - Fields headers = SPDYTestUtils.createHeaders("localhost", connector.getPort(), version, "POST", "/foo"); - final CountDownLatch replyLatch = new CountDownLatch(1); - Stream stream = session.syn(new SynInfo(5, TimeUnit.SECONDS, headers, false, (byte)0), new StreamFrameListener.Adapter() - { - @Override - public void onReply(Stream stream, ReplyInfo replyInfo) - { - Fields replyHeaders = replyInfo.getHeaders(); - assertTrue(replyHeaders.get(HTTPSPDYHeader.STATUS.name(version)).getValue().contains("200")); - replyLatch.countDown(); - } - }); - stream.data(new BytesDataInfo(data, false)); - stream.data(new BytesDataInfo(data, true)); - - assertTrue(latch.await(5, TimeUnit.SECONDS)); - assertTrue(replyLatch.await(5, TimeUnit.SECONDS)); - } - - @Test - public void testPOSTThenSuspendRequestThenResumeThenRespond() throws Exception - { - final byte[] data = new byte[1000]; - final CountDownLatch latch = new CountDownLatch(1); - Session session = startClient(version, startHTTPServer(version, new AbstractHandler() - { - @Override - public void handle(String target, final Request request, HttpServletRequest httpRequest, HttpServletResponse httpResponse) - throws IOException, ServletException - { - request.setHandled(true); - if (request.getAttribute(SUSPENDED_ATTRIBUTE) == Boolean.TRUE) - { - OutputStream output = httpResponse.getOutputStream(); - output.write(data); - } - else - { - final AsyncContext asyncContext = request.startAsync(); - request.setAttribute(SUSPENDED_ATTRIBUTE, Boolean.TRUE); - InputStream input = request.getInputStream(); - byte[] buffer = new byte[256]; - int read = 0; - while (read < data.length) - read += input.read(buffer); - new Thread() - { - @Override - public void run() - { - try - { - TimeUnit.SECONDS.sleep(1); - asyncContext.dispatch(); - latch.countDown(); - } - catch (InterruptedException x) - { - x.printStackTrace(); - } - } - }.start(); - } - } - }, 30000), null); - - Fields headers = SPDYTestUtils.createHeaders("localhost", connector.getPort(), version, "POST", "/foo"); - final CountDownLatch responseLatch = new CountDownLatch(2); - Stream stream = session.syn(new SynInfo(5, TimeUnit.SECONDS, headers, false, (byte)0), new StreamFrameListener.Adapter() - { - @Override - public void onReply(Stream stream, ReplyInfo replyInfo) - { - Fields replyHeaders = replyInfo.getHeaders(); - assertTrue(replyHeaders.get(HTTPSPDYHeader.STATUS.name(version)).getValue().contains("200")); - responseLatch.countDown(); - } - - @Override - public void onData(Stream stream, DataInfo dataInfo) - { - if (dataInfo.isClose()) - responseLatch.countDown(); - } - }); - stream.data(new BytesDataInfo(data, true)); - - assertTrue(latch.await(5, TimeUnit.SECONDS)); - assertTrue(responseLatch.await(5, TimeUnit.SECONDS)); - } - - @Test - public void testPOSTThenResponseWithoutReadingContent() throws Exception - { - final byte[] data = new byte[1000]; - final CountDownLatch latch = new CountDownLatch(1); - Session session = startClient(version, startHTTPServer(version, new AbstractHandler() - { - @Override - public void handle(String target, final Request request, HttpServletRequest httpRequest, HttpServletResponse httpResponse) - throws IOException, ServletException - { - request.setHandled(true); - latch.countDown(); - } - }, 30000), null); - - Fields headers = SPDYTestUtils.createHeaders("localhost", connector.getPort(), version, "POST", "/foo"); - final CountDownLatch responseLatch = new CountDownLatch(1); - Stream stream = session.syn(new SynInfo(5, TimeUnit.SECONDS, headers, false, (byte)0), new StreamFrameListener.Adapter() - { - @Override - public void onReply(Stream stream, ReplyInfo replyInfo) - { - Fields replyHeaders = replyInfo.getHeaders(); - assertTrue(replyHeaders.get(HTTPSPDYHeader.STATUS.name(version)).getValue().contains("200")); - responseLatch.countDown(); - } - }); - stream.data(new BytesDataInfo(data, false)); - stream.data(new BytesDataInfo(5, TimeUnit.SECONDS, data, true)); - - assertTrue(latch.await(5, TimeUnit.SECONDS)); - assertTrue(responseLatch.await(5, TimeUnit.SECONDS)); - } - - @Test - public void testIdleTimeout() throws Exception - { - final int idleTimeout = 500; - final CountDownLatch timeoutReceivedLatch = new CountDownLatch(1); - - Session session = startClient(version, startHTTPServer(version, new AbstractHandler() - { - @Override - public void handle(String target, final Request request, HttpServletRequest httpRequest, HttpServletResponse httpResponse) - throws IOException, ServletException - { - try - { - Thread.sleep(2 * idleTimeout); - } - catch (InterruptedException e) - { - throw new RuntimeException(e); - } - request.setHandled(true); - } - }, 30000), null); - - Fields headers = SPDYTestUtils.createHeaders("localhost", connector.getPort(), version, "GET", "/"); - Stream stream = session.syn(new SynInfo(5, TimeUnit.SECONDS, headers, true, (byte)0), - new StreamFrameListener.Adapter() - { - @Override - public void onFailure(Stream stream, Throwable x) - { - assertThat("we got a TimeoutException", x, instanceOf(TimeoutException.class)); - timeoutReceivedLatch.countDown(); - } - }); - stream.setIdleTimeout(idleTimeout); - - assertThat("idle timeout hit", timeoutReceivedLatch.await(5, TimeUnit.SECONDS), is(true)); - } - - @Test - public void testIdleTimeoutSetOnConnectionOnly() throws Exception - { - final int idleTimeout = 500; - final CountDownLatch timeoutReceivedLatch = new CountDownLatch(1); - Session session = startClient(version, startHTTPServer(version, new AbstractHandler() - { - @Override - public void handle(String target, final Request request, HttpServletRequest httpRequest, HttpServletResponse httpResponse) - throws IOException, ServletException - { - try - { - Thread.sleep(2 * idleTimeout); - } - catch (InterruptedException e) - { - throw new RuntimeException(e); - } - request.setHandled(true); - } - }, idleTimeout), null); - - Fields headers = SPDYTestUtils.createHeaders("localhost", connector.getPort(), version, "GET", "/"); - session.syn(new SynInfo(5, TimeUnit.SECONDS, headers, true, (byte)0), - new StreamFrameListener.Adapter() - { - @Override - public void onFailure(Stream stream, Throwable x) - { - assertThat("we got a TimeoutException", x, instanceOf(TimeoutException.class)); - timeoutReceivedLatch.countDown(); - } - }); - - assertThat("idle timeout hit", timeoutReceivedLatch.await(5, TimeUnit.SECONDS), is(true)); - } - - @Test - public void testSingleStreamIdleTimeout() throws Exception - { - final int idleTimeout = 500; - final CountDownLatch timeoutReceivedLatch = new CountDownLatch(1); - final CountDownLatch replyReceivedLatch = new CountDownLatch(3); - Session session = startClient(version, startHTTPServer(version, new AbstractHandler() - { - @Override - public void handle(String target, final Request request, HttpServletRequest httpRequest, HttpServletResponse httpResponse) - throws IOException, ServletException - { - if ("true".equals(request.getHeader("slow"))) - { - try - { - Thread.sleep(2 * idleTimeout); - } - catch (InterruptedException e) - { - throw new RuntimeException(e); - } - } - request.setHandled(true); - } - }, idleTimeout), null); - - Fields headers = SPDYTestUtils.createHeaders("localhost", connector.getPort(), version, "GET", "/"); - Fields slowHeaders = SPDYTestUtils.createHeaders("localhost", connector.getPort(), version, "GET", "/"); - slowHeaders.add("slow", "true"); - sendSingleRequestThatIsNotExpectedToTimeout(replyReceivedLatch, session, headers); - session.syn(new SynInfo(5, TimeUnit.SECONDS, slowHeaders, true, (byte)0), - new StreamFrameListener.Adapter() - { - @Override - public void onFailure(Stream stream, Throwable x) - { - assertThat("we got a TimeoutException", x, instanceOf(TimeoutException.class)); - timeoutReceivedLatch.countDown(); - } - }); - Thread.sleep(idleTimeout / 2); - sendSingleRequestThatIsNotExpectedToTimeout(replyReceivedLatch, session, headers); - Thread.sleep(idleTimeout / 2); - sendSingleRequestThatIsNotExpectedToTimeout(replyReceivedLatch, session, headers); - assertThat("idle timeout hit", timeoutReceivedLatch.await(5, TimeUnit.SECONDS), is(true)); - assertThat("received replies on 3 non idle requests", replyReceivedLatch.await(5, TimeUnit.SECONDS), - is(true)); - } - - private void sendSingleRequestThatIsNotExpectedToTimeout(final CountDownLatch replyReceivedLatch, Session session, Fields headers) throws ExecutionException, InterruptedException, TimeoutException - { - session.syn(new SynInfo(5, TimeUnit.SECONDS, headers, true, (byte)0), - new StreamFrameListener.Adapter() - { - @Override - public void onReply(Stream stream, ReplyInfo replyInfo) - { - replyReceivedLatch.countDown(); - } - }); - } - - private class AsyncListenerAdapter implements AsyncListener - { - @Override - public void onStartAsync(AsyncEvent event) throws IOException - { - } - - @Override - public void onComplete(AsyncEvent event) throws IOException - { - } - - @Override - public void onTimeout(AsyncEvent event) throws IOException - { - event.getAsyncContext().dispatch(); - } - - @Override - public void onError(AsyncEvent event) throws IOException - { - } - } -} |