While implementing netty-handler-proxy, I realized various issues in our current socksx package. Here's the list of the modifications and their background: - Split message types into interfaces and default implementations - so that a user can implement an alternative message implementations - Use classes instead of enums when a user might want to define a new constant - so that a user can extend SOCKS5 protocol, such as: - defining a new error code - defining a new address type - Rename the message classes - to avoid abbreviated class names. e.g: - Cmd -> Command - Init -> Initial - so that the class names align better with the protocol specifications. e.g: - AuthRequest -> PasswordAuthRequest - AuthScheme -> AuthMethod - Rename the property names of the messages - so that the property names align better when the field names in the protocol specifications - Improve the decoder implementations - Give a user more control over when a decoder has to be removed - Use DecoderResult and DecoderResultProvider to handle decode failure gracefully. i.e. no more Unknown* message classes - Add SocksPortUnifinicationServerHandler since it's useful to the users who write a SOCKS server - Cleaned up and moved from the socksproxy example
65 lines
1.7 KiB
Java
Executable File
65 lines
1.7 KiB
Java
Executable File
/*
|
|
* Copyright 2013 The Netty Project
|
|
*
|
|
* The Netty Project licenses this file to you under the Apache License,
|
|
* version 2.0 (the "License"); you may not use this file except in compliance
|
|
* with the License. You may obtain a copy of the License at:
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
* License for the specific language governing permissions and limitations
|
|
* under the License.
|
|
*/
|
|
|
|
package io.netty.handler.codec.socksx;
|
|
|
|
/**
|
|
* The version of SOCKS protocol.
|
|
*/
|
|
public enum SocksVersion {
|
|
/**
|
|
* SOCKS protocol version 4a (or 4)
|
|
*/
|
|
SOCKS4a((byte) 0x04),
|
|
/**
|
|
* SOCKS protocol version 5
|
|
*/
|
|
SOCKS5((byte) 0x05),
|
|
/**
|
|
* Unknown protocol version
|
|
*/
|
|
UNKNOWN((byte) 0xff);
|
|
|
|
/**
|
|
* Returns the {@link SocksVersion} that corresponds to the specified version field value,
|
|
* as defined in the protocol specification.
|
|
*
|
|
* @return {@link #UNKNOWN} if the specified value does not represent a known SOCKS protocol version
|
|
*/
|
|
public static SocksVersion valueOf(byte b) {
|
|
if (b == SOCKS4a.byteValue()) {
|
|
return SOCKS4a;
|
|
}
|
|
if (b == SOCKS5.byteValue()) {
|
|
return SOCKS5;
|
|
}
|
|
return UNKNOWN;
|
|
}
|
|
|
|
private final byte b;
|
|
|
|
SocksVersion(byte b) {
|
|
this.b = b;
|
|
}
|
|
|
|
/**
|
|
* Returns the value of the version field, as defined in the protocol specification.
|
|
*/
|
|
public byte byteValue() {
|
|
return b;
|
|
}
|
|
}
|