1. import java.util.HashMap;
  2. import java.util.Map;
  3. import java.util.concurrent.ConcurrentHashMap;
  4. import java.util.concurrent.atomic.AtomicInteger;
  5. public class RequestHeaderTracker {
  6. private final Map<String, AtomicInteger> headerCounts = new ConcurrentHashMap<>(); // Track header counts
  7. private final long rateLimit; // Define the rate limit
  8. private final long windowMs; // Define the time window for rate limiting
  9. public RequestHeaderTracker(long rateLimit, long windowMs) {
  10. this.rateLimit = rateLimit;
  11. this.windowMs = windowMs;
  12. }
  13. public boolean allowRequest(String requestId, Map<String, String> headers) {
  14. // Iterate over the request headers
  15. for (String header : headers.keySet()) {
  16. // Get the current count for the header
  17. AtomicInteger count = headerCounts.get(header);
  18. if (count == null) {
  19. count = new AtomicInteger(0); // Initialize if header not seen before
  20. }
  21. // Check if the header exceeds the rate limit
  22. if (count.getAndIncrement() > rateLimit) {
  23. return false; // Rate limit exceeded
  24. }
  25. }
  26. return true; // Request allowed
  27. }
  28. public void resetHeaderCounts() {
  29. headerCounts.clear(); // Reset counts after a period
  30. }
  31. public static void main(String[] args) {
  32. RequestHeaderTracker tracker = new RequestHeaderTracker(5, 60000); // Rate limit 5 per minute
  33. // Example usage
  34. for (int i = 0; i < 10; i++) {
  35. Map<String, String> headers = new HashMap<>();
  36. headers.put("X-Request-ID", "123");
  37. headers.put("X-Custom-Header", "value");
  38. if (tracker.allowRequest("req-" + i, headers)) {
  39. System.out.println("Request " + i + " allowed");
  40. } else {
  41. System.out.println("Request " + i + " rate limited");
  42. }
  43. }
  44. tracker.resetHeaderCounts();
  45. }
  46. }

Add your comment