1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package io.netty.handler.codec.socks;
17
18 import io.netty.buffer.ByteBuf;
19 import io.netty.channel.ChannelHandlerContext;
20 import io.netty.handler.codec.ReplayingDecoder;
21 import io.netty.handler.codec.socks.SocksAuthResponseDecoder.State;
22 import io.netty.util.internal.UnstableApi;
23
24 import java.util.List;
25
26
27
28
29
30 public class SocksAuthResponseDecoder extends ReplayingDecoder<State> {
31
32 public SocksAuthResponseDecoder() {
33 super(State.CHECK_PROTOCOL_VERSION);
34 }
35
36 @Override
37 protected void decode(ChannelHandlerContext channelHandlerContext, ByteBuf byteBuf, List<Object> out)
38 throws Exception {
39 switch (state()) {
40 case CHECK_PROTOCOL_VERSION: {
41 if (byteBuf.readByte() != SocksSubnegotiationVersion.AUTH_PASSWORD.byteValue()) {
42 out.add(SocksCommonUtils.UNKNOWN_SOCKS_RESPONSE);
43 break;
44 }
45 checkpoint(State.READ_AUTH_RESPONSE);
46 }
47 case READ_AUTH_RESPONSE: {
48 SocksAuthStatus authStatus = SocksAuthStatus.valueOf(byteBuf.readByte());
49 out.add(new SocksAuthResponse(authStatus));
50 break;
51 }
52 default: {
53 throw new Error();
54 }
55 }
56 channelHandlerContext.pipeline().remove(this);
57 }
58
59 @UnstableApi
60 public enum State {
61 CHECK_PROTOCOL_VERSION,
62 READ_AUTH_RESPONSE
63 }
64 }