package com.limegroup.gnutella.messagehandlers;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import org.limewire.collection.FixedSizeExpiringSet;
import org.limewire.core.settings.FilterSettings;
import org.limewire.io.NetworkInstanceUtils;
import com.google.inject.Inject;
import com.limegroup.gnutella.NetworkManager;
import com.limegroup.gnutella.ReplyHandler;
import com.limegroup.gnutella.UDPReplyHandlerFactory;
import com.limegroup.gnutella.messages.Message;
import com.limegroup.gnutella.messages.vendor.UDPCrawlerPing;
import com.limegroup.gnutella.messages.vendor.UDPCrawlerPong;
import com.limegroup.gnutella.messages.vendor.UDPCrawlerPongFactory;
import com.limegroup.gnutella.simpp.SimppManager;
public class UDPCrawlerPingHandler extends RestrictedResponder {
/**
* keeps a list of the people who have requested our connection lists.
* used to make sure we don't get ping-flooded.
* not final so that tests won't take forever.
*/
private FixedSizeExpiringSet<InetAddress> _UDPListRequestors
= new FixedSizeExpiringSet<InetAddress>(2000, 10*60 * 1000); //10 minutes.
private final UDPCrawlerPongFactory udpCrawlerPongFactory;
@Inject
public UDPCrawlerPingHandler(NetworkManager networkManager,
SimppManager simppManager,
UDPReplyHandlerFactory udpReplyHandlerFactory,
UDPCrawlerPongFactory udpCrawlerPongFactory,
NetworkInstanceUtils networkInstanceUtils) {
super(FilterSettings.CRAWLER_IP_ADDRESSES, networkManager, simppManager,
udpReplyHandlerFactory, null, networkInstanceUtils);
this.udpCrawlerPongFactory = udpCrawlerPongFactory;
}
@Override
protected void processAllowedMessage(Message msg, InetSocketAddress addr, ReplyHandler handler) {
assert msg instanceof UDPCrawlerPing;
if (!_UDPListRequestors.add(handler.getInetAddress()))
return;
UDPCrawlerPong pong = udpCrawlerPongFactory.createUDPCrawlerPong((UDPCrawlerPing)msg);
handler.reply(pong);
}
}