2017-02-02 11 views
1

Я пытаюсь установить связь через веб-сокет за своим корпоративным прокси. Я вижу, что прокси-соединение между моим прокси-сервером и удаленным хостом установлено и возвращает ответ на установление связи. После этого, когда я пытаюсь отправить сообщение, я получаю исключение.Кадр данных CorruptedFrameException с использованием зарезервированного кода операции 7

Вот мой канал инициализации

Bootstrap b = new Bootstrap(); 
     b.group(group).channel(NioSocketChannel.class).handler(new ChannelInitializer<SocketChannel>() { 
      @Override 
      protected void initChannel(SocketChannel ch) { 
       ChannelPipeline p = ch.pipeline(); 

       if (sslCtx != null) { 
        p.addFirst("ssl", sslCtx.newHandler(ch.alloc(), host, port)); 
       } 
       if(proxyHandler != null){ 
        p.addFirst("proxyHandler", proxyHandler); 

       } 
       p.addLast(new LoggingHandler(LogLevel.DEBUG)); 
       p.addLast("clientCodec", new HttpClientCodec()); 

       p.addLast("decoder", new HttpRequestDecoder()); 
       p.addLast("aggregator", new HttpObjectAggregator(65536)); 
       p.addLast("encoder", new HttpResponseEncoder()); 
       p.addLast(handler); 


      } 
     }); 

И исключение

io.netty.handler.codec.CorruptedFrameException: data frame using reserved opcode 7 
    at io.netty.handler.codec.http.websocketx.WebSocket08FrameDecoder.protocolViolation(WebSocket08FrameDecoder.java:412) 
    at io.netty.handler.codec.http.websocketx.WebSocket08FrameDecoder.decode(WebSocket08FrameDecoder.java:229) 
    at io.netty.handler.codec.ByteToMessageDecoder.callDecode(ByteToMessageDecoder.java:411) 
    at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:248) 
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:373) 
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:359) 
    at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:351) 
    at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1334) 
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:373) 
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:359) 
    at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:926) 
    at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:129) 
    at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:651) 
    at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:574) 
    at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:488) 
    at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:450) 
    at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:873) 
    at io.netty.util.concurrent.DefaultThreadFactory$DefaultRunnableDecorator.run(DefaultThreadFactory.java:144) 
    at java.lang.Thread.run(Thread.java:745) 
WebSocket Client 
disconnected! 

ответ

0

Я столкнулся с той же проблемой и обнаружили, что эта проблема возникает в результате WebSocket как описано здесь: WebSocket upgrade wrecks HttpProxyHandler. Оставляя записку, если у кого-то такая же проблема.

Важная часть цитировала:

Краткая история: WebSocketClientHandshaker реорганизует трубопровод после получения обновления с сервера. Если в конвейере есть HttpProxyHandler , он установил свой собственный HttpClientCodec, который получает , поврежденный WebSocketClientHandshaker.

HttpClientCodec#0  <-- #finishHandshake hit this one. 
ws-decoder    <-- We don't want this here. 
ws-encoder    <-- We don't want this here. 
Http11ProxyHandler#0 
SslHandler#0 
HttpClientCodec#1 
         <-- ws-xxcoder should appear here. 
DownendChannelHandler#0 <-- My own stuff. 

Кажется, нет фикса еще так один, возможно, придется взломать WebSocketClientHandshaker или разместить ссылки рода обходного пути.