Search in sources :

Example 1 with Logger

use of org.eclipse.jetty.util.log.Logger in project jetty.project by eclipse.

the class InterleavingTest method testInterleaving.

@Test
public void testInterleaving() throws Exception {
    CountDownLatch serverStreamsLatch = new CountDownLatch(2);
    List<Stream> serverStreams = new ArrayList<>();
    start(new ServerSessionListener.Adapter() {

        @Override
        public Stream.Listener onNewStream(Stream stream, HeadersFrame frame) {
            serverStreams.add(stream);
            serverStreamsLatch.countDown();
            return null;
        }
    });
    int maxFrameSize = Frame.DEFAULT_MAX_LENGTH + 1;
    Session session = newClient(new Session.Listener.Adapter() {

        @Override
        public Map<Integer, Integer> onPreface(Session session) {
            Map<Integer, Integer> settings = new HashMap<>();
            settings.put(SettingsFrame.MAX_FRAME_SIZE, maxFrameSize);
            return settings;
        }
    });
    BlockingQueue<FrameBytesCallback> dataFrames = new LinkedBlockingDeque<>();
    Stream.Listener streamListener = new Stream.Listener.Adapter() {

        @Override
        public void onData(Stream stream, DataFrame frame, Callback callback) {
            ByteBuffer data = frame.getData();
            byte[] bytes = new byte[data.remaining()];
            data.get(bytes);
            dataFrames.offer(new FrameBytesCallback(frame, bytes, callback));
        }
    };
    HeadersFrame headersFrame1 = new HeadersFrame(newRequest("GET", new HttpFields()), null, true);
    FuturePromise<Stream> streamPromise1 = new FuturePromise<>();
    session.newStream(headersFrame1, streamPromise1, streamListener);
    streamPromise1.get(5, TimeUnit.SECONDS);
    HeadersFrame headersFrame2 = new HeadersFrame(newRequest("GET", new HttpFields()), null, true);
    FuturePromise<Stream> streamPromise2 = new FuturePromise<>();
    session.newStream(headersFrame2, streamPromise2, streamListener);
    streamPromise2.get(5, TimeUnit.SECONDS);
    Assert.assertTrue(serverStreamsLatch.await(5, TimeUnit.SECONDS));
    Thread.sleep(1000);
    Stream serverStream1 = serverStreams.get(0);
    Stream serverStream2 = serverStreams.get(1);
    MetaData.Response response1 = new MetaData.Response(HttpVersion.HTTP_2, HttpStatus.OK_200, new HttpFields(), 0);
    serverStream1.headers(new HeadersFrame(serverStream1.getId(), response1, null, false), Callback.NOOP);
    Random random = new Random();
    byte[] content1 = new byte[2 * ((ISession) serverStream1.getSession()).updateSendWindow(0)];
    random.nextBytes(content1);
    byte[] content2 = new byte[2 * ((ISession) serverStream2.getSession()).updateSendWindow(0)];
    random.nextBytes(content2);
    MetaData.Response response2 = new MetaData.Response(HttpVersion.HTTP_2, HttpStatus.OK_200, new HttpFields(), 0);
    serverStream2.headers(new HeadersFrame(serverStream2.getId(), response2, null, false), new Callback() {

        @Override
        public void succeeded() {
            // Write data for both streams from within the callback so that they get queued together.
            ByteBuffer buffer1 = ByteBuffer.wrap(content1);
            serverStream1.data(new DataFrame(serverStream1.getId(), buffer1, true), NOOP);
            ByteBuffer buffer2 = ByteBuffer.wrap(content2);
            serverStream2.data(new DataFrame(serverStream2.getId(), buffer2, true), NOOP);
        }
    });
    // The client reads with a buffer size that is different from the
    // frame size and synthesizes DATA frames, so expect N frames for
    // stream1 up to maxFrameSize of data, then M frames for stream2
    // up to maxFrameSize of data, and so forth, interleaved.
    Map<Integer, ByteArrayOutputStream> contents = new HashMap<>();
    contents.put(serverStream1.getId(), new ByteArrayOutputStream());
    contents.put(serverStream2.getId(), new ByteArrayOutputStream());
    List<StreamLength> streamLengths = new ArrayList<>();
    int finished = 0;
    while (finished < 2) {
        FrameBytesCallback frameBytesCallback = dataFrames.poll(5, TimeUnit.SECONDS);
        if (frameBytesCallback == null)
            Assert.fail();
        DataFrame dataFrame = frameBytesCallback.frame;
        int streamId = dataFrame.getStreamId();
        int length = dataFrame.remaining();
        streamLengths.add(new StreamLength(streamId, length));
        if (dataFrame.isEndStream())
            ++finished;
        contents.get(streamId).write(frameBytesCallback.bytes);
        frameBytesCallback.callback.succeeded();
    }
    // Verify that the content has been sent properly.
    Assert.assertArrayEquals(content1, contents.get(serverStream1.getId()).toByteArray());
    Assert.assertArrayEquals(content2, contents.get(serverStream2.getId()).toByteArray());
    // Verify that the interleaving is correct.
    Map<Integer, List<Integer>> groups = new HashMap<>();
    groups.put(serverStream1.getId(), new ArrayList<>());
    groups.put(serverStream2.getId(), new ArrayList<>());
    int currentStream = 0;
    int currentLength = 0;
    for (StreamLength streamLength : streamLengths) {
        if (currentStream == 0)
            currentStream = streamLength.stream;
        if (currentStream != streamLength.stream) {
            groups.get(currentStream).add(currentLength);
            currentStream = streamLength.stream;
            currentLength = 0;
        }
        currentLength += streamLength.length;
    }
    groups.get(currentStream).add(currentLength);
    Logger logger = Log.getLogger(getClass());
    logger.debug("frame lengths = {}", streamLengths);
    groups.forEach((stream, lengths) -> {
        logger.debug("stream {} interleaved lengths = {}", stream, lengths);
        for (Integer length : lengths) Assert.assertThat(length, Matchers.lessThanOrEqualTo(maxFrameSize));
    });
}
Also used : ServerSessionListener(org.eclipse.jetty.http2.api.server.ServerSessionListener) LinkedBlockingDeque(java.util.concurrent.LinkedBlockingDeque) HashMap(java.util.HashMap) ArrayList(java.util.ArrayList) Logger(org.eclipse.jetty.util.log.Logger) HeadersFrame(org.eclipse.jetty.http2.frames.HeadersFrame) Random(java.util.Random) MetaData(org.eclipse.jetty.http.MetaData) HttpFields(org.eclipse.jetty.http.HttpFields) ByteArrayOutputStream(java.io.ByteArrayOutputStream) Stream(org.eclipse.jetty.http2.api.Stream) ArrayList(java.util.ArrayList) List(java.util.List) FuturePromise(org.eclipse.jetty.util.FuturePromise) DataFrame(org.eclipse.jetty.http2.frames.DataFrame) ByteArrayOutputStream(java.io.ByteArrayOutputStream) CountDownLatch(java.util.concurrent.CountDownLatch) ByteBuffer(java.nio.ByteBuffer) Callback(org.eclipse.jetty.util.Callback) HashMap(java.util.HashMap) Map(java.util.Map) ServerSessionListener(org.eclipse.jetty.http2.api.server.ServerSessionListener) Session(org.eclipse.jetty.http2.api.Session) ISession(org.eclipse.jetty.http2.ISession) Test(org.junit.Test)

Example 2 with Logger

use of org.eclipse.jetty.util.log.Logger in project jetty.project by eclipse.

the class HttpConnectionTest method testOversizedResponse.

@Test
public void testOversizedResponse() throws Exception {
    String str = "thisisastringthatshouldreachover1kbytes-";
    for (int i = 0; i < 500; i++) str += "xxxxxxxxxxxx";
    final String longstr = str;
    final CountDownLatch checkError = new CountDownLatch(1);
    String response = null;
    server.stop();
    server.setHandler(new AbstractHandler.ErrorDispatchHandler() {

        @Override
        protected void doNonErrorHandle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
            baseRequest.setHandled(true);
            response.setHeader(HttpHeader.CONTENT_TYPE.toString(), MimeTypes.Type.TEXT_HTML.toString());
            response.setHeader("LongStr", longstr);
            PrintWriter writer = response.getWriter();
            writer.write("<html><h1>FOO</h1></html>");
            writer.flush();
            if (writer.checkError())
                checkError.countDown();
            response.flushBuffer();
        }
    });
    server.start();
    Logger logger = Log.getLogger(HttpChannel.class);
    try (StacklessLogging stackless = new StacklessLogging(logger)) {
        logger.info("Expect IOException: Response header too large...");
        response = connector.getResponse("GET / HTTP/1.1\r\n" + "Host: localhost\r\n" + "\r\n");
        checkContains(response, 0, "HTTP/1.1 500");
        assertTrue(checkError.await(1, TimeUnit.SECONDS));
    } catch (Exception e) {
        if (response != null)
            System.err.println(response);
        throw e;
    }
}
Also used : HttpServletRequest(javax.servlet.http.HttpServletRequest) HttpServletResponse(javax.servlet.http.HttpServletResponse) IOException(java.io.IOException) CountDownLatch(java.util.concurrent.CountDownLatch) Logger(org.eclipse.jetty.util.log.Logger) LocalEndPoint(org.eclipse.jetty.server.LocalConnector.LocalEndPoint) AbstractHandler(org.eclipse.jetty.server.handler.AbstractHandler) ServletException(javax.servlet.ServletException) IOException(java.io.IOException) HttpServletRequest(javax.servlet.http.HttpServletRequest) ServletException(javax.servlet.ServletException) StacklessLogging(org.eclipse.jetty.util.log.StacklessLogging) PrintWriter(java.io.PrintWriter) Test(org.junit.Test)

Example 3 with Logger

use of org.eclipse.jetty.util.log.Logger in project jetty.project by eclipse.

the class HttpConnectionTest method testUnconsumedException.

@Test
public void testUnconsumedException() throws Exception {
    int offset = 0;
    String requests = "GET /R1?read=1&ISE=true HTTP/1.1\r\n" + "Host: localhost\r\n" + "Transfer-Encoding: chunked\r\n" + "Content-Type: text/plain; charset=utf-8\r\n" + "\r\n" + "5;\r\n" + "12345\r\n" + "5;\r\n" + "67890\r\n" + "0;\r\n" + "\r\n" + "GET /R2 HTTP/1.1\r\n" + "Host: localhost\r\n" + "Content-Type: text/plain; charset=utf-8\r\n" + "Content-Length: 10\r\n" + "\r\n" + "abcdefghij\r\n";
    Logger logger = Log.getLogger(HttpChannel.class);
    try (StacklessLogging stackless = new StacklessLogging(logger)) {
        logger.info("EXPECTING: java.lang.IllegalStateException...");
        String response = connector.getResponse(requests);
        offset = checkContains(response, offset, "HTTP/1.1 500");
        offset = checkContains(response, offset, "Connection: close");
        checkNotContained(response, offset, "HTTP/1.1 200");
    }
}
Also used : StacklessLogging(org.eclipse.jetty.util.log.StacklessLogging) Logger(org.eclipse.jetty.util.log.Logger) LocalEndPoint(org.eclipse.jetty.server.LocalConnector.LocalEndPoint) Test(org.junit.Test)

Aggregations

Logger (org.eclipse.jetty.util.log.Logger)3 Test (org.junit.Test)3 CountDownLatch (java.util.concurrent.CountDownLatch)2 LocalEndPoint (org.eclipse.jetty.server.LocalConnector.LocalEndPoint)2 StacklessLogging (org.eclipse.jetty.util.log.StacklessLogging)2 ByteArrayOutputStream (java.io.ByteArrayOutputStream)1 IOException (java.io.IOException)1 PrintWriter (java.io.PrintWriter)1 ByteBuffer (java.nio.ByteBuffer)1 ArrayList (java.util.ArrayList)1 HashMap (java.util.HashMap)1 List (java.util.List)1 Map (java.util.Map)1 Random (java.util.Random)1 LinkedBlockingDeque (java.util.concurrent.LinkedBlockingDeque)1 ServletException (javax.servlet.ServletException)1 HttpServletRequest (javax.servlet.http.HttpServletRequest)1 HttpServletResponse (javax.servlet.http.HttpServletResponse)1 HttpFields (org.eclipse.jetty.http.HttpFields)1 MetaData (org.eclipse.jetty.http.MetaData)1