/* * Copyright 2015-2025 the original author or authors. * * Licensed 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 sockslib.common; import sockslib.server.msg.ServerReply; import java.io.IOException; /** * The class <code>SocksException</code> represents an exception about SOCKS protocol. * * @author Youchao Feng * @version 1.0 * @date Mar 18, 2015 9:24:59 AM */ public class SocksException extends IOException { /** * Serial version UID. */ private static final long serialVersionUID = 1L; private static final String NO_ACCEPTABLE_METHODS = "NO ACCEPTABLE METHODS"; /** * Messages that server will reply. */ private static final String serverReplyMessage[] = {"General SOCKS server failure", "Connection not allowed by ruleset", "Network " + "unreachable", "Host unreachable", "Connection refused", "TTL expired", "Command not " + "supported", "Address type not supported"}; /** * Reply from SOCKS server. */ private ServerReply serverReply; /** * Constructs an instance of {@link SocksException} with a message. * * @param msg Message. */ public SocksException(String msg) { super(msg); } /** * Constructs an instance of {@link SocksException} with a code. * * @param replyCode The code that server Replied. */ public SocksException(int replyCode) { } /** * Returns a {@link SocksException} instance with a message "NO ACCEPTABLE METHODS". * * @return An instance of {@link SocksException}. */ public static SocksException noAcceptableMethods() { return new SocksException(NO_ACCEPTABLE_METHODS); } /** * Returns a {@link SocksException} instance with a message "Protocol not supported". * * @return An instance of {@link SocksException}. */ public static SocksException protocolNotSupported() { return new SocksException("Protocol not supported"); } /** * Returns a {@link SocksException} instance with a message of reply. * * @param reply Server's reply. * @return An instance of {@link SocksException}. */ public static SocksException serverReplyException(ServerReply reply) { SocksException ex = serverReplyException(reply.getValue()); ex.setServerReply(reply); return ex; } /** * Returns a {@link SocksException} instance with a message of reply. * * @param reply Code of server's reply. * @return An instance of {@link SocksException}. */ public static SocksException serverReplyException(byte reply) { int code = reply; code = code & 0xff; if (code < 0 || code > 0x08) { return new SocksException("Unknown reply"); } code = code - 1; return new SocksException(serverReplyMessage[code]); } /** * Returns server's reply. * * @return Server's reply. */ public ServerReply getServerReply() { return serverReply; } /** * Sets server's reply. * * @param serverReply Reply of the server. */ public void setServerReply(ServerReply serverReply) { this.serverReply = serverReply; } }