Search in sources :

Example 11 with StreamSourceChannel

use of org.xnio.channels.StreamSourceChannel in project undertow by undertow-io.

the class HttpReadListener method handleHttp2PriorKnowledge.

private void handleHttp2PriorKnowledge(final StreamConnection connection, final HttpServerConnection serverConnection, PooledByteBuffer readData) throws IOException {
    final ConduitStreamSourceChannel request = connection.getSourceChannel();
    byte[] data = new byte[PRI_EXPECTED.length];
    final ByteBuffer buffer = ByteBuffer.wrap(data);
    if (readData.getBuffer().hasRemaining()) {
        while (readData.getBuffer().hasRemaining() && buffer.hasRemaining()) {
            buffer.put(readData.getBuffer().get());
        }
    }
    final PooledByteBuffer extraData;
    if (readData.getBuffer().hasRemaining()) {
        extraData = readData;
    } else {
        readData.close();
        extraData = null;
    }
    if (!doHttp2PriRead(connection, buffer, serverConnection, extraData)) {
        request.getReadSetter().set(new ChannelListener<StreamSourceChannel>() {

            @Override
            public void handleEvent(StreamSourceChannel channel) {
                try {
                    doHttp2PriRead(connection, buffer, serverConnection, extraData);
                } catch (IOException e) {
                    UndertowLogger.REQUEST_IO_LOGGER.ioException(e);
                    IoUtils.safeClose(connection);
                }
            }
        });
        request.resumeReads();
    }
}
Also used : StreamSourceChannel(org.xnio.channels.StreamSourceChannel) ConduitStreamSourceChannel(org.xnio.conduits.ConduitStreamSourceChannel) PooledByteBuffer(io.undertow.connector.PooledByteBuffer) IOException(java.io.IOException) ConduitStreamSourceChannel(org.xnio.conduits.ConduitStreamSourceChannel) ByteBuffer(java.nio.ByteBuffer) PooledByteBuffer(io.undertow.connector.PooledByteBuffer)

Example 12 with StreamSourceChannel

use of org.xnio.channels.StreamSourceChannel in project undertow by undertow-io.

the class ALPNClientSelector method runAlpn.

public static void runAlpn(final SslConnection sslConnection, final ChannelListener<SslConnection> fallback, final ClientCallback<ClientConnection> failedListener, final ALPNProtocol... details) {
    SslConduit conduit = UndertowXnioSsl.getSslConduit(sslConnection);
    final ALPNProvider provider = ALPNManager.INSTANCE.getProvider(conduit.getSSLEngine());
    if (provider == null) {
        fallback.handleEvent(sslConnection);
        return;
    }
    String[] protocols = new String[details.length];
    final Map<String, ALPNProtocol> protocolMap = new HashMap<>();
    for (int i = 0; i < protocols.length; ++i) {
        protocols[i] = details[i].getProtocol();
        protocolMap.put(details[i].getProtocol(), details[i]);
    }
    final SSLEngine sslEngine = provider.setProtocols(conduit.getSSLEngine(), protocols);
    conduit.setSslEngine(sslEngine);
    final AtomicReference<Boolean> handshakeDone = new AtomicReference<>(false);
    try {
        sslConnection.startHandshake();
        sslConnection.getHandshakeSetter().set(new ChannelListener<SslConnection>() {

            @Override
            public void handleEvent(SslConnection channel) {
                if (handshakeDone.get()) {
                    return;
                }
                handshakeDone.set(true);
            }
        });
        sslConnection.getSourceChannel().getReadSetter().set(new ChannelListener<StreamSourceChannel>() {

            @Override
            public void handleEvent(StreamSourceChannel channel) {
                String selectedProtocol = provider.getSelectedProtocol(sslEngine);
                if (selectedProtocol != null) {
                    handleSelected(selectedProtocol);
                } else {
                    ByteBuffer buf = ByteBuffer.allocate(100);
                    try {
                        int read = channel.read(buf);
                        if (read > 0) {
                            buf.flip();
                            PushBackStreamSourceConduit pb = new PushBackStreamSourceConduit(sslConnection.getSourceChannel().getConduit());
                            pb.pushBack(new ImmediatePooled<>(buf));
                            sslConnection.getSourceChannel().setConduit(pb);
                        } else if (read == -1) {
                            failedListener.failed(new ClosedChannelException());
                        }
                        selectedProtocol = provider.getSelectedProtocol(sslEngine);
                        if (selectedProtocol != null) {
                            handleSelected(selectedProtocol);
                        } else if (read > 0 || handshakeDone.get()) {
                            sslConnection.getSourceChannel().suspendReads();
                            fallback.handleEvent(sslConnection);
                            return;
                        }
                    } catch (IOException e) {
                        failedListener.failed(e);
                    }
                }
            }

            private void handleSelected(String selected) {
                if (selected.isEmpty()) {
                    sslConnection.getSourceChannel().suspendReads();
                    fallback.handleEvent(sslConnection);
                    return;
                } else {
                    ALPNClientSelector.ALPNProtocol details = protocolMap.get(selected);
                    if (details == null) {
                        //should never happen
                        sslConnection.getSourceChannel().suspendReads();
                        fallback.handleEvent(sslConnection);
                        return;
                    } else {
                        sslConnection.getSourceChannel().suspendReads();
                        details.getSelected().handleEvent(sslConnection);
                    }
                }
            }
        });
        sslConnection.getSourceChannel().resumeReads();
    } catch (IOException e) {
        failedListener.failed(e);
    } catch (Throwable e) {
        failedListener.failed(new IOException(e));
    }
}
Also used : StreamSourceChannel(org.xnio.channels.StreamSourceChannel) ClosedChannelException(java.nio.channels.ClosedChannelException) HashMap(java.util.HashMap) SSLEngine(javax.net.ssl.SSLEngine) SslConduit(io.undertow.protocols.ssl.SslConduit) PushBackStreamSourceConduit(org.xnio.conduits.PushBackStreamSourceConduit) AtomicReference(java.util.concurrent.atomic.AtomicReference) IOException(java.io.IOException) ByteBuffer(java.nio.ByteBuffer) SslConnection(org.xnio.ssl.SslConnection) ALPNProvider(io.undertow.protocols.alpn.ALPNProvider) ImmediatePooled(io.undertow.util.ImmediatePooled)

Example 13 with StreamSourceChannel

use of org.xnio.channels.StreamSourceChannel in project undertow by undertow-io.

the class ReadTimeoutTestCase method testReadTimeout.

@Test
public void testReadTimeout() throws IOException, InterruptedException {
    DefaultServer.setRootHandler(new HttpHandler() {

        @Override
        public void handleRequest(final HttpServerExchange exchange) throws Exception {
            final StreamSinkChannel response = exchange.getResponseChannel();
            final StreamSourceChannel request = exchange.getRequestChannel();
            try {
                request.setOption(Options.READ_TIMEOUT, 100);
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
            request.getReadSetter().set(ChannelListeners.drainListener(Long.MAX_VALUE, new ChannelListener<Channel>() {

                @Override
                public void handleEvent(final Channel channel) {
                    new StringWriteChannelListener("COMPLETED") {

                        @Override
                        protected void writeDone(final StreamSinkChannel channel) {
                            exchange.endExchange();
                        }
                    }.setup(response);
                }
            }, new ChannelExceptionHandler<StreamSourceChannel>() {

                @Override
                public void handleException(final StreamSourceChannel channel, final IOException e) {
                    exchange.endExchange();
                    exception = e;
                    errorLatch.countDown();
                }
            }));
            request.wakeupReads();
        }
    });
    final TestHttpClient client = new TestHttpClient();
    try {
        HttpPost post = new HttpPost(DefaultServer.getDefaultServerURL());
        post.setEntity(new AbstractHttpEntity() {

            @Override
            public InputStream getContent() throws IOException, IllegalStateException {
                return null;
            }

            @Override
            public void writeTo(final OutputStream outstream) throws IOException {
                for (int i = 0; i < 5; ++i) {
                    outstream.write('*');
                    outstream.flush();
                    try {
                        Thread.sleep(200);
                    } catch (InterruptedException e) {
                        throw new RuntimeException(e);
                    }
                }
            }

            @Override
            public boolean isStreaming() {
                return true;
            }

            @Override
            public boolean isRepeatable() {
                return false;
            }

            @Override
            public long getContentLength() {
                return 5;
            }
        });
        post.addHeader(Headers.CONNECTION_STRING, "close");
        try {
            client.execute(post);
        } catch (IOException e) {
        }
        if (errorLatch.await(5, TimeUnit.SECONDS)) {
            Assert.assertEquals(ReadTimeoutException.class, exception.getClass());
        } else {
            Assert.fail("Read did not time out");
        }
    } finally {
        client.getConnectionManager().shutdown();
    }
}
Also used : StreamSourceChannel(org.xnio.channels.StreamSourceChannel) HttpPost(org.apache.http.client.methods.HttpPost) InputStream(java.io.InputStream) StreamSourceChannel(org.xnio.channels.StreamSourceChannel) StreamSinkChannel(org.xnio.channels.StreamSinkChannel) Channel(java.nio.channels.Channel) OutputStream(java.io.OutputStream) StreamSinkChannel(org.xnio.channels.StreamSinkChannel) IOException(java.io.IOException) IOException(java.io.IOException) ReadTimeoutException(org.xnio.channels.ReadTimeoutException) TestHttpClient(io.undertow.testutils.TestHttpClient) StringWriteChannelListener(io.undertow.util.StringWriteChannelListener) AbstractHttpEntity(org.apache.http.entity.AbstractHttpEntity) Test(org.junit.Test)

Aggregations

StreamSourceChannel (org.xnio.channels.StreamSourceChannel)13 IOException (java.io.IOException)9 ByteBuffer (java.nio.ByteBuffer)9 PooledByteBuffer (io.undertow.connector.PooledByteBuffer)8 HttpHandler (io.undertow.server.HttpHandler)4 HttpServerExchange (io.undertow.server.HttpServerExchange)4 Test (org.junit.Test)4 ChannelListener (org.xnio.ChannelListener)4 ByteArrayOutputStream (java.io.ByteArrayOutputStream)3 EmptyStreamSourceChannel (org.xnio.channels.EmptyStreamSourceChannel)3 ALPNProvider (io.undertow.protocols.alpn.ALPNProvider)1 SslConduit (io.undertow.protocols.ssl.SslConduit)1 TestHttpClient (io.undertow.testutils.TestHttpClient)1 ImmediatePooled (io.undertow.util.ImmediatePooled)1 StringWriteChannelListener (io.undertow.util.StringWriteChannelListener)1 InputStream (java.io.InputStream)1 OutputStream (java.io.OutputStream)1 CharBuffer (java.nio.CharBuffer)1 Channel (java.nio.channels.Channel)1 ClosedChannelException (java.nio.channels.ClosedChannelException)1