/* * Copyright 1999-2006 University of Chicago * * 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 org.dcache.ftp.client; /** * Utility class for parsing and converting host-port information from EPSV * and EPRT ftp commands. */ public class HostPort6 extends HostPort { public static final String IPv4 = "1"; public static final String IPv6 = "2"; private String host; private int port; private String version; public HostPort6(String version, String host, int port) { this.version = version; this.host = host; this.port = port; } /** * Parses host-port from passive mode reply message. * Note that the argument is not the whole message, but * only the content of the brackets: * <d><net-prt><d><net-addr><d><tcp-port><d> * * @param passiveReplyMessage reply message for the EPSV command */ public HostPort6(String passiveReplyMessage) { Parser tokens = new Parser(passiveReplyMessage); String token = null; token = tokens.nextToken().trim(); if (token.length() == 0) { // do nothing assume the same as control channel } else if (token.equals(IPv4)) { this.version = IPv4; } else if (token.equals(IPv6)) { this.version = IPv6; } else { throw new IllegalArgumentException("Invalid network protocol: " + token); } token = tokens.nextToken().trim(); if (token.length() == 0) { // do nothing assume the same as control channel } else { this.host = token; } token = tokens.nextToken().trim(); if (token.length() == 0) { throw new IllegalArgumentException("Port number is required"); } this.port = Integer.parseInt(token); } private static class Parser { final String line; int offset = 0; public Parser(String line) { this.line = line; } public String nextToken() { int start = line.indexOf('|', this.offset); if (start == -1) { throw new IllegalArgumentException("Formatting error"); } int end = line.indexOf('|', start + 1); if (end == -1) { throw new IllegalArgumentException("Formatting error"); } this.offset = end; return line.substring(start + 1, end); } } /** * Returns the port number * * @return port number */ @Override public int getPort() { return this.port; } /** * Sets the host address * * @param host the host address */ public void setHost(String host) { this.host = host; } /** * Returns the host address * * @return host address */ @Override public String getHost() { return this.host; } /** * Returns the address version * * @return address version */ public String getVersion() { return this.version; } /** * Sets the address version * * @param version the address version */ public void setVersion(String version) { this.version = version; } /** * Returns the host-port information in the * format used by EPRT command. * <d><net-prt><d><net-addr><d><tcp-port><d> * * @return host-port information in EPRT command * representation. */ @Override public String toFtpCmdArgument() { StringBuilder msg = new StringBuilder(); msg.append("|"); if (this.version != null) { msg.append(this.version); } msg.append("|"); if (this.host != null) { msg.append(this.host); } msg.append("|"); msg.append(String.valueOf(this.port)); msg.append("|"); return msg.toString(); } public static String getIPAddressVersion(String address) { return (address.indexOf(':') == -1) ? IPv4 : IPv6; } }