diff --git a/src/main/java/com/podio/RateLimitFilter.java b/src/main/java/com/podio/RateLimitFilter.java new file mode 100644 index 0000000..23b6005 --- /dev/null +++ b/src/main/java/com/podio/RateLimitFilter.java @@ -0,0 +1,43 @@ +package com.podio; + +import com.sun.jersey.api.client.ClientRequest; +import com.sun.jersey.api.client.ClientResponse; +import com.sun.jersey.api.client.filter.ClientFilter; +import java.util.List; +import javax.ws.rs.core.MultivaluedMap; + +public class RateLimitFilter extends ClientFilter { + + @SuppressWarnings("unchecked") + @Override + public ClientResponse handle(ClientRequest cr) { + ClientResponse response = getNext().handle(cr); + MultivaluedMap headers = response.getHeaders(); + if (headers != null) { + List limitHeader = headers.get("X-Rate-Limit-Limit"); + if (limitHeader != null && limitHeader.size() == 1) { + try { + RateLimits.setLimit(Integer.parseInt(limitHeader.get(0))); + } catch (NumberFormatException nfe) { + RateLimits.setLimit(null); + } + } else { + RateLimits.setLimit(null); + } + List remainingHeader = response.getHeaders().get("X-Rate-Limit-Remaining"); + if (remainingHeader != null && remainingHeader.size() == 1) { + try { + RateLimits.setRemaining(Integer.parseInt(remainingHeader.get(0))); + } catch (NumberFormatException nfe) { + RateLimits.setRemaining(null); + } + } else { + RateLimits.setRemaining(null); + } + } else { + RateLimits.setLimit(null); + RateLimits.setRemaining(null); + } + return response; + } +} diff --git a/src/main/java/com/podio/RateLimits.java b/src/main/java/com/podio/RateLimits.java new file mode 100644 index 0000000..b17cd92 --- /dev/null +++ b/src/main/java/com/podio/RateLimits.java @@ -0,0 +1,37 @@ +package com.podio; + +public class RateLimits { + + private static Integer limit; + private static Integer remaining; + + /** + * Returns the ceiling for the request you just made. May be null if + * there is no limit. + * + * @return the ceiling for the request you just made + */ + public static Integer getLimit() { + return limit; + } + + public static void setLimit(Integer limit) { + RateLimits.limit = limit; + } + + /** + * Returns the number of requests you have left for the current 1 hour + * window. May be null if there is no limit. + * + * @return the number of requests you have left for the current 1 hour + * window + */ + public static Integer getRemaining() { + return remaining; + } + + public static void setRemaining(Integer remaining) { + RateLimits.remaining = remaining; + } + +} diff --git a/src/main/java/com/podio/ResourceFactory.java b/src/main/java/com/podio/ResourceFactory.java index 29271f8..ddc7f0f 100644 --- a/src/main/java/com/podio/ResourceFactory.java +++ b/src/main/java/com/podio/ResourceFactory.java @@ -62,6 +62,7 @@ public ResourceFactory(String apiHostname, String fileHostname, int port, Client client = Client.create(config); client.addFilter(new GZIPContentEncodingFilter(false)); client.addFilter(new ExceptionFilter()); + client.addFilter(new RateLimitFilter()); if (dryRun) { client.addFilter(new DryRunFilter()); }