blob: 76559173689d1141d6c5f6b7958ecf9546762b04 [file] [log] [blame]
/*
* 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.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.BufferedOutputStream;
import java.io.DataOutputStream;
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 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 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 username 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(boolean longOutput, String username) throws IOException
{
int read;
StringBuilder result = new StringBuilder(__buffer.length);
BufferedReader input;
input =
new BufferedReader(new InputStreamReader(getInputStream(longOutput,
username), getCharset()));
try {
while (true)
{
read = input.read(__buffer, 0, __buffer.length);
if (read <= 0) {
break;
}
result.append(__buffer, 0, read);
}
} finally {
input.close();
}
return result.toString();
}
/***
* 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(boolean longOutput) throws IOException
{
return query(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 username 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(boolean longOutput, String username)
throws IOException
{
return getInputStream(longOutput, username, 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 username 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(boolean longOutput, String username, String encoding)
throws IOException
{
DataOutputStream output;
StringBuilder buffer = new StringBuilder(64);
if (longOutput) {
buffer.append(__LONG_FLAG);
}
buffer.append(username);
buffer.append(SocketClient.NETASCII_EOL);
// Note: Charsets.toCharset() returns the platform default for null input
byte[] encodedQuery = buffer.toString().getBytes(Charsets.toCharset(encoding).name()); // Java 1.6 can use charset directly
output = new DataOutputStream(new BufferedOutputStream(_output_, 1024));
output.write(encodedQuery, 0, encodedQuery.length);
output.flush();
return _input_;
}
/***
* 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(boolean longOutput) throws IOException
{
return getInputStream(longOutput, "");
}
}