package com.limegroup.gnutella.handshaking; import java.util.Properties; import com.limegroup.gnutella.settings.ApplicationSettings; import com.limegroup.gnutella.statistics.HandshakingStat; /** * A very simple responder to be used by leaf-nodes during the * connection handshake while accepting incoming connections */ public final class LeafHandshakeResponder extends DefaultHandshakeResponder { /** * Creates a new instance of LeafHandshakeResponder * @param manager Instance of connection manager, managing this * connection * @param router Instance of message router, to get correct local * address at runtime. * @param host The host with whom we are handshaking */ public LeafHandshakeResponder(String host) { super(host); } /** * Responds to an outgoing connection handshake. * * @return the <tt>HandshakeResponse</tt> with the handshake * headers to send in response to the connection attempt */ protected HandshakeResponse respondToOutgoing(HandshakeResponse response) { // only connect to ultrapeers. if (!response.isUltrapeer()) { HandshakingStat.LEAF_OUTGOING_REJECT_LEAF.incrementStat(); return HandshakeResponse.createLeafRejectOutgoingResponse(); } //check if this is a preferenced connection if (getLocalePreferencing()) { /* TODO: ADD STAT HandshakingStat.LEAF_OUTGOING_REJECT_LOCALE.incrementStat(); */ if (!ApplicationSettings.LANGUAGE.getValue().equals(response.getLocalePref())) { return HandshakeResponse.createLeafRejectLocaleOutgoingResponse(); } } if (!_manager.allowConnection(response)) { HandshakingStat.LEAF_OUTGOING_REJECT_OLD_UP.incrementStat(); return HandshakeResponse.createLeafRejectOutgoingResponse(); } Properties ret = new Properties(); // might as well save a little bandwidth. if (response.isDeflateAccepted()) { ret.put(HeaderNames.CONTENT_ENCODING, HeaderNames.DEFLATE_VALUE); } HandshakingStat.LEAF_OUTGOING_ACCEPT.incrementStat(); return HandshakeResponse.createAcceptOutgoingResponse(ret); } /** * Responds to an incoming connection handshake. * * @return the <tt>HandshakeResponse</tt> with the handshake * headers to send in response to the connection attempt */ protected HandshakeResponse respondToIncoming(HandshakeResponse hr) { if (hr.isCrawler()) { HandshakingStat.INCOMING_CRAWLER.incrementStat(); return HandshakeResponse.createCrawlerResponse(); } //if not an ultrapeer, reject. if (!hr.isUltrapeer()) { HandshakingStat.LEAF_INCOMING_REJECT.incrementStat(); return HandshakeResponse.createLeafRejectOutgoingResponse(); } Properties ret = new LeafHeaders(getRemoteIP()); //If we already have enough ultrapeers, reject. if (!_manager.allowConnection(hr)) { HandshakingStat.LEAF_INCOMING_REJECT.incrementStat(); return HandshakeResponse.createLeafRejectIncomingResponse(hr); } //deflate if we can ... if (hr.isDeflateAccepted()) { ret.put(HeaderNames.CONTENT_ENCODING, HeaderNames.DEFLATE_VALUE); } HandshakingStat.LEAF_INCOMING_ACCEPT.incrementStat(); //b) We're not a leaf yet, so accept the incoming connection return HandshakeResponse.createAcceptIncomingResponse(hr, ret); } }