/* * 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.server.msg; import sockslib.common.SocksException; import java.io.IOException; import java.io.InputStream; import static sockslib.utils.StreamUtil.checkEnd; /** * The class <code>MethodSelectionMessage</code> represents a method selection message. * * @author Youchao Feng * @version 1.0 * @date Apr 5, 2015 10:47:05 AM */ public class MethodSelectionMessage implements ReadableMessage, WritableMessage { private int version; private int methodNum; private int[] methods; @Override public byte[] getBytes() { byte[] bytes = new byte[2 + methodNum]; bytes[0] = (byte) version; bytes[1] = (byte) methodNum; for (int i = 0; i < methods.length; i++) { bytes[i + 2] = (byte) methods[i]; } return bytes; } @Override public int getLength() { return getBytes().length; } @Override public void read(InputStream inputStream) throws SocksException, IOException { version = checkEnd(inputStream.read()); methodNum = checkEnd(inputStream.read()); methods = new int[methodNum]; for (int i = 0; i < methodNum; i++) { methods[i] = checkEnd(inputStream.read()); } } public int getVersion() { return version; } public void setVersion(int version) { this.version = version; } public int getMethodNum() { return methodNum; } public void setMethodNum(int methodNum) { this.methodNum = methodNum; } public int[] getMethods() { return methods; } public void setMethods(int[] methods) { this.methods = methods; } }