1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package org.jboss.netty.handler.codec.socks;
17
18 import org.jboss.netty.buffer.ChannelBuffer;
19 import org.jboss.netty.channel.Channel;
20 import org.jboss.netty.channel.ChannelHandlerContext;
21 import org.jboss.netty.handler.codec.replay.ReplayingDecoder;
22
23 import java.util.ArrayList;
24 import java.util.List;
25
26
27
28
29
30 public class SocksInitRequestDecoder extends ReplayingDecoder<SocksInitRequestDecoder.State> {
31 private static final String name = "SOCKS_INIT_REQUEST_DECODER";
32
33
34
35
36 @Deprecated
37 public static String getName() {
38 return name;
39 }
40
41 private final List<SocksMessage.AuthScheme> authSchemes = new ArrayList<SocksMessage.AuthScheme>();
42 private SocksMessage.ProtocolVersion version;
43 private byte authSchemeNum;
44 private SocksRequest msg = SocksCommonUtils.UNKNOWN_SOCKS_REQUEST;
45
46 public SocksInitRequestDecoder() {
47 super(State.CHECK_PROTOCOL_VERSION);
48 }
49
50 @Override
51 protected Object decode(ChannelHandlerContext ctx, Channel channel,
52 ChannelBuffer buffer, State state) throws Exception {
53 switch (state) {
54 case CHECK_PROTOCOL_VERSION: {
55 version = SocksMessage.ProtocolVersion.fromByte(buffer.readByte());
56 if (version != SocksMessage.ProtocolVersion.SOCKS5) {
57 break;
58 }
59 checkpoint(State.READ_AUTH_SCHEMES);
60 }
61 case READ_AUTH_SCHEMES: {
62 authSchemes.clear();
63 authSchemeNum = buffer.readByte();
64 for (int i = 0; i < authSchemeNum; i++) {
65 authSchemes.add(SocksMessage.AuthScheme.fromByte(buffer.readByte()));
66 }
67 msg = new SocksInitRequest(authSchemes);
68 break;
69 }
70 }
71 ctx.getPipeline().remove(this);
72 return msg;
73 }
74
75 enum State {
76 CHECK_PROTOCOL_VERSION,
77 READ_AUTH_SCHEMES
78 }
79 }