package com.limegroup.gnutella; import java.util.HashSet; import java.util.Set; import org.limewire.logging.Log; import org.limewire.logging.LogFactory; /** * Keeps track of requests sent by a client. */ public class RequestCache { @SuppressWarnings("unused") private static final Log LOG = LogFactory.getLog(RequestCache.class); // we don't allow more than 1 request per 5 seconds private static final double MAX_REQUESTS = 5 * 1000; // time to wait before checking for hammering: 30 seconds. // if the averge number of requests per time frame exceeds MAX_REQUESTS // after FIRST_CHECK_TIME, the downloader will be banned. static long FIRST_CHECK_TIME = 30 * 1000; /** * The set of sha1 requests we've seen in the past WAIT_TIME. */ private final Set<URN> ACTIVE_TRANSFERS; /** * The number of requests we've seen from this host so far. */ private double _numRequests; /** * The time of the last request. */ private long _lastRequest; /** * The time of the first request. */ private long _firstRequest; /** * Constructs a new RequestCache. */ public RequestCache() { ACTIVE_TRANSFERS = new HashSet<URN>(); _numRequests = 0; _lastRequest = _firstRequest = System.currentTimeMillis(); } /** * Tells the cache that an upload to the host has started. * * @param sha1 the urn of the file being uploaded. */ void startedTransfer(URN sha1) { ACTIVE_TRANSFERS.add(sha1); } /** * Determines whether or not the host is hammering. */ boolean isHammering() { if (_lastRequest - _firstRequest <= FIRST_CHECK_TIME) { return false; } else { return ((_lastRequest - _firstRequest) / _numRequests) < MAX_REQUESTS; } } /** * Adds a new request. */ void countRequest() { _numRequests++; _lastRequest = System.currentTimeMillis(); } /** * Checks whether the given URN is a duplicate request */ boolean isDupe(URN sha1) { return ACTIVE_TRANSFERS.contains(sha1); } /** * Informs the request cache that the given URN is no longer actively * uploaded. */ void transferDone(URN sha1) { ACTIVE_TRANSFERS.remove(sha1); } }