import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicInteger;
public class RequestHeaderTracker {
private final Map<String, AtomicInteger> headerCounts = new ConcurrentHashMap<>(); // Track header counts
private final long rateLimit; // Define the rate limit
private final long windowMs; // Define the time window for rate limiting
public RequestHeaderTracker(long rateLimit, long windowMs) {
this.rateLimit = rateLimit;
this.windowMs = windowMs;
}
public boolean allowRequest(String requestId, Map<String, String> headers) {
// Iterate over the request headers
for (String header : headers.keySet()) {
// Get the current count for the header
AtomicInteger count = headerCounts.get(header);
if (count == null) {
count = new AtomicInteger(0); // Initialize if header not seen before
}
// Check if the header exceeds the rate limit
if (count.getAndIncrement() > rateLimit) {
return false; // Rate limit exceeded
}
}
return true; // Request allowed
}
public void resetHeaderCounts() {
headerCounts.clear(); // Reset counts after a period
}
public static void main(String[] args) {
RequestHeaderTracker tracker = new RequestHeaderTracker(5, 60000); // Rate limit 5 per minute
// Example usage
for (int i = 0; i < 10; i++) {
Map<String, String> headers = new HashMap<>();
headers.put("X-Request-ID", "123");
headers.put("X-Custom-Header", "value");
if (tracker.allowRequest("req-" + i, headers)) {
System.out.println("Request " + i + " allowed");
} else {
System.out.println("Request " + i + " rate limited");
}
}
tracker.resetHeaderCounts();
}
}
Add your comment