Search in sources :

Example 86 with Connection

use of reactor.netty.Connection in project reactor-netty by reactor.

the class ConnectionInfoTests method proxyProtocolOn.

@Test
void proxyProtocolOn() throws InterruptedException {
    String remoteAddress = "202.112.144.236";
    ArrayBlockingQueue<String> resultQueue = new ArrayBlockingQueue<>(1);
    Consumer<HttpServerRequest> requestConsumer = serverRequest -> {
        String remoteAddrFromRequest = serverRequest.remoteAddress().getHostString();
        resultQueue.add(remoteAddrFromRequest);
    };
    this.disposableServer = createServer().proxyProtocol(ProxyProtocolSupportType.ON).handle((req, res) -> {
        try {
            requestConsumer.accept(req);
            return res.status(200).sendString(Mono.just("OK"));
        } catch (Throwable e) {
            return res.status(500).sendString(Mono.just(e.getMessage()));
        }
    }).bindNow();
    Connection clientConn = TcpClient.create().port(this.disposableServer.port()).connectNow();
    ByteBuf proxyProtocolMsg = clientConn.channel().alloc().buffer();
    proxyProtocolMsg.writeCharSequence("PROXY TCP4 " + remoteAddress + " 10.210.12.10 5678 80\r\n", Charset.defaultCharset());
    proxyProtocolMsg.writeCharSequence("GET /test HTTP/1.1\r\nHost: a.example.com\r\n\r\n", Charset.defaultCharset());
    clientConn.channel().writeAndFlush(proxyProtocolMsg).addListener(f -> {
        if (!f.isSuccess()) {
            fail("Writing proxyProtocolMsg was not successful");
        }
    });
    assertThat(resultQueue.poll(5, TimeUnit.SECONDS)).isEqualTo(remoteAddress);
    // send a http request again to confirm that removeAddress is not changed.
    ByteBuf httpMsg = clientConn.channel().alloc().buffer();
    httpMsg.writeCharSequence("GET /test HTTP/1.1\r\nHost: a.example.com\r\n\r\n", Charset.defaultCharset());
    clientConn.channel().writeAndFlush(httpMsg).addListener(f -> {
        if (!f.isSuccess()) {
            fail("Writing proxyProtocolMsg was not successful");
        }
    });
    assertThat(resultQueue.poll(5, TimeUnit.SECONDS)).isEqualTo(remoteAddress);
}
Also used : HttpHeaders(io.netty.handler.codec.http.HttpHeaders) StepVerifier(reactor.test.StepVerifier) BiFunction(java.util.function.BiFunction) Assertions.assertThat(org.assertj.core.api.Assertions.assertThat) BaseHttpTest(reactor.netty.BaseHttpTest) Function(java.util.function.Function) Nullable(reactor.util.annotation.Nullable) TcpClient(reactor.netty.tcp.TcpClient) InsecureTrustManagerFactory(io.netty.handler.ssl.util.InsecureTrustManagerFactory) Charset(java.nio.charset.Charset) ByteBuf(io.netty.buffer.ByteBuf) BeforeAll(org.junit.jupiter.api.BeforeAll) NettyPipeline(reactor.netty.NettyPipeline) Duration(java.time.Duration) Assertions(org.assertj.core.api.Assertions) Connection(reactor.netty.Connection) HttpRequest(io.netty.handler.codec.http.HttpRequest) SslContext(io.netty.handler.ssl.SslContext) SelfSignedCertificate(io.netty.handler.ssl.util.SelfSignedCertificate) AddressUtils(reactor.netty.transport.AddressUtils) Mono(reactor.core.publisher.Mono) CertificateException(java.security.cert.CertificateException) InetSocketAddress(java.net.InetSocketAddress) TimeUnit(java.util.concurrent.TimeUnit) Consumer(java.util.function.Consumer) Test(org.junit.jupiter.api.Test) ArrayBlockingQueue(java.util.concurrent.ArrayBlockingQueue) SSLException(javax.net.ssl.SSLException) Assertions.fail(org.assertj.core.api.Assertions.fail) SslHandler(io.netty.handler.ssl.SslHandler) SslContextBuilder(io.netty.handler.ssl.SslContextBuilder) HttpClient(reactor.netty.http.client.HttpClient) ArrayBlockingQueue(java.util.concurrent.ArrayBlockingQueue) Connection(reactor.netty.Connection) ByteBuf(io.netty.buffer.ByteBuf) BaseHttpTest(reactor.netty.BaseHttpTest) Test(org.junit.jupiter.api.Test)

Example 87 with Connection

use of reactor.netty.Connection in project reactor-netty by reactor.

the class ConnectionInfoTests method proxyProtocolAuto.

@Test
void proxyProtocolAuto() throws InterruptedException {
    String remoteAddress = "202.112.144.236";
    ArrayBlockingQueue<String> resultQueue = new ArrayBlockingQueue<>(1);
    Consumer<HttpServerRequest> requestConsumer = serverRequest -> {
        String remoteAddrFromRequest = serverRequest.remoteAddress().getHostString();
        resultQueue.add(remoteAddrFromRequest);
    };
    this.disposableServer = createServer().proxyProtocol(ProxyProtocolSupportType.AUTO).handle((req, res) -> {
        try {
            requestConsumer.accept(req);
            return res.status(200).sendString(Mono.just("OK"));
        } catch (Throwable e) {
            return res.status(500).sendString(Mono.just(e.getMessage()));
        }
    }).bindNow();
    Connection clientConn = TcpClient.create().port(this.disposableServer.port()).connectNow();
    ByteBuf proxyProtocolMsg = clientConn.channel().alloc().buffer();
    proxyProtocolMsg.writeCharSequence("PROXY TCP4 " + remoteAddress + " 10.210.12.10 5678 80\r\n", Charset.defaultCharset());
    proxyProtocolMsg.writeCharSequence("GET /test HTTP/1.1\r\nHost: a.example.com\r\n\r\n", Charset.defaultCharset());
    clientConn.channel().writeAndFlush(proxyProtocolMsg).addListener(f -> {
        if (!f.isSuccess()) {
            fail("Writing proxyProtocolMsg was not successful");
        }
    });
    assertThat(resultQueue.poll(5, TimeUnit.SECONDS)).isEqualTo(remoteAddress);
    clientConn.disposeNow();
    clientConn = TcpClient.create().port(this.disposableServer.port()).connectNow();
    // Send a http request without proxy protocol in a new connection,
    // server should support this when proxyProtocol is set to ProxyProtocolSupportType.AUTO
    ByteBuf httpMsg = clientConn.channel().alloc().buffer();
    httpMsg.writeCharSequence("GET /test HTTP/1.1\r\nHost: a.example.com\r\n\r\n", Charset.defaultCharset());
    clientConn.channel().writeAndFlush(httpMsg).addListener(f -> {
        if (!f.isSuccess()) {
            fail("Writing proxyProtocolMsg was not successful");
        }
    });
    assertThat(resultQueue.poll(5, TimeUnit.SECONDS)).containsPattern("^0:0:0:0:0:0:0:1(%\\w*)?|127.0.0.1$");
}
Also used : HttpHeaders(io.netty.handler.codec.http.HttpHeaders) StepVerifier(reactor.test.StepVerifier) BiFunction(java.util.function.BiFunction) Assertions.assertThat(org.assertj.core.api.Assertions.assertThat) BaseHttpTest(reactor.netty.BaseHttpTest) Function(java.util.function.Function) Nullable(reactor.util.annotation.Nullable) TcpClient(reactor.netty.tcp.TcpClient) InsecureTrustManagerFactory(io.netty.handler.ssl.util.InsecureTrustManagerFactory) Charset(java.nio.charset.Charset) ByteBuf(io.netty.buffer.ByteBuf) BeforeAll(org.junit.jupiter.api.BeforeAll) NettyPipeline(reactor.netty.NettyPipeline) Duration(java.time.Duration) Assertions(org.assertj.core.api.Assertions) Connection(reactor.netty.Connection) HttpRequest(io.netty.handler.codec.http.HttpRequest) SslContext(io.netty.handler.ssl.SslContext) SelfSignedCertificate(io.netty.handler.ssl.util.SelfSignedCertificate) AddressUtils(reactor.netty.transport.AddressUtils) Mono(reactor.core.publisher.Mono) CertificateException(java.security.cert.CertificateException) InetSocketAddress(java.net.InetSocketAddress) TimeUnit(java.util.concurrent.TimeUnit) Consumer(java.util.function.Consumer) Test(org.junit.jupiter.api.Test) ArrayBlockingQueue(java.util.concurrent.ArrayBlockingQueue) SSLException(javax.net.ssl.SSLException) Assertions.fail(org.assertj.core.api.Assertions.fail) SslHandler(io.netty.handler.ssl.SslHandler) SslContextBuilder(io.netty.handler.ssl.SslContextBuilder) HttpClient(reactor.netty.http.client.HttpClient) ArrayBlockingQueue(java.util.concurrent.ArrayBlockingQueue) Connection(reactor.netty.Connection) ByteBuf(io.netty.buffer.ByteBuf) BaseHttpTest(reactor.netty.BaseHttpTest) Test(org.junit.jupiter.api.Test)

Example 88 with Connection

use of reactor.netty.Connection in project reactor-netty by reactor.

the class DefaultPooledConnectionProviderTest method testIssue951_MaxPendingAcquire.

@Test
void testIssue951_MaxPendingAcquire() throws InterruptedException {
    DisposableServer server = TcpServer.create().port(0).handle((in, out) -> out.sendString(Mono.just("test").delayElement(Duration.ofMillis(100)))).wiretap(true).bindNow();
    DefaultPooledConnectionProvider provider = (DefaultPooledConnectionProvider) ConnectionProvider.builder("testIssue951_MaxPendingAcquire").maxConnections(1).pendingAcquireTimeout(Duration.ofMillis(30)).pendingAcquireMaxCount(1).build();
    CountDownLatch latch = new CountDownLatch(2);
    try {
        AtomicReference<InstrumentedPool<PooledConnection>> pool = new AtomicReference<>();
        List<? extends Signal<? extends Connection>> list = Flux.range(0, 3).flatMapDelayError(i -> TcpClient.create(provider).port(server.port()).doOnConnected(conn -> {
            ConcurrentMap<PooledConnectionProvider.PoolKey, InstrumentedPool<PooledConnection>> pools = provider.channelPools;
            pool.set(pools.get(pools.keySet().toArray()[0]));
        }).doOnDisconnected(conn -> latch.countDown()).handle((in, out) -> in.receive().then()).wiretap(true).connect().materialize(), 256, 32).collectList().doFinally(fin -> latch.countDown()).block(Duration.ofSeconds(30));
        assertThat(latch.await(30, TimeUnit.SECONDS)).as("latch 30s").isTrue();
        assertThat(list).isNotNull().hasSize(3);
        int onNext = 0;
        int onErrorTimeout = 0;
        int onErrorPendingAcquire = 0;
        String msg1 = "Pool#acquire(Duration) has been pending for more than the configured timeout of 30ms";
        String msg2 = "Pending acquire queue has reached its maximum size of 1";
        for (int i = 0; i < 3; i++) {
            Signal<? extends Connection> signal = list.get(i);
            if (signal.isOnNext()) {
                onNext++;
            } else if (signal.getThrowable() instanceof TimeoutException && msg1.equals(signal.getThrowable().getMessage())) {
                onErrorTimeout++;
            } else if (signal.getThrowable() instanceof PoolAcquirePendingLimitException && msg2.equals(signal.getThrowable().getMessage())) {
                onErrorPendingAcquire++;
            }
        }
        assertThat(onNext).isEqualTo(1);
        assertThat(onErrorTimeout).isEqualTo(1);
        assertThat(onErrorPendingAcquire).isEqualTo(1);
        assertThat(pool.get().metrics().acquiredSize()).as("currently acquired").isEqualTo(0);
        assertThat(pool.get().metrics().idleSize()).as("currently idle").isEqualTo(0);
    } finally {
        server.disposeNow();
        provider.dispose();
    }
}
Also used : BeforeEach(org.junit.jupiter.api.BeforeEach) Arrays(java.util.Arrays) StepVerifier(reactor.test.StepVerifier) SocketAddress(java.net.SocketAddress) Assertions.assertThat(org.assertj.core.api.Assertions.assertThat) InstrumentedPool(reactor.pool.InstrumentedPool) TimeoutException(java.util.concurrent.TimeoutException) TcpClient(reactor.netty.tcp.TcpClient) ConnectionObserver(reactor.netty.ConnectionObserver) Future(java.util.concurrent.Future) PoolAcquirePendingLimitException(reactor.pool.PoolAcquirePendingLimitException) AtomicInteger(java.util.concurrent.atomic.AtomicInteger) Duration(java.time.Duration) Map(java.util.Map) NameResolverProvider(reactor.netty.transport.NameResolverProvider) PooledRef(reactor.pool.PooledRef) AddressResolver(io.netty.resolver.AddressResolver) Awaitility.await(org.awaitility.Awaitility.await) AddressUtils(reactor.netty.transport.AddressUtils) Signal(reactor.core.publisher.Signal) InetSocketAddress(java.net.InetSocketAddress) Executors(java.util.concurrent.Executors) NioEventLoopGroup(io.netty.channel.nio.NioEventLoopGroup) SchedulerClock(reactor.scheduler.clock.SchedulerClock) LockSupport(java.util.concurrent.locks.LockSupport) Test(org.junit.jupiter.api.Test) CountDownLatch(java.util.concurrent.CountDownLatch) List(java.util.List) AddressResolverGroup(io.netty.resolver.AddressResolverGroup) DisposableServer(reactor.netty.DisposableServer) TcpClientTests(reactor.netty.tcp.TcpClientTests) ChannelOption(io.netty.channel.ChannelOption) LoggingHandler(io.netty.handler.logging.LoggingHandler) SocketUtils(reactor.netty.SocketUtils) AtomicReference(java.util.concurrent.atomic.AtomicReference) Supplier(java.util.function.Supplier) ConcurrentMap(java.util.concurrent.ConcurrentMap) PooledConnection(reactor.netty.resources.DefaultPooledConnectionProvider.PooledConnection) ScheduledExecutorService(java.util.concurrent.ScheduledExecutorService) TcpResources(reactor.netty.tcp.TcpResources) ConnectException(java.net.ConnectException) Connection(reactor.netty.Connection) ClientTransportConfig(reactor.netty.transport.ClientTransportConfig) EventLoopGroup(io.netty.channel.EventLoopGroup) VirtualTimeScheduler(reactor.test.scheduler.VirtualTimeScheduler) NetUtil(io.netty.util.NetUtil) Mono(reactor.core.publisher.Mono) TimeUnit(java.util.concurrent.TimeUnit) Mockito(org.mockito.Mockito) Flux(reactor.core.publisher.Flux) ChannelMetricsRecorder(reactor.netty.channel.ChannelMetricsRecorder) TcpServer(reactor.netty.tcp.TcpServer) DefaultAddressResolverGroup(io.netty.resolver.DefaultAddressResolverGroup) Collections(java.util.Collections) ConcurrentMap(java.util.concurrent.ConcurrentMap) AtomicReference(java.util.concurrent.atomic.AtomicReference) CountDownLatch(java.util.concurrent.CountDownLatch) PooledConnection(reactor.netty.resources.DefaultPooledConnectionProvider.PooledConnection) DisposableServer(reactor.netty.DisposableServer) InstrumentedPool(reactor.pool.InstrumentedPool) PoolAcquirePendingLimitException(reactor.pool.PoolAcquirePendingLimitException) TimeoutException(java.util.concurrent.TimeoutException) Test(org.junit.jupiter.api.Test)

Example 89 with Connection

use of reactor.netty.Connection in project reactor-netty by reactor.

the class DefaultPooledConnectionProviderTest method doTestIssue1790.

private void doTestIssue1790(boolean fifoPool) {
    DefaultPooledConnectionProvider provider;
    if (fifoPool) {
        provider = (DefaultPooledConnectionProvider) ConnectionProvider.builder("testIssue1790").maxConnections(1).fifo().build();
    } else {
        provider = (DefaultPooledConnectionProvider) ConnectionProvider.builder("testIssue1790").maxConnections(1).lifo().build();
    }
    DisposableServer disposableServer = TcpServer.create().port(0).wiretap(true).bindNow();
    Connection connection = null;
    try {
        connection = TcpClient.create(provider).port(disposableServer.port()).wiretap(true).connectNow();
        assertThat(provider.channelPools).hasSize(1);
        @SuppressWarnings({ "unchecked", "rawtypes" }) InstrumentedPool<DefaultPooledConnectionProvider.PooledConnection> channelPool = provider.channelPools.values().toArray(new InstrumentedPool[0])[0];
        assertThat(channelPool.metrics()).withFailMessage("Reactor-netty relies on Reactor-pool instrumented pool.metrics()" + " to be the pool instance itself, got <%s> and <%s>", channelPool.metrics(), channelPool).isSameAs(channelPool);
    } finally {
        if (connection != null) {
            connection.disposeNow();
        }
        disposableServer.disposeNow();
        provider.disposeLater().block(Duration.ofSeconds(5));
    }
}
Also used : PooledConnection(reactor.netty.resources.DefaultPooledConnectionProvider.PooledConnection) DisposableServer(reactor.netty.DisposableServer) PooledConnection(reactor.netty.resources.DefaultPooledConnectionProvider.PooledConnection) Connection(reactor.netty.Connection) InstrumentedPool(reactor.pool.InstrumentedPool)

Example 90 with Connection

use of reactor.netty.Connection in project reactor-netty by reactor.

the class TcpClientTests method testRetryOnDifferentAddress.

@Test
void testRetryOnDifferentAddress() throws Exception {
    DisposableServer server = TcpServer.create().port(0).wiretap(true).handle((req, res) -> res.sendString(Mono.just("test"))).bindNow();
    final CountDownLatch latch = new CountDownLatch(1);
    Supplier<SocketAddress> addressSupplier = new Supplier<SocketAddress>() {

        int i = 2;

        @Override
        public SocketAddress get() {
            return new InetSocketAddress("localhost", server.port() + i--);
        }
    };
    Connection conn = TcpClient.create().remoteAddress(addressSupplier).doOnConnected(connection -> latch.countDown()).option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 100).handle((in, out) -> Mono.never()).wiretap(true).connect().retry().block(Duration.ofSeconds(30));
    assertThat(conn).isNotNull();
    assertThat(latch.await(30, TimeUnit.SECONDS)).as("latch await").isTrue();
    conn.disposeNow();
    server.disposeNow();
}
Also used : AttributeKey(io.netty.util.AttributeKey) BeforeEach(org.junit.jupiter.api.BeforeEach) Arrays(java.util.Arrays) StepVerifier(reactor.test.StepVerifier) SocketAddress(java.net.SocketAddress) AbortedException(reactor.netty.channel.AbortedException) Retry(reactor.util.retry.Retry) ChannelInboundHandlerAdapter(io.netty.channel.ChannelInboundHandlerAdapter) Assertions.assertThat(org.assertj.core.api.Assertions.assertThat) ByteBuffer(java.nio.ByteBuffer) Unpooled(io.netty.buffer.Unpooled) Future(java.util.concurrent.Future) Loggers(reactor.util.Loggers) SocketChannel(java.nio.channels.SocketChannel) AtomicInteger(java.util.concurrent.atomic.AtomicInteger) DomainSocketAddress(io.netty.channel.unix.DomainSocketAddress) Duration(java.time.Duration) Logger(reactor.util.Logger) NameResolverProvider(reactor.netty.transport.NameResolverProvider) LoopResources(reactor.netty.resources.LoopResources) ChannelOperations(reactor.netty.channel.ChannelOperations) Set(java.util.Set) InetSocketAddress(java.net.InetSocketAddress) Executors(java.util.concurrent.Executors) NioEventLoopGroup(io.netty.channel.nio.NioEventLoopGroup) Test(org.junit.jupiter.api.Test) CountDownLatch(java.util.concurrent.CountDownLatch) List(java.util.List) AddressResolverGroup(io.netty.resolver.AddressResolverGroup) LineBasedFrameDecoder(io.netty.handler.codec.LineBasedFrameDecoder) NettyOutbound(reactor.netty.NettyOutbound) DisposableServer(reactor.netty.DisposableServer) ChannelOption(io.netty.channel.ChannelOption) SocketUtils(reactor.netty.SocketUtils) AtomicReference(java.util.concurrent.atomic.AtomicReference) Supplier(java.util.function.Supplier) ArrayList(java.util.ArrayList) ChannelHandlerContext(io.netty.channel.ChannelHandlerContext) Charset(java.nio.charset.Charset) ByteBuf(io.netty.buffer.ByteBuf) Assertions.assertThatExceptionOfType(org.assertj.core.api.Assertions.assertThatExceptionOfType) Schedulers(reactor.core.scheduler.Schedulers) WeakReference(java.lang.ref.WeakReference) Connection(reactor.netty.Connection) ExecutorService(java.util.concurrent.ExecutorService) Properties(java.util.Properties) Assumptions.assumeThat(org.assertj.core.api.Assumptions.assumeThat) Publisher(org.reactivestreams.Publisher) NetUtil(io.netty.util.NetUtil) IOException(java.io.IOException) Mono(reactor.core.publisher.Mono) ServerSocketChannel(java.nio.channels.ServerSocketChannel) TimeUnit(java.util.concurrent.TimeUnit) Consumer(java.util.function.Consumer) AtomicLong(java.util.concurrent.atomic.AtomicLong) Bootstrap(io.netty.bootstrap.Bootstrap) Flux(reactor.core.publisher.Flux) AfterEach(org.junit.jupiter.api.AfterEach) ConcurrentSkipListSet(java.util.concurrent.ConcurrentSkipListSet) DefaultAddressResolverGroup(io.netty.resolver.DefaultAddressResolverGroup) ConnectionProvider(reactor.netty.resources.ConnectionProvider) DisposableServer(reactor.netty.DisposableServer) InetSocketAddress(java.net.InetSocketAddress) Connection(reactor.netty.Connection) Supplier(java.util.function.Supplier) CountDownLatch(java.util.concurrent.CountDownLatch) SocketAddress(java.net.SocketAddress) DomainSocketAddress(io.netty.channel.unix.DomainSocketAddress) InetSocketAddress(java.net.InetSocketAddress) Test(org.junit.jupiter.api.Test)

Aggregations

Connection (reactor.netty.Connection)137 Test (org.junit.jupiter.api.Test)69 CountDownLatch (java.util.concurrent.CountDownLatch)52 Duration (java.time.Duration)49 Mono (reactor.core.publisher.Mono)47 InetSocketAddress (java.net.InetSocketAddress)41 TimeUnit (java.util.concurrent.TimeUnit)39 Assertions.assertThat (org.assertj.core.api.Assertions.assertThat)38 LoopResources (reactor.netty.resources.LoopResources)38 ByteBuf (io.netty.buffer.ByteBuf)35 Flux (reactor.core.publisher.Flux)35 DisposableServer (reactor.netty.DisposableServer)35 DomainSocketAddress (io.netty.channel.unix.DomainSocketAddress)33 AtomicReference (java.util.concurrent.atomic.AtomicReference)32 List (java.util.List)31 IOException (java.io.IOException)30 Assertions.assertThatExceptionOfType (org.assertj.core.api.Assertions.assertThatExceptionOfType)30 ChannelOption (io.netty.channel.ChannelOption)29 Unpooled (io.netty.buffer.Unpooled)28 Charset (java.nio.charset.Charset)28