package com.limegroup.gnutella.handshaking; import java.io.IOException; /** * Provides a servent ways to set connection handshake responses in response to * a connection handshake response just received. Note, however, incoming * connections and outgoing connections will differ in the use * of this interface. * * Outgoing connections use the interface after receiving a handshake response * from a remote host that it tried to connect to. Here is a typical anonymous * implementation of HandshakeResponder for outgoing connections: * <pre> * new HandshakeResponder() { * public HandshakeResponse respond(HandshakeResponse response, * boolean outgoing) { * //Checks for a "200 OK" response and sends a "userid" header * //otherwise, returns null. Also, checks to make sure the * //the connection is an outgoing one. * if (!outgoing) * return null; * if (response.getStatusCode() == HandshakeResponse.OK) { * Properties headers = new Properties(); * headers.setProperty("Userid", "Limewire"); * return new HandshakeResponse(headers); * } * return null; * } * } * </pre> * * Incoming connections use the interface after reading headers from a remote * host. Hence, they don't care about the status code and status response, only * the headers they received. Here is a typical anonymous implementation of * HandshakeResponder for incoming connections: *<pre> * new HandshakeResponder() { * public HandshakeResponse respond(HandshakeResponse response, * boolean outgoing) { * //first, checks to make sure the connection is an incoming one. * //Also, checks for a "userid" header and if not sets the * //"Authorization" header and appropriate status code. * if (outgoing) * return null; * Properties read = response.getHeaders(); * if (read.getProperty("userid")== null) { * Properties headers = new Properties(); * headers.setProperty("Authorization", "needed"); * return new HandshakeResponse(401, "Unauthorized", headers); * } * //return "200 OK" with no headers * return new HandshakeResponse(); * } * } * </pre> * */ public interface HandshakeResponder { /** * Returns the corresponding handshake to be written to the remote host when * responding to the connection handshake response just received. * Implementations should respond differently to incoming vs. outgoing * connections. * @param response The response received from the host on the * other side of teh connection. * @param outgoing whether the connection to the remote host is an outgoing * connection. */ public HandshakeResponse respond(HandshakeResponse response, boolean outgoing); /** * optional method. * note: should this throw an UnsupportedOperationException */ public void setLocalePreferencing(boolean b); }