Search in sources :

Example 1 with MappedByteBufferPool

use of org.eclipse.jetty.io.MappedByteBufferPool in project jetty.project by eclipse.

the class HttpClient method doStart.

@Override
protected void doStart() throws Exception {
    if (sslContextFactory != null)
        addBean(sslContextFactory);
    String name = HttpClient.class.getSimpleName() + "@" + hashCode();
    if (executor == null) {
        QueuedThreadPool threadPool = new QueuedThreadPool();
        threadPool.setName(name);
        executor = threadPool;
    }
    addBean(executor);
    if (byteBufferPool == null)
        byteBufferPool = new MappedByteBufferPool();
    addBean(byteBufferPool);
    if (scheduler == null)
        scheduler = new ScheduledExecutorScheduler(name + "-scheduler", false);
    addBean(scheduler);
    transport.setHttpClient(this);
    addBean(transport);
    if (resolver == null)
        resolver = new SocketAddressResolver.Async(executor, scheduler, getAddressResolutionTimeout());
    addBean(resolver);
    handlers.put(new ContinueProtocolHandler());
    handlers.put(new RedirectProtocolHandler(this));
    handlers.put(new WWWAuthenticationProtocolHandler(this));
    handlers.put(new ProxyAuthenticationProtocolHandler(this));
    decoderFactories.add(new GZIPContentDecoder.Factory(byteBufferPool));
    cookieManager = newCookieManager();
    cookieStore = cookieManager.getCookieStore();
    super.doStart();
}
Also used : MappedByteBufferPool(org.eclipse.jetty.io.MappedByteBufferPool) QueuedThreadPool(org.eclipse.jetty.util.thread.QueuedThreadPool) ScheduledExecutorScheduler(org.eclipse.jetty.util.thread.ScheduledExecutorScheduler)

Example 2 with MappedByteBufferPool

use of org.eclipse.jetty.io.MappedByteBufferPool in project jetty.project by eclipse.

the class HTTP2CServerTest method testHTTP_2_0_DirectWithoutH2C.

@Test
public void testHTTP_2_0_DirectWithoutH2C() throws Exception {
    AtomicLong fills = new AtomicLong();
    // Remove "h2c", leaving only "http/1.1".
    connector.clearConnectionFactories();
    HttpConnectionFactory connectionFactory = new HttpConnectionFactory() {

        @Override
        public Connection newConnection(Connector connector, EndPoint endPoint) {
            HttpConnection connection = new HttpConnection(getHttpConfiguration(), connector, endPoint, getHttpCompliance(), isRecordHttpComplianceViolations()) {

                @Override
                public void onFillable() {
                    fills.incrementAndGet();
                    super.onFillable();
                }
            };
            return configure(connection, connector, endPoint);
        }
    };
    connector.addConnectionFactory(connectionFactory);
    connector.setDefaultProtocol(connectionFactory.getProtocol());
    // Now send a HTTP/2 direct request, which
    // will have the PRI * HTTP/2.0 preface.
    byteBufferPool = new MappedByteBufferPool();
    generator = new Generator(byteBufferPool);
    ByteBufferPool.Lease lease = new ByteBufferPool.Lease(byteBufferPool);
    generator.control(lease, new PrefaceFrame());
    try (Socket client = new Socket("localhost", connector.getLocalPort())) {
        OutputStream output = client.getOutputStream();
        for (ByteBuffer buffer : lease.getByteBuffers()) output.write(BufferUtil.toArray(buffer));
        // We sent a HTTP/2 preface, but the server has no "h2c" connection
        // factory so it does not know how to handle this request.
        InputStream input = client.getInputStream();
        BufferedReader reader = new BufferedReader(new InputStreamReader(input, StandardCharsets.UTF_8));
        String responseLine = reader.readLine();
        Assert.assertThat(responseLine, Matchers.containsString(" 426 "));
        while (true) {
            if (reader.read() < 0)
                break;
        }
    }
    // Make sure we did not spin.
    Thread.sleep(1000);
    Assert.assertThat(fills.get(), Matchers.lessThan(5L));
}
Also used : ByteBufferPool(org.eclipse.jetty.io.ByteBufferPool) MappedByteBufferPool(org.eclipse.jetty.io.MappedByteBufferPool) ServerConnector(org.eclipse.jetty.server.ServerConnector) Connector(org.eclipse.jetty.server.Connector) HttpConnectionFactory(org.eclipse.jetty.server.HttpConnectionFactory) InputStreamReader(java.io.InputStreamReader) HttpConnection(org.eclipse.jetty.server.HttpConnection) InputStream(java.io.InputStream) OutputStream(java.io.OutputStream) EndPoint(org.eclipse.jetty.io.EndPoint) Matchers.containsString(org.hamcrest.Matchers.containsString) ByteBuffer(java.nio.ByteBuffer) MappedByteBufferPool(org.eclipse.jetty.io.MappedByteBufferPool) PrefaceFrame(org.eclipse.jetty.http2.frames.PrefaceFrame) AtomicLong(java.util.concurrent.atomic.AtomicLong) BufferedReader(java.io.BufferedReader) Socket(java.net.Socket) Generator(org.eclipse.jetty.http2.generator.Generator) Test(org.junit.Test)

Example 3 with MappedByteBufferPool

use of org.eclipse.jetty.io.MappedByteBufferPool in project jetty.project by eclipse.

the class HttpClientTransportOverHTTP2Test method testClientStopsServerDoesNotCloseClientCloses.

@Test
public void testClientStopsServerDoesNotCloseClientCloses() throws Exception {
    try (ServerSocket server = new ServerSocket(0)) {
        List<Session> sessions = new ArrayList<>();
        HTTP2Client h2Client = new HTTP2Client();
        HttpClient client = new HttpClient(new HttpClientTransportOverHTTP2(h2Client) {

            @Override
            protected HttpConnectionOverHTTP2 newHttpConnection(HttpDestination destination, Session session) {
                sessions.add(session);
                return super.newHttpConnection(destination, session);
            }
        }, null);
        QueuedThreadPool clientExecutor = new QueuedThreadPool();
        clientExecutor.setName("client");
        client.setExecutor(clientExecutor);
        client.start();
        CountDownLatch resultLatch = new CountDownLatch(1);
        client.newRequest("localhost", server.getLocalPort()).send(result -> {
            if (result.getResponse().getStatus() == HttpStatus.OK_200)
                resultLatch.countDown();
        });
        ByteBufferPool byteBufferPool = new MappedByteBufferPool();
        ByteBufferPool.Lease lease = new ByteBufferPool.Lease(byteBufferPool);
        Generator generator = new Generator(byteBufferPool);
        try (Socket socket = server.accept()) {
            socket.setSoTimeout(1000);
            OutputStream output = socket.getOutputStream();
            InputStream input = socket.getInputStream();
            ServerParser parser = new ServerParser(byteBufferPool, new ServerParser.Listener.Adapter() {

                @Override
                public void onHeaders(HeadersFrame request) {
                    // Server's preface.
                    generator.control(lease, new SettingsFrame(new HashMap<>(), false));
                    // Reply to client's SETTINGS.
                    generator.control(lease, new SettingsFrame(new HashMap<>(), true));
                    // Response.
                    MetaData.Response metaData = new MetaData.Response(HttpVersion.HTTP_2, HttpStatus.OK_200, new HttpFields());
                    HeadersFrame response = new HeadersFrame(request.getStreamId(), metaData, null, true);
                    generator.control(lease, response);
                    try {
                        // Write the frames.
                        for (ByteBuffer buffer : lease.getByteBuffers()) output.write(BufferUtil.toArray(buffer));
                    } catch (Throwable x) {
                        x.printStackTrace();
                    }
                }
            }, 4096, 8192);
            byte[] bytes = new byte[1024];
            while (true) {
                try {
                    int read = input.read(bytes);
                    if (read < 0)
                        Assert.fail();
                    parser.parse(ByteBuffer.wrap(bytes, 0, read));
                } catch (SocketTimeoutException x) {
                    break;
                }
            }
            Assert.assertTrue(resultLatch.await(5, TimeUnit.SECONDS));
            // The client will send a GO_AWAY, but the server will not close.
            client.stop();
            // Give some time to process the stop/close operations.
            Thread.sleep(1000);
            Assert.assertTrue(h2Client.getBeans(Session.class).isEmpty());
            for (Session session : sessions) {
                Assert.assertTrue(session.isClosed());
                Assert.assertTrue(((HTTP2Session) session).isDisconnected());
            }
        }
    }
}
Also used : ByteBufferPool(org.eclipse.jetty.io.ByteBufferPool) MappedByteBufferPool(org.eclipse.jetty.io.MappedByteBufferPool) ServerSessionListener(org.eclipse.jetty.http2.api.server.ServerSessionListener) OutputStream(java.io.OutputStream) ArrayList(java.util.ArrayList) HeadersFrame(org.eclipse.jetty.http2.frames.HeadersFrame) SettingsFrame(org.eclipse.jetty.http2.frames.SettingsFrame) QueuedThreadPool(org.eclipse.jetty.util.thread.QueuedThreadPool) MetaData(org.eclipse.jetty.http.MetaData) HttpFields(org.eclipse.jetty.http.HttpFields) ServerParser(org.eclipse.jetty.http2.parser.ServerParser) InputStream(java.io.InputStream) ServerSocket(java.net.ServerSocket) CountDownLatch(java.util.concurrent.CountDownLatch) ByteBuffer(java.nio.ByteBuffer) MappedByteBufferPool(org.eclipse.jetty.io.MappedByteBufferPool) ContentResponse(org.eclipse.jetty.client.api.ContentResponse) HttpServletResponse(javax.servlet.http.HttpServletResponse) SocketTimeoutException(java.net.SocketTimeoutException) HttpClient(org.eclipse.jetty.client.HttpClient) HTTP2Client(org.eclipse.jetty.http2.client.HTTP2Client) HttpDestination(org.eclipse.jetty.client.HttpDestination) ServerSocket(java.net.ServerSocket) Socket(java.net.Socket) HTTP2Session(org.eclipse.jetty.http2.HTTP2Session) Session(org.eclipse.jetty.http2.api.Session) Generator(org.eclipse.jetty.http2.generator.Generator) Test(org.junit.Test)

Example 4 with MappedByteBufferPool

use of org.eclipse.jetty.io.MappedByteBufferPool in project jetty.project by eclipse.

the class AbstractServerTest method prepareServer.

private void prepareServer(ConnectionFactory connectionFactory) {
    QueuedThreadPool serverExecutor = new QueuedThreadPool();
    serverExecutor.setName("server");
    server = new Server(serverExecutor);
    connector = new ServerConnector(server, connectionFactory);
    server.addConnector(connector);
    path = "/test";
    byteBufferPool = new MappedByteBufferPool();
    generator = new Generator(byteBufferPool);
}
Also used : ServerConnector(org.eclipse.jetty.server.ServerConnector) MappedByteBufferPool(org.eclipse.jetty.io.MappedByteBufferPool) Server(org.eclipse.jetty.server.Server) QueuedThreadPool(org.eclipse.jetty.util.thread.QueuedThreadPool) Generator(org.eclipse.jetty.http2.generator.Generator)

Example 5 with MappedByteBufferPool

use of org.eclipse.jetty.io.MappedByteBufferPool in project jetty.project by eclipse.

the class ConnectHandler method doStart.

@Override
protected void doStart() throws Exception {
    if (executor == null)
        executor = getServer().getThreadPool();
    if (scheduler == null)
        addBean(scheduler = new ScheduledExecutorScheduler());
    if (bufferPool == null)
        addBean(bufferPool = new MappedByteBufferPool());
    addBean(selector = newSelectorManager());
    selector.setConnectTimeout(getConnectTimeout());
    super.doStart();
}
Also used : MappedByteBufferPool(org.eclipse.jetty.io.MappedByteBufferPool) ScheduledExecutorScheduler(org.eclipse.jetty.util.thread.ScheduledExecutorScheduler)

Aggregations

MappedByteBufferPool (org.eclipse.jetty.io.MappedByteBufferPool)18 ByteBufferPool (org.eclipse.jetty.io.ByteBufferPool)13 ByteBuffer (java.nio.ByteBuffer)12 Test (org.junit.Test)12 HttpFields (org.eclipse.jetty.http.HttpFields)10 AtomicInteger (java.util.concurrent.atomic.AtomicInteger)6 Generator (org.eclipse.jetty.http2.generator.Generator)6 MetaData (org.eclipse.jetty.http.MetaData)5 QueuedThreadPool (org.eclipse.jetty.util.thread.QueuedThreadPool)5 OutputStream (java.io.OutputStream)4 Socket (java.net.Socket)4 CountDownLatch (java.util.concurrent.CountDownLatch)4 FCGI (org.eclipse.jetty.fcgi.FCGI)4 Generator (org.eclipse.jetty.fcgi.generator.Generator)4 ServerGenerator (org.eclipse.jetty.fcgi.generator.ServerGenerator)4 HeadersFrame (org.eclipse.jetty.http2.frames.HeadersFrame)4 PrefaceFrame (org.eclipse.jetty.http2.frames.PrefaceFrame)4 SettingsFrame (org.eclipse.jetty.http2.frames.SettingsFrame)4 EndPoint (org.eclipse.jetty.io.EndPoint)4 ScheduledExecutorScheduler (org.eclipse.jetty.util.thread.ScheduledExecutorScheduler)4