Skip to content

SslHandler removed before handshake completed #2106

@crazysvn

Description

@crazysvn

keeps getting below this error while using async-http-client.
platform: win10
async-http-client version: 3.0.2
netty version: 4.1.119.Final
openjdk version: 11 , 8, 17

core codes:
DefaultAsyncHttpClientConfig.Builder configBuilder =
new DefaultAsyncHttpClientConfig.Builder()
.setHandshakeTimeout(5000)
.setConnectionTtl(Duration.ofSeconds(25))
.setConnectTimeout(Duration.ofSeconds(10))
.setReadTimeout(Duration.ofSeconds(10))
.setRequestTimeout(Duration.ofSeconds(10))
.setSslSessionTimeout(10000)
.setMaxConnections(10000)
.setMaxConnectionsPerHost(10)
.setFollowRedirect(true)
.setMaxRedirects(3)
.setKeepAlive(true)
.setTcpNoDelay(true)
.setEnabledProtocols(new String[]{"TLSv1.2", "TLSv1.3"})
.setDisableHttpsEndpointIdentificationAlgorithm(true);

    configBuilder.setSslContext(createSslContext());
    configBuilder.setUseInsecureTrustManager(true);
    
    this.httpClient = Dsl.asyncHttpClient(configBuilder);        
}

private SslContext createSslContext() {
    X509TrustManager tm = new X509TrustManager() {

        @Override
        public void checkClientTrusted(X509Certificate[] xcs, String string) throws CertificateException {
        }

        @Override
        public void checkServerTrusted(X509Certificate[] xcs, String string) throws CertificateException {
        }

        @Override
        public X509Certificate[] getAcceptedIssuers() {
            return null;
        }
    };

    SslProvider sslProvider = SslContext.defaultClientProvider();
    SslContextBuilder sslContextBuilder = SslContextBuilder.forClient();
    sslContextBuilder.trustManager(tm);
    sslContextBuilder.sslProvider(sslProvider);
    try {
        return sslContextBuilder.build();
    } catch (SSLException e) {
        throw new RuntimeException(e.getMessage(), e);
    }
}

private CompletableFuture executeGetRequest(String url) {
long startTime = System.currentTimeMillis();

    return httpClient.prepareGet(url)
        .addHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7")
        .addHeader("access-control-allow-origin", "*")
        .addHeader("referer", "https://www.quora.com/")
    	.addHeader("sec-fetch-dest", "document")
    	.addHeader("Sec-Fetch-Mode", "navigate")
    	.addHeader("Sec-Fetch-Site", "none")
    	.addHeader("sec-ch-ua", "\"Google Chrome\";v=\"119\", \"Chromium\";v=\"119\", \"Not?A_Brand\";v=\"24\"")
    	.addHeader("sec-ch-ua-mobile", "?0")
    	.addHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36")
    	.addHeader("sec-ch-ua-platform", "\"Windows\"")
    	.addHeader("Accept-Language", "en-US,en;q=0.9")
    	.addHeader("Accept-Charset", "UTF-8")
        .addHeader("Cache-Control", "no-cache")
        .execute()
        .toCompletableFuture()
        .thenApply(response -> {
            long duration = System.currentTimeMillis() - startTime;
            return new BatchResult(url, response.getStatusCode(), 
                response.getResponseBody(), duration, null);
        })
        .exceptionally(throwable -> {
        	throwable.printStackTrace();
            long duration = System.currentTimeMillis() - startTime;
            return new BatchResult(url, -1, null, duration, throwable.getMessage());
        });
}

stack trace:
java.util.concurrent.CompletionException: java.net.ConnectException: SslHandler removed before handshake completed
at java.base/java.util.concurrent.CompletableFuture.encodeThrowable(CompletableFuture.java:332)
at java.base/java.util.concurrent.CompletableFuture.completeThrowable(CompletableFuture.java:347)
at java.base/java.util.concurrent.CompletableFuture$UniApply.tryFire(CompletableFuture.java:636)
at java.base/java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:510)
at java.base/java.util.concurrent.CompletableFuture.completeExceptionally(CompletableFuture.java:2162)
at org.asynchttpclient.netty.NettyResponseFuture.abort(NettyResponseFuture.java:286)
at org.asynchttpclient.netty.channel.NettyConnectListener.onFailure(NettyConnectListener.java:175)
at org.asynchttpclient.netty.channel.NettyConnectListener$1.onFailure(NettyConnectListener.java:145)
at org.asynchttpclient.netty.SimpleFutureListener.operationComplete(SimpleFutureListener.java:28)
at io.netty.util.concurrent.DefaultPromise.notifyListener0(DefaultPromise.java:590)
at io.netty.util.concurrent.DefaultPromise.notifyListenersNow(DefaultPromise.java:557)
at io.netty.util.concurrent.DefaultPromise.notifyListeners(DefaultPromise.java:492)
at io.netty.util.concurrent.DefaultPromise.addListener(DefaultPromise.java:185)
at io.netty.util.concurrent.DefaultPromise.addListener(DefaultPromise.java:35)
at org.asynchttpclient.netty.channel.NettyConnectListener.onSuccess(NettyConnectListener.java:123)
at org.asynchttpclient.netty.channel.NettyChannelConnector$1.onSuccess(NettyChannelConnector.java:91)
at org.asynchttpclient.netty.SimpleChannelFutureListener.operationComplete(SimpleChannelFutureListener.java:28)
at org.asynchttpclient.netty.SimpleChannelFutureListener.operationComplete(SimpleChannelFutureListener.java:22)
at io.netty.util.concurrent.DefaultPromise.notifyListener0(DefaultPromise.java:590)
at io.netty.util.concurrent.DefaultPromise.notifyListeners0(DefaultPromise.java:583)
at io.netty.util.concurrent.DefaultPromise.notifyListenersNow(DefaultPromise.java:559)
at io.netty.util.concurrent.DefaultPromise.notifyListeners(DefaultPromise.java:492)
at io.netty.util.concurrent.DefaultPromise.setValue0(DefaultPromise.java:636)
at io.netty.util.concurrent.DefaultPromise.setSuccess0(DefaultPromise.java:625)
at io.netty.util.concurrent.DefaultPromise.trySuccess(DefaultPromise.java:105)
at io.netty.channel.DefaultChannelPromise.trySuccess(DefaultChannelPromise.java:84)
at io.netty.channel.nio.AbstractNioChannel$AbstractNioUnsafe.fulfillConnectPromise(AbstractNioChannel.java:305)
at io.netty.channel.nio.AbstractNioChannel$AbstractNioUnsafe.finishConnect(AbstractNioChannel.java:340)
at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:784)
at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:732)
at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:658)
at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:562)
at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:998)
at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
at java.base/java.lang.Thread.run(Thread.java:833)
Caused by: java.net.ConnectException: SslHandler removed before handshake completed
at org.asynchttpclient.netty.channel.NettyConnectListener.onFailure(NettyConnectListener.java:173)
... 29 more
Caused by: javax.net.ssl.SSLHandshakeException: SslHandler removed before handshake completed
at io.netty.handler.ssl.SslHandler.handlerRemoved0(SslHandler.java:718)
at io.netty.handler.codec.ByteToMessageDecoder.handlerRemoved(ByteToMessageDecoder.java:272)
at io.netty.channel.AbstractChannelHandlerContext.callHandlerRemoved(AbstractChannelHandlerContext.java:1138)
at io.netty.channel.DefaultChannelPipeline.callHandlerAdded0(DefaultChannelPipeline.java:563)
at io.netty.channel.DefaultChannelPipeline.internalAdd(DefaultChannelPipeline.java:203)
at io.netty.channel.DefaultChannelPipeline.addFirst(DefaultChannelPipeline.java:209)
at io.netty.channel.DefaultChannelPipeline.addFirst(DefaultChannelPipeline.java:151)
at org.asynchttpclient.netty.channel.ChannelManager.addSslHandler(ChannelManager.java:435)
at org.asynchttpclient.netty.channel.NettyConnectListener.onSuccess(NettyConnectListener.java:107)
... 21 more

and here are the libs I imported:

Image

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions