Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

WebSocket wrong status code should force fallback transport #77

Closed
Frintrop opened this issue Dec 30, 2013 · 7 comments
Closed

WebSocket wrong status code should force fallback transport #77

Frintrop opened this issue Dec 30, 2013 · 7 comments
Labels

Comments

@Frintrop
Copy link

We are evaluating your atmosphere framework. We are using the nettosphere chat (2.1) example and wasync (2.1) for this purpose. We have successfully setup a SSL connection from wasync client to nettosphere and all transports running perfectly.
One of our must-have features is the ability to use a proxy server behind the client. Therefor we have setup wasync client this way:

SSLContext sslContext = null;
        try
        {
            sslContext = getSSLContext();
        }
        catch (Exception e1)
        {

            e1.printStackTrace();
        }

        AsyncHttpClientConfig.Builder ahccBuilder = new AsyncHttpClientConfig.Builder();

        // ahccBuilder.setRealm(realm);
        final SSLContext finalSslContext = sslContext;
        ahccBuilder.setSSLEngineFactory(new SSLEngineFactory()
        {

            @Override
            public SSLEngine newSSLEngine() throws GeneralSecurityException
            {
                SSLEngine sslEngine = finalSslContext.createSSLEngine();
                sslEngine.setUseClientMode(true);
                // sslEngine.setEnabledCipherSuites(new String[] {
                // "SSL_DH_anon_WITH_RC4_128_MD5" });
                return sslEngine;
            }
        }

        );
        ahccBuilder.setProxyServer( new ProxyServer("10.100.0.100",8080));
        AsyncHttpClient ahClient = new AsyncHttpClient(ahccBuilder.build());


        AtmosphereClient atmosClient = ClientFactory.getDefault().newClient(AtmosphereClient.class);

        AtmosphereRequestBuilder requestbuilder = atmosClient.newRequestBuilder().method(Request.METHOD.GET).uri("https://external-ip/chat")    

                .trackMessageLength(true)
                .encoder(new Encoder<Message, String>()
                {
                    @Override
                    public String encode(Message data)
                    {
                        try
                        {
                            return mapper.writeValueAsString(data);
                        }
                        catch (IOException e)
                        {
                            throw new RuntimeException(e);
                        }
                    }
                }).decoder(new Decoder<String, Message>()
                {
                    @Override
                    public Message decode(Event type, String data)
                    {

                        data = data.trim();

                        // Padding from Atmosphere, skip
                        if (data.length() == 0)
                        {
                            return null;
                        }

                        if (type.equals(Event.MESSAGE))
                        {
                            try
                            {
                                return mapper.readValue(data, Message.class);
                            }
                            catch (IOException e)
                            {
                                e.printStackTrace();
                                System.err.println("Invalid message " + data);
                                return null;
                            }
                        }
                        else
                        {
                            return null;
                        }
                    }
                })
                .transport(Request.TRANSPORT.WEBSOCKET)
                .transport(Request.TRANSPORT.STREAMING)
                .transport(Request.TRANSPORT.SSE)
                .transport(Request.TRANSPORT.LONG_POLLING);

        Request request = requestbuilder.build();

        DefaultOptionsBuilder optionsBuilder = atmosClient.newOptionsBuilder();
        optionsBuilder.requestTimeoutInSeconds(10);

        DefaultOptions options = optionsBuilder.build();
        options.runtime(ahClient);

        Socket socket = atmosClient.create(options);
        try
        {
            socket.on("message", new Function<Message>()
            {
                @Override
                public void on(Message t)
                {
                    Date d = new Date(t.getTime());
                    System.out.println("Author " + t.getAuthor() + " @ " + d.getHours() + ":" + d.getMinutes() + " : " + t.getMessage());
                }
            }).on(new Function<Throwable>()
            {

                @Override
                public void on(Throwable t)
                {
                    t.printStackTrace();
                }

            }).on(Event.CLOSE.name(), new Function<String>()
            {
                @Override
                public void on(String t)
                {
                    System.err.println("Connection closed :" + t);
                }
            }).on(Event.TRANSPORT.name(), new Function<String>()
            {
                @Override
                public void on(String t)
                {
                    System.err.println("Transport:" + t);
                }
            }).on(new Function<TimeoutException>()
            {
                @Override
                public void on(final TimeoutException t)
                {
                    t.printStackTrace();
                }

            }).on(Event.CLOSE, new Function<String>()
            {
                @Override
                public void on(final String t)
                {
                    System.out.println("Connection closed");
                }
            }).on(Event.HEADERS, new Function<String>()
            {
                @Override
                public void on(final String t)
                {
                    System.out.println("Headers: " + t);
                }
            }).on(Event.OPEN, new Function<String>()
            {
                @Override
                public void on(final String t)
                {
                    System.out.println("Open");
                }
            }).on(Event.TRANSPORT, new Function<String>()
            {
                @Override
                public void on(final String t)
                {
                    System.out.println("Transport: " + t);
                }
            }).open(request);
        }
        catch (IOException e)
        {

            e.printStackTrace();
        }

        System.out.println("Choose Name: ");
        String name = null;
        String a = "";
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        while (!(a.equals("quit")))
        {
            a = br.readLine();
            if (name == null)
            {
                name = a;
            }
            socket.fire(new Message(name, a));
        }
        socket.close();

    }

We can now get now connect, while the clients tries WS,SSE and STREAMING as transport and stops with an error.
If we only request LONG_POLLING wasync client seems to become connected but nettosphere server answers:

4:10:00.794 [New I/O worker #5] DEBUG o.a.cpr.AsynchronousProcessor - No AtmosphereHandler maps request for //external-ip/chat with mapping {/chat=AtmosphereHandlerWrapper{ atmosphereHandler=ManagedAtmosphereHandler proxy for org.nettosphere.samples.chat.Chat, broadcaster=
    Name: /chat
    AtmosphereResource: 0
    BroadcasterCache org.atmosphere.cache.DefaultBroadcasterCache@5d6ea269 }}

Removing the proxy line everything with every transport works perfect.

What´s missing to get this running ?

( external-ip is a replacement for a public ip address )

Many thx and happy new year

André

@Frintrop
Copy link
Author

Frintrop commented Jan 1, 2014

Ok. Setting this:

ProxyServer ps =  new ProxyServer(ProxyServer.Protocol.HTTPS, "10.100.0.100", 8080);        
        ahccBuilder.setProxyServer(ps);
        ahccBuilder.setUseRelativeURIsWithSSLProxies(true);

Now LONG_POLLING will work. There is still no auto-fallback with this proxy settings possible. I have explicity to specify only LONG_POLLING to get the example working. Otherwise we get following errors:

15:50:17.246 [main] DEBUG c.n.h.c.p.n.NettyAsyncHttpProvider - Number of application's worker threads is 16
15:50:17.375 [main] DEBUG c.n.h.c.p.n.NettyAsyncHttpProvider - 
Non cached request 
DefaultHttpRequest(chunked: false)
CONNECT external-ip:443 HTTP/1.0
Upgrade: WebSocket
Connection: Upgrade
Origin: http://external-ip:-1
Sec-WebSocket-Key: xKy9mbUm1RF0tvUF/osP5Q==
Sec-WebSocket-Version: 13
Host:external-ip
Proxy-Connection: keep-alive
Accept: */*
User-Agent: NING/1.0

using Channel 
[id: 0x033abd61, /10.100.1.72:61509 => /10.100.0.100:8080]

15:50:17.417 [New I/O worker #1] DEBUG o.a.w.transport.WebSocketTransport - Invalid status code 200 for WebSocket Handshake
15:50:17.425 [New I/O worker #1] DEBUG c.n.h.c.p.n.NettyAsyncHttpProvider - Unexpected I/O exception on channel [id: 0x033abd61, /10.100.1.72:61509 => /10.100.0.100:8080]
org.atmosphere.wasync.transport.TransportNotSupported: null
    at org.atmosphere.wasync.transport.WebSocketTransport.onStatusReceived(WebSocketTransport.java:184) ~[wasync-1.2.0.jar.jar:na]
    at com.ning.http.client.providers.netty.NettyAsyncHttpProvider$WebSocketProtocol.handle(NettyAsyncHttpProvider.java:2308) ~[wasync-1.2.0.jar.jar:na]
    at com.ning.http.client.providers.netty.NettyAsyncHttpProvider.messageReceived(NettyAsyncHttpProvider.java:1142) ~[wasync-1.2.0.jar.jar:na]
    at org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:296) ~[netty-3.6.3.Final.jar:na]
    at org.jboss.netty.handler.codec.frame.FrameDecoder.unfoldAndFireMessageReceived(FrameDecoder.java:459) ~[netty-3.6.3.Final.jar:na]
    at org.jboss.netty.handler.codec.replay.ReplayingDecoder.callDecode(ReplayingDecoder.java:536) ~[netty-3.6.3.Final.jar:na]
    at org.jboss.netty.handler.codec.replay.ReplayingDecoder.messageReceived(ReplayingDecoder.java:435) ~[netty-3.6.3.Final.jar:na]
    at org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:268) ~[netty-3.6.3.Final.jar:na]
    at org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:255) ~[netty-3.6.3.Final.jar:na]
    at org.jboss.netty.channel.socket.nio.NioWorker.read(NioWorker.java:88) ~[netty-3.6.3.Final.jar:na]
    at org.jboss.netty.channel.socket.nio.AbstractNioWorker.process(AbstractNioWorker.java:107) ~[netty-3.6.3.Final.jar:na]
    at org.jboss.netty.channel.socket.nio.AbstractNioSelector.run(AbstractNioSelector.java:312) ~[netty-3.6.3.Final.jar:na]
    at org.jboss.netty.channel.socket.nio.AbstractNioWorker.run(AbstractNioWorker.java:88) ~[netty-3.6.3.Final.jar:na]
    at org.jboss.netty.channel.socket.nio.NioWorker.run(NioWorker.java:178) ~[netty-3.6.3.Final.jar:na]
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) ~[na:1.7.0_25]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) ~[na:1.7.0_25]
    at java.lang.Thread.run(Thread.java:724) ~[na:1.7.0_25]
15:50:17.425 [New I/O worker #1] DEBUG c.n.h.c.p.n.NettyAsyncHttpProvider - Was unable to recover Future: NettyResponseFuture{currentRetry=0,
    isDone=false,
    isCancelled=false,
    asyncHandler=org.atmosphere.wasync.transport.WebSocketTransport@5238e759,
    requestTimeoutInMs=60000,
    nettyRequest=DefaultHttpRequest(chunked: false)
CONNECTexternal-ip:443 HTTP/1.0
Upgrade: WebSocket
Connection: Upgrade
Origin: http://external-ip:-1
Sec-WebSocket-Key: xKy9mbUm1RF0tvUF/osP5Q==
Sec-WebSocket-Version: 13
Host: external-ip
Proxy-Connection: keep-alive
Accept: */*
User-Agent: NING/1.0,
    content=null,
    uri=wss://external-ip/chat?X-Atmosphere-Transport=websocket&X-Atmosphere-Framework=2.0&X-atmo-protocol=true&X-Atmosphere-tracking-id=0&X-Cache-Date=0,
    keepAlive=true,
    httpResponse=DefaultHttpResponse(chunked: true)
HTTP/1.1 200 Connection established
Accept-Ranges: none
Connection: Keep-Alive,
    exEx=null,
    redirectCount=0,
    reaperFuture=com.ning.http.client.providers.netty.NettyAsyncHttpProvider$ReaperFuture@15dcae3b,
    inAuth=false,
    statusReceived=false,
    touch=788777519}
15:50:17.426 [New I/O worker #1] DEBUG c.n.h.c.p.n.NettyAsyncHttpProvider - Aborting Future NettyResponseFuture{currentRetry=0,
    isDone=false,
    isCancelled=false,
    asyncHandler=org.atmosphere.wasync.transport.WebSocketTransport@5238e759,
    requestTimeoutInMs=60000,
    nettyRequest=DefaultHttpRequest(chunked: false)
CONNECT external-ip:443 HTTP/1.0
Upgrade: WebSocket
Connection: Upgrade
Origin: http://external-ip:-1
Sec-WebSocket-Key: xKy9mbUm1RF0tvUF/osP5Q==
Sec-WebSocket-Version: 13
Host: external-ip
Proxy-Connection: keep-alive
Accept: */*
User-Agent: NING/1.0,
    content=null,
    uri=wss://external-ip/chat?X-Atmosphere-Transport=websocket&X-Atmosphere-Framework=2.0&X-atmo-protocol=true&X-Atmosphere-tracking-id=0&X-Cache-Date=0,
    keepAlive=true,
    httpResponse=DefaultHttpResponse(chunked: true)
HTTP/1.1 200 Connection established
Accept-Ranges: none
Connection: Keep-Alive,
    exEx=null,
    redirectCount=0,
    reaperFuture=com.ning.http.client.providers.netty.NettyAsyncHttpProvider$ReaperFuture@15dcae3b,
    inAuth=false,
    statusReceived=false,
    touch=788777519}

15:50:17.426 [New I/O worker #1] DEBUG c.n.h.c.p.n.NettyAsyncHttpProvider - null
org.atmosphere.wasync.transport.TransportNotSupported: null
    at org.atmosphere.wasync.transport.WebSocketTransport.onStatusReceived(WebSocketTransport.java:184) ~[wasync-1.2.0.jar.jar:na]
    at com.ning.http.client.providers.netty.NettyAsyncHttpProvider$WebSocketProtocol.handle(NettyAsyncHttpProvider.java:2308) ~[wasync-1.2.0.jar.jar:na]
    at com.ning.http.client.providers.netty.NettyAsyncHttpProvider.messageReceived(NettyAsyncHttpProvider.java:1142) ~[wasync-1.2.0.jar.jar:na]
    at org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:296) ~[netty-3.6.3.Final.jar:na]
    at org.jboss.netty.handler.codec.frame.FrameDecoder.unfoldAndFireMessageReceived(FrameDecoder.java:459) ~[netty-3.6.3.Final.jar:na]
    at org.jboss.netty.handler.codec.replay.ReplayingDecoder.callDecode(ReplayingDecoder.java:536) ~[netty-3.6.3.Final.jar:na]
    at org.jboss.netty.handler.codec.replay.ReplayingDecoder.messageReceived(ReplayingDecoder.java:435) ~[netty-3.6.3.Final.jar:na]
    at org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:268) ~[netty-3.6.3.Final.jar:na]
    at org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:255) ~[netty-3.6.3.Final.jar:na]
    at org.jboss.netty.channel.socket.nio.NioWorker.read(NioWorker.java:88) ~[netty-3.6.3.Final.jar:na]
    at org.jboss.netty.channel.socket.nio.AbstractNioWorker.process(AbstractNioWorker.java:107) ~[netty-3.6.3.Final.jar:na]
    at org.jboss.netty.channel.socket.nio.AbstractNioSelector.run(AbstractNioSelector.java:312) ~[netty-3.6.3.Final.jar:na]
    at org.jboss.netty.channel.socket.nio.AbstractNioWorker.run(AbstractNioWorker.java:88) ~[netty-3.6.3.Final.jar:na]
    at org.jboss.netty.channel.socket.nio.NioWorker.run(NioWorker.java:178) ~[netty-3.6.3.Final.jar:na]
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) ~[na:1.7.0_25]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) ~[na:1.7.0_25]
    at java.lang.Thread.run(Thread.java:724) ~[na:1.7.0_25]
15:50:17.426 [New I/O worker #1] DEBUG o.a.w.transport.WebSocketTransport - 
org.atmosphere.wasync.transport.TransportNotSupported: null
    at org.atmosphere.wasync.transport.WebSocketTransport.onStatusReceived(WebSocketTransport.java:184) ~[wasync-1.2.0.jar.jar:na]
    at com.ning.http.client.providers.netty.NettyAsyncHttpProvider$WebSocketProtocol.handle(NettyAsyncHttpProvider.java:2308) ~[wasync-1.2.0.jar.jar:na]
    at com.ning.http.client.providers.netty.NettyAsyncHttpProvider.messageReceived(NettyAsyncHttpProvider.java:1142) ~[wasync-1.2.0.jar.jar:na]
    at org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:296) ~[netty-3.6.3.Final.jar:na]
    at org.jboss.netty.handler.codec.frame.FrameDecoder.unfoldAndFireMessageReceived(FrameDecoder.java:459) ~[netty-3.6.3.Final.jar:na]
    at org.jboss.netty.handler.codec.replay.ReplayingDecoder.callDecode(ReplayingDecoder.java:536) ~[netty-3.6.3.Final.jar:na]
    at org.jboss.netty.handler.codec.replay.ReplayingDecoder.messageReceived(ReplayingDecoder.java:435) ~[netty-3.6.3.Final.jar:na]
    at org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:268) ~[netty-3.6.3.Final.jar:na]
    at org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:255) ~[netty-3.6.3.Final.jar:na]
    at org.jboss.netty.channel.socket.nio.NioWorker.read(NioWorker.java:88) ~[netty-3.6.3.Final.jar:na]
    at org.jboss.netty.channel.socket.nio.AbstractNioWorker.process(AbstractNioWorker.java:107) ~[netty-3.6.3.Final.jar:na]
    at org.jboss.netty.channel.socket.nio.AbstractNioSelector.run(AbstractNioSelector.java:312) ~[netty-3.6.3.Final.jar:na]
    at org.jboss.netty.channel.socket.nio.AbstractNioWorker.run(AbstractNioWorker.java:88) ~[netty-3.6.3.Final.jar:na]
    at org.jboss.netty.channel.socket.nio.NioWorker.run(NioWorker.java:178) ~[netty-3.6.3.Final.jar:na]
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) ~[na:1.7.0_25]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) ~[na:1.7.0_25]
    at java.lang.Thread.run(Thread.java:724) ~[na:1.7.0_25]
java.io.IOException: Connection Error 200 : Connection established
    at org.atmosphere.wasync.transport.WebSocketTransport.connectFutureException(WebSocketTransport.java:301)
    at org.atmosphere.wasync.transport.WebSocketTransport.onFailure(WebSocketTransport.java:335)
    at org.atmosphere.wasync.transport.WebSocketTransport.onThrowable(WebSocketTransport.java:103)
    at com.ning.http.client.providers.netty.NettyResponseFuture.abort(NettyResponseFuture.java:327)
    at com.ning.http.client.providers.netty.NettyAsyncHttpProvider.abort(NettyAsyncHttpProvider.java:1320)
    at com.ning.http.client.providers.netty.NettyAsyncHttpProvider.exceptionCaught(NettyAsyncHttpProvider.java:1535)
    at org.jboss.netty.channel.SimpleChannelUpstreamHandler.handleUpstream(SimpleChannelUpstreamHandler.java:112)
    at org.jboss.netty.channel.DefaultChannelPipeline.sendUpstream(DefaultChannelPipeline.java:560)
    at org.jboss.netty.channel.DefaultChannelPipeline$DefaultChannelHandlerContext.sendUpstream(DefaultChannelPipeline.java:787)
    at org.jboss.netty.handler.codec.frame.FrameDecoder.exceptionCaught(FrameDecoder.java:377)
    at org.jboss.netty.channel.SimpleChannelUpstreamHandler.handleUpstream(SimpleChannelUpstreamHandler.java:112)
    at org.jboss.netty.channel.DefaultChannelPipeline.sendUpstream(DefaultChannelPipeline.java:560)
    at org.jboss.netty.channel.DefaultChannelPipeline.sendUpstream(DefaultChannelPipeline.java:555)
    at org.jboss.netty.channel.Channels.fireExceptionCaught(Channels.java:525)
    at org.jboss.netty.channel.AbstractChannelSink.exceptionCaught(AbstractChannelSink.java:48)
    at org.jboss.netty.channel.DefaultChannelPipeline.notifyHandlerException(DefaultChannelPipeline.java:654)
    at org.jboss.netty.channel.DefaultChannelPipeline.sendUpstream(DefaultChannelPipeline.java:562)
    at org.jboss.netty.channel.DefaultChannelPipeline$DefaultChannelHandlerContext.sendUpstream(DefaultChannelPipeline.java:787)
    at org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:296)
    at org.jboss.netty.handler.codec.frame.FrameDecoder.unfoldAndFireMessageReceived(FrameDecoder.java:459)
    at org.jboss.netty.handler.codec.replay.ReplayingDecoder.callDecode(ReplayingDecoder.java:536)
    at org.jboss.netty.handler.codec.replay.ReplayingDecoder.messageReceived(ReplayingDecoder.java:435)
    at org.jboss.netty.channel.SimpleChannelUpstreamHandler.handleUpstream(SimpleChannelUpstreamHandler.java:70)
    at org.jboss.netty.channel.DefaultChannelPipeline.sendUpstream(DefaultChannelPipeline.java:560)
    at org.jboss.netty.channel.DefaultChannelPipeline.sendUpstream(DefaultChannelPipeline.java:555)
    at org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:268)
    at org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:255)
    at org.jboss.netty.channel.socket.nio.NioWorker.read(NioWorker.java:88)
    at org.jboss.netty.channel.socket.nio.AbstractNioWorker.process(AbstractNioWorker.java:107)
    at org.jboss.netty.channel.socket.nio.AbstractNioSelector.run(AbstractNioSelector.java:312)
    at org.jboss.netty.channel.socket.nio.AbstractNioWorker.run(AbstractNioWorker.java:88)
    at org.jboss.netty.channel.socket.nio.NioWorker.run(NioWorker.java:178)
    at org.jboss.netty.util.ThreadRenamingRunnable.run(ThreadRenamingRunnable.java:108)
    at org.jboss.netty.util.internal.DeadLockProofWorker$1.run(DeadLockProofWorker.java:42)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:724)
Caused by: Connection Error 200 : Connection established
    at org.atmosphere.wasync.transport.WebSocketTransport.onStatusReceived(WebSocketTransport.java:184)
    at com.ning.http.client.providers.netty.NettyAsyncHttpProvider$WebSocketProtocol.handle(NettyAsyncHttpProvider.java:2308)
    at com.ning.http.client.providers.netty.NettyAsyncHttpProvider.messageReceived(NettyAsyncHttpProvider.java:1142)
    at org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:296)
    at org.jboss.netty.handler.codec.frame.FrameDecoder.unfoldAndFireMessageReceived(FrameDecoder.java:459)
    at org.jboss.netty.handler.codec.replay.ReplayingDecoder.callDecode(ReplayingDecoder.java:536)
    at org.jboss.netty.handler.codec.replay.ReplayingDecoder.messageReceived(ReplayingDecoder.java:435)
    at org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:268)
    at org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:255)
    at org.jboss.netty.channel.socket.nio.NioWorker.read(NioWorker.java:88)
    at org.jboss.netty.channel.socket.nio.AbstractNioWorker.process(AbstractNioWorker.java:107)
    at org.jboss.netty.channel.socket.nio.AbstractNioSelector.run(AbstractNioSelector.java:312)
    at org.jboss.netty.channel.socket.nio.AbstractNioWorker.run(AbstractNioWorker.java:88)
    at org.jboss.netty.channel.socket.nio.NioWorker.run(NioWorker.java:178)
    ... 3 more
Connection Error 200 : Connection established
Choose Name: 
    at org.atmosphere.wasync.transport.WebSocketTransport.onStatusReceived(WebSocketTransport.java:184)
    at com.ning.http.client.providers.netty.NettyAsyncHttpProvider$WebSocketProtocol.handle(NettyAsyncHttpProvider.java:2308)
    at com.ning.http.client.providers.netty.NettyAsyncHttpProvider.messageReceived(NettyAsyncHttpProvider.java:1142)
    at org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:296)
    at org.jboss.netty.handler.codec.frame.FrameDecoder.unfoldAndFireMessageReceived(FrameDecoder.java:459)
    at org.jboss.netty.handler.codec.replay.ReplayingDecoder.callDecode(ReplayingDecoder.java:536)
    at org.jboss.netty.handler.codec.replay.ReplayingDecoder.messageReceived(ReplayingDecoder.java:435)
    at org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:268)
    at org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:255)
    at org.jboss.netty.channel.socket.nio.NioWorker.read(NioWorker.java:88)
    at org.jboss.netty.channel.socket.nio.AbstractNioWorker.process(AbstractNioWorker.java:107)
    at org.jboss.netty.channel.socket.nio.AbstractNioSelector.run(AbstractNioSelector.java:312)
    at org.jboss.netty.channel.socket.nio.AbstractNioWorker.run(AbstractNioWorker.java:88)
    at org.jboss.netty.channel.socket.nio.NioWorker.run(NioWorker.java:178)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:724)
15:50:17.434 [New I/O worker #1] DEBUG c.n.h.c.p.n.NettyAsyncHttpProvider - 
Non cached request 
DefaultHttpRequest(chunked: false)
CONNECT external-ip:443 HTTP/1.0
Host: external-ip
Connection: keep-alive
Proxy-Connection: keep-alive
Accept: */*
User-Agent: NING/1.0

using Channel 
[id: 0x82cb7f52]

15:50:17.435 [New I/O worker #1] INFO  o.a.wasync.impl.DefaultSocket - Waiting 2000, allowing the http connection to get handled by the server. To reduce the delay, make sure some bytes get written when the connection is suspended on the server
15:50:17.464 [New I/O worker #2] DEBUG c.n.h.c.p.n.NettyAsyncHttpProvider - 

Request DefaultHttpRequest(chunked: false)
CONNECT external-ip:443 HTTP/1.0
Host: external-ip
Connection: keep-alive
Proxy-Connection: keep-alive
Accept: */*
User-Agent: NING/1.0

Response DefaultHttpResponse(chunked: false)
HTTP/1.1 200 Connection established
Accept-Ranges: none
Connection: Keep-Alive

15:50:17.464 [New I/O worker #2] DEBUG c.n.h.c.p.n.NettyAsyncHttpProvider - Connected to 10.100.0.100:8080
15:50:17.464 [New I/O worker #2] DEBUG c.n.h.c.p.n.NettyAsyncHttpProvider - Connecting to proxy https://10.100.0.100:8080 for scheme https://external-ip/chat?X-Atmosphere-Transport=STREAMING&X-Atmosphere-Framework=2.0&X-atmo-protocol=true&X-Atmosphere-tracking-id=0&X-Cache-Date=0
15:50:17.630 [New I/O worker #2] DEBUG c.n.h.c.p.n.NettyAsyncHttpProvider - 
Using cached Channel [id: 0x82cb7f52, /10.100.1.72:61510 => /10.100.0.100:8080]
 for request 
DefaultHttpRequest(chunked: false)
GET /chat?X-Atmosphere-Transport=STREAMING&X-Atmosphere-Framework=2.0&X-atmo-protocol=true&X-Atmosphere-tracking-id=0&X-Cache-Date=0 HTTP/1.1
Host: external-ip
Connection: keep-alive
Proxy-Connection: keep-alive
Accept: */*
User-Agent: NING/1.0

checkServerTrusted
RSA
[Ljava.security.cert.X509Certificate;@442562f2
15:50:17.705 [New I/O worker #2] DEBUG c.n.h.c.p.n.NettyAsyncHttpProvider - 

Request DefaultHttpRequest(chunked: false)
GET /chat?X-Atmosphere-Transport=STREAMING&X-Atmosphere-Framework=2.0&X-atmo-protocol=true&X-Atmosphere-tracking-id=0&X-Cache-Date=0 HTTP/1.1
Host: external-ip
Connection: keep-alive
Proxy-Connection: keep-alive
Accept: */*
User-Agent: NING/1.0

Response DefaultHttpResponse(chunked: true)
HTTP/1.1 200 OK
Content-Type: text/plain
Transfer-Encoding: chunked
Expires: -1
Connection: Keep-Alive
X-Atmosphere-tracking-id: ff8de252-5753-44c6-9da6-4ab540875229
Server: Nettosphere/2.0
Pragma: no-cache
Cache-Control: no-store, no-cache, must-revalidate

Transport:STREAMING
Transport: STREAMING
Headers: "Content-Type=text/plain"; "Transfer-Encoding=chunked"; "Expires=-1"; "Connection=Keep-Alive"; "X-Atmosphere-tracking-id=ff8de252-5753-44c6-9da6-4ab540875229"; "Server=Nettosphere/2.0"; "Pragma=no-cache"; "Cache-Control=no-store, no-cache, must-revalidate"
Open
15:50:17.709 [New I/O worker #1] DEBUG c.n.h.c.p.netty.NettyResponseFuture - asyncHandler.onThrowable
java.util.ConcurrentModificationException: null
    at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:819) ~[na:1.7.0_25]
    at java.util.ArrayList$Itr.next(ArrayList.java:791) ~[na:1.7.0_25]
    at org.atmosphere.wasync.transport.TransportsUtil.invokeFunction(TransportsUtil.java:60) ~[wasync-1.2.0.jar.jar:na]
    at org.atmosphere.wasync.transport.WebSocketTransport.onFailure(WebSocketTransport.java:336) ~[wasync-1.2.0.jar.jar:na]
    at org.atmosphere.wasync.transport.WebSocketTransport.onThrowable(WebSocketTransport.java:103) ~[wasync-1.2.0.jar.jar:na]
    at com.ning.http.client.providers.netty.NettyResponseFuture.abort(NettyResponseFuture.java:327) ~[wasync-1.2.0.jar.jar:na]
    at com.ning.http.client.providers.netty.NettyAsyncHttpProvider.abort(NettyAsyncHttpProvider.java:1320) ~[wasync-1.2.0.jar.jar:na]
    at com.ning.http.client.providers.netty.NettyAsyncHttpProvider.exceptionCaught(NettyAsyncHttpProvider.java:1535) ~[wasync-1.2.0.jar.jar:na]
    at org.jboss.netty.channel.SimpleChannelUpstreamHandler.handleUpstream(SimpleChannelUpstreamHandler.java:112) ~[netty-3.6.3.Final.jar:na]
    at org.jboss.netty.channel.DefaultChannelPipeline.sendUpstream(DefaultChannelPipeline.java:560) ~[netty-3.6.3.Final.jar:na]
    at org.jboss.netty.channel.DefaultChannelPipeline$DefaultChannelHandlerContext.sendUpstream(DefaultChannelPipeline.java:787) ~[netty-3.6.3.Final.jar:na]
    at org.jboss.netty.handler.codec.frame.FrameDecoder.exceptionCaught(FrameDecoder.java:377) ~[netty-3.6.3.Final.jar:na]
    at org.jboss.netty.channel.SimpleChannelUpstreamHandler.handleUpstream(SimpleChannelUpstreamHandler.java:112) ~[netty-3.6.3.Final.jar:na]
    at org.jboss.netty.channel.DefaultChannelPipeline.sendUpstream(DefaultChannelPipeline.java:560) ~[netty-3.6.3.Final.jar:na]
    at org.jboss.netty.channel.DefaultChannelPipeline.sendUpstream(DefaultChannelPipeline.java:555) ~[netty-3.6.3.Final.jar:na]
    at org.jboss.netty.channel.Channels.fireExceptionCaught(Channels.java:525) ~[netty-3.6.3.Final.jar:na]
    at org.jboss.netty.channel.AbstractChannelSink.exceptionCaught(AbstractChannelSink.java:48) ~[netty-3.6.3.Final.jar:na]
    at org.jboss.netty.channel.DefaultChannelPipeline.notifyHandlerException(DefaultChannelPipeline.java:654) ~[netty-3.6.3.Final.jar:na]
    at org.jboss.netty.channel.DefaultChannelPipeline.sendUpstream(DefaultChannelPipeline.java:562) ~[netty-3.6.3.Final.jar:na]
    at org.jboss.netty.channel.DefaultChannelPipeline$DefaultChannelHandlerContext.sendUpstream(DefaultChannelPipeline.java:787) ~[netty-3.6.3.Final.jar:na]
    at org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:296) ~[netty-3.6.3.Final.jar:na]
    at org.jboss.netty.handler.codec.frame.FrameDecoder.unfoldAndFireMessageReceived(FrameDecoder.java:459) ~[netty-3.6.3.Final.jar:na]
    at org.jboss.netty.handler.codec.replay.ReplayingDecoder.callDecode(ReplayingDecoder.java:536) ~[netty-3.6.3.Final.jar:na]
    at org.jboss.netty.handler.codec.replay.ReplayingDecoder.messageReceived(ReplayingDecoder.java:435) ~[netty-3.6.3.Final.jar:na]
    at org.jboss.netty.channel.SimpleChannelUpstreamHandler.handleUpstream(SimpleChannelUpstreamHandler.java:70) ~[netty-3.6.3.Final.jar:na]
    at org.jboss.netty.channel.DefaultChannelPipeline.sendUpstream(DefaultChannelPipeline.java:560) ~[netty-3.6.3.Final.jar:na]
    at org.jboss.netty.channel.DefaultChannelPipeline.sendUpstream(DefaultChannelPipeline.java:555) ~[netty-3.6.3.Final.jar:na]
    at org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:268) ~[netty-3.6.3.Final.jar:na]
    at org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:255) ~[netty-3.6.3.Final.jar:na]
    at org.jboss.netty.channel.socket.nio.NioWorker.read(NioWorker.java:88) ~[netty-3.6.3.Final.jar:na]
    at org.jboss.netty.channel.socket.nio.AbstractNioWorker.process(AbstractNioWorker.java:107) ~[netty-3.6.3.Final.jar:na]
    at org.jboss.netty.channel.socket.nio.AbstractNioSelector.run(AbstractNioSelector.java:312) ~[netty-3.6.3.Final.jar:na]
    at org.jboss.netty.channel.socket.nio.AbstractNioWorker.run(AbstractNioWorker.java:88) ~[netty-3.6.3.Final.jar:na]
    at org.jboss.netty.channel.socket.nio.NioWorker.run(NioWorker.java:178) ~[netty-3.6.3.Final.jar:na]
    at org.jboss.netty.util.ThreadRenamingRunnable.run(ThreadRenamingRunnable.java:108) ~[netty-3.6.3.Final.jar:na]
    at org.jboss.netty.util.internal.DeadLockProofWorker$1.run(DeadLockProofWorker.java:42) ~[netty-3.6.3.Final.jar:na]
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) ~[na:1.7.0_25]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) ~[na:1.7.0_25]
    at java.lang.Thread.run(Thread.java:724) ~[na:1.7.0_25]
15:50:17.709 [New I/O worker #1] WARN  c.n.h.c.p.n.NettyAsyncHttpProvider - onError [id: 0x033abd61, /10.100.1.72:61509 => /10.100.0.100:8080] EXCEPTION: Connection Error 200 : Connection established
15:50:17.710 [New I/O worker #1] ERROR o.a.w.transport.WebSocketTransport - WebSocket Handshake Failed
15:50:17.710 [New I/O worker #1] DEBUG c.n.h.c.p.n.NettyAsyncHttpProvider - Closing Channel [id: 0x033abd61, /10.100.1.72:61509 => /10.100.0.100:8080] 
15:50:17.710 [New I/O worker #1] DEBUG c.n.h.c.p.n.NettyAsyncHttpProvider - Channel Closed: [id: 0x033abd61, /10.100.1.72:61509 :> /10.100.0.100:8080] with attachment com.ning.http.client.providers.netty.NettyAsyncHttpProvider$DiscardEvent@73216bf0

@jfarcand
Copy link
Member

jfarcand commented Jan 6, 2014

@Frintrop Seems your proxy doesn't support WebSocket as the status received is not 101 but 200. Is it the case?

@Frintrop
Copy link
Author

Frintrop commented Jan 6, 2014

yes ... but maybe our customers don´t know if their companies proxy support websocket or not. It would be great if in that case a failover would happen ...

@jfarcand
Copy link
Member

jfarcand commented Jan 6, 2014

Agree. Changed the title of the issue to reflect the problem.

@jfarcand
Copy link
Member

jfarcand commented Jan 7, 2014

OK released 1.2.0 today without the fix for it as I didn't have time. I will work on it and this will be fixed soon and added to 1.2.1. Thanks!

@jfarcand
Copy link
Member

jfarcand commented Feb 1, 2014

This bug was in AHC 1.7.x. Try wAsync 1.3.0-SNAPSHOT which use AHC 1.8.1 and it should work.

@jfarcand jfarcand closed this as completed Feb 1, 2014
@lwahonen
Copy link

lwahonen commented Aug 7, 2019

This still seems to happen. Reproduced easily by using Tinyproxy, which doesn't know how websockets work, and returns a 403 for all WS upgrades.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

3 participants