package com.limegroup.gnutella.handshaking;
import java.util.Properties;
import org.limewire.core.settings.ApplicationSettings;
/**
* A very simple responder to be used by leaf-nodes during the connection
* handshake while accepting incoming connections.
*/
public final class LeafHandshakeResponder extends DefaultHandshakeResponder {
private final HeadersFactory headersFactory;
private final HandshakeServices handshakeServices;
/**
* Creates a new instance of LeafHandshakeResponder.
*
* @param host the host with whom we are handshaking
*/
LeafHandshakeResponder(String host, HeadersFactory headersFactory,
HandshakeServices handshakeServices) {
super(host);
this.headersFactory = headersFactory;
this.handshakeServices = handshakeServices;
}
/**
* Responds to an outgoing connection handshake.
*
* @return the <tt>HandshakeResponse</tt> with the handshake headers to send
* in response to the connection attempt
*/
@Override
protected HandshakeResponse respondToOutgoing(HandshakeResponse response) {
// only connect to ultrapeers.
if (!response.isUltrapeer()) {
return HandshakeResponse
.createLeafRejectOutgoingResponse(HandshakeStatus.WE_ARE_LEAVES);
}
// check if this is a preferenced connection
if (getLocalePreferencing()) {
/*
* TODO: ADD STAT
* HandshakingStat.LEAF_OUTGOING_REJECT_LOCALE.incrementStat();
*/
if (!ApplicationSettings.LANGUAGE.get().equals(response.getLocalePref())) {
return HandshakeResponse.createLeafRejectLocaleOutgoingResponse();
}
}
HandshakeStatus status = handshakeServices.getHandshakeStatusForResponse(response);
if (!status.isAcceptable()) {
return HandshakeResponse.createLeafRejectOutgoingResponse(status);
}
Properties ret = new Properties();
// might as well save a little bandwidth.
if (response.isDeflateAccepted()) {
ret.put(HeaderNames.CONTENT_ENCODING, HeaderNames.DEFLATE_VALUE);
}
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
*/
@Override
protected HandshakeResponse respondToIncoming(HandshakeResponse hr) {
if (hr.isCrawler()) {
return HandshakeResponse.createCrawlerResponse(handshakeServices);
}
// if not an ultrapeer, reject.
if (!hr.isUltrapeer()) {
return HandshakeResponse
.createLeafRejectOutgoingResponse(HandshakeStatus.WE_ARE_LEAVES);
}
Properties ret = headersFactory.createLeafHeaders(getRemoteIP());
// If we already have enough ultrapeers, reject.
HandshakeStatus status = handshakeServices.getHandshakeStatusForResponse(hr);
if (!status.isAcceptable()) {
return HandshakeResponse
.createLeafRejectIncomingResponse(hr, status, handshakeServices);
}
// deflate if we can ...
if (hr.isDeflateAccepted()) {
ret.put(HeaderNames.CONTENT_ENCODING, HeaderNames.DEFLATE_VALUE);
}
// b) We're not a leaf yet, so accept the incoming connection
return HandshakeResponse.createAcceptIncomingResponse(hr, ret, handshakeServices);
}
}