FingerClient.java
- /*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF 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 org.apache.commons.net.finger;
- import java.io.BufferedOutputStream;
- import java.io.BufferedReader;
- import java.io.DataOutputStream;
- import java.io.IOException;
- import java.io.InputStream;
- import java.io.InputStreamReader;
- import org.apache.commons.net.SocketClient;
- import org.apache.commons.net.util.Charsets;
- /**
- * The FingerClient class implements the client side of the Internet Finger Protocol defined in RFC 1288. To finger a host you create a FingerClient instance,
- * connect to the host, query the host, and finally disconnect from the host. If the finger service you want to query is on a non-standard port, connect to the
- * host at that port. Here's a sample use:
- *
- * <pre>
- * FingerClient finger;
- *
- * finger = new FingerClient();
- *
- * try {
- * finger.connect("foo.bar.com");
- * System.out.println(finger.query("foobar", false));
- * finger.disconnect();
- * } catch (IOException e) {
- * System.err.println("Error I/O exception: " + e.getMessage());
- * return;
- * }
- * </pre>
- */
- public class FingerClient extends SocketClient {
- /**
- * The default FINGER port. Set to 79 according to RFC 1288.
- */
- public static final int DEFAULT_PORT = 79;
- private static final String LONG_FLAG = "/W ";
- private final transient char[] buffer = new char[1024];
- /**
- * The default FingerClient constructor. Initializes the default port to <code>DEFAULT_PORT</code>.
- */
- public FingerClient() {
- setDefaultPort(DEFAULT_PORT);
- }
- /**
- * Fingers the connected host and returns the input stream from the network connection of the finger query. This is equivalent to calling
- * getInputStream(longOutput, ""). You must first connect to a finger server before calling this method, and you should disconnect after finishing reading
- * the stream.
- *
- * @param longOutput Set to true if long output is requested, false if not.
- * @return The InputStream of the network connection of the finger query. Can be read to obtain finger results.
- * @throws IOException If an I/O error during the operation.
- */
- public InputStream getInputStream(final boolean longOutput) throws IOException {
- return getInputStream(longOutput, "");
- }
- /**
- * Fingers a user and returns the input stream from the network connection of the finger query. You must first connect to a finger server before calling
- * this method, and you should disconnect after finishing reading the stream.
- *
- * @param longOutput Set to true if long output is requested, false if not.
- * @param user The name of the user to finger.
- * @return The InputStream of the network connection of the finger query. Can be read to obtain finger results.
- * @throws IOException If an I/O error during the operation.
- */
- public InputStream getInputStream(final boolean longOutput, final String user) throws IOException {
- return getInputStream(longOutput, user, null);
- }
- /**
- * Fingers a user and returns the input stream from the network connection of the finger query. You must first connect to a finger server before calling
- * this method, and you should disconnect after finishing reading the stream.
- *
- * @param longOutput Set to true if long output is requested, false if not.
- * @param user The name of the user to finger.
- * @param encoding the character encoding that should be used for the query, null for the platform's default encoding
- * @return The InputStream of the network connection of the finger query. Can be read to obtain finger results.
- * @throws IOException If an I/O error during the operation.
- */
- public InputStream getInputStream(final boolean longOutput, final String user, final String encoding) throws IOException {
- final DataOutputStream output;
- final StringBuilder buffer = new StringBuilder(64);
- if (longOutput) {
- buffer.append(LONG_FLAG);
- }
- buffer.append(user);
- buffer.append(SocketClient.NETASCII_EOL);
- // Note: Charsets.toCharset() returns the platform default for null input
- final byte[] encodedQuery = buffer.toString().getBytes(Charsets.toCharset(encoding).name()); // Java 1.6 can use
- // charset directly
- output = new DataOutputStream(new BufferedOutputStream(checkOpenOutputStream(), 1024));
- output.write(encodedQuery, 0, encodedQuery.length);
- output.flush();
- return _input_;
- }
- /**
- * Fingers the connected host and returns the output as a String. You must first connect to a finger server before calling this method, and you should
- * disconnect afterward. This is equivalent to calling <code>query(longOutput, "")</code>.
- *
- * @param longOutput Set to true if long output is requested, false if not.
- * @return The result of the finger query.
- * @throws IOException If an I/O error occurs while reading the socket.
- */
- public String query(final boolean longOutput) throws IOException {
- return query(longOutput, "");
- }
- /**
- * Fingers a user at the connected host and returns the output as a String. You must first connect to a finger server before calling this method, and you
- * should disconnect afterward.
- *
- * @param longOutput Set to true if long output is requested, false if not.
- * @param user The name of the user to finger.
- * @return The result of the finger query.
- * @throws IOException If an I/O error occurs while reading the socket.
- */
- public String query(final boolean longOutput, final String user) throws IOException {
- int read;
- final StringBuilder result = new StringBuilder(buffer.length);
- try (final BufferedReader input = new BufferedReader(new InputStreamReader(getInputStream(longOutput, user), getCharset()))) {
- while (true) {
- read = input.read(buffer, 0, buffer.length);
- if (read <= 0) {
- break;
- }
- result.append(buffer, 0, read);
- }
- }
- return result.toString();
- }
- }