1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package io.netty.handler.codec.http.websocketx;
17
18 import io.netty.channel.ChannelFuture;
19 import io.netty.channel.ChannelFutureListener;
20 import io.netty.channel.ChannelHandlerContext;
21 import io.netty.channel.ChannelInboundHandlerAdapter;
22 import io.netty.handler.codec.http.FullHttpResponse;
23
24 class WebSocketClientProtocolHandshakeHandler extends ChannelInboundHandlerAdapter {
25 private final WebSocketClientHandshaker handshaker;
26
27 WebSocketClientProtocolHandshakeHandler(WebSocketClientHandshaker handshaker) {
28 this.handshaker = handshaker;
29 }
30
31 @Override
32 public void channelActive(final ChannelHandlerContext ctx) throws Exception {
33 super.channelActive(ctx);
34 handshaker.handshake(ctx.channel()).addListener(new ChannelFutureListener() {
35 @Override
36 public void operationComplete(ChannelFuture future) throws Exception {
37 if (!future.isSuccess()) {
38 ctx.fireExceptionCaught(future.cause());
39 } else {
40 ctx.fireUserEventTriggered(
41 WebSocketClientProtocolHandler.ClientHandshakeStateEvent.HANDSHAKE_ISSUED);
42 }
43 }
44 });
45 }
46
47 @Override
48 public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
49 if (!(msg instanceof FullHttpResponse)) {
50 ctx.fireChannelRead(msg);
51 return;
52 }
53
54 FullHttpResponse response = (FullHttpResponse) msg;
55 try {
56 if (!handshaker.isHandshakeComplete()) {
57 handshaker.finishHandshake(ctx.channel(), response);
58 ctx.fireUserEventTriggered(
59 WebSocketClientProtocolHandler.ClientHandshakeStateEvent.HANDSHAKE_COMPLETE);
60 ctx.pipeline().remove(this);
61 return;
62 }
63 throw new IllegalStateException("WebSocketClientHandshaker should have been non finished yet");
64 } finally {
65 response.release();
66 }
67 }
68 }