Skip to content

Commit

Permalink
Merge pull request #433 from vinamogit/fix-npe-toomanyrequests
Browse files Browse the repository at this point in the history
Avoid to have unexpected exception on status code 429 TooManyRequests
  • Loading branch information
Ifropc authored May 1, 2023
2 parents 3dd63dc + 22d8d55 commit 9444976
Show file tree
Hide file tree
Showing 3 changed files with 84 additions and 9 deletions.
13 changes: 9 additions & 4 deletions src/main/java/org/stellar/sdk/requests/ResponseHandler.java
Original file line number Diff line number Diff line change
@@ -1,14 +1,12 @@
package org.stellar.sdk.requests;

import com.google.gson.reflect.TypeToken;

import okhttp3.Response;
import org.stellar.sdk.responses.GsonSingleton;
import org.stellar.sdk.responses.TypedResponse;

import java.io.IOException;

import okhttp3.Response;

public class ResponseHandler<T> {

private TypeToken<T> type;
Expand All @@ -28,7 +26,14 @@ public T handleResponse(final Response response) throws IOException, TooManyRequ
try {
// Too Many Requests
if (response.code() == 429) {
int retryAfter = Integer.parseInt(response.header("Retry-After"));

Integer retryAfter = null;
String header = response.header("Retry-After");
if (header != null) {
try {
retryAfter = Integer.parseInt(header);
} catch (NumberFormatException ignored) {}
}
throw new TooManyRequestsException(retryAfter);
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,21 +1,25 @@
package org.stellar.sdk.requests;


import com.google.common.base.Optional;

/**
* Exception thrown when too many requests were sent to the Horizon server.
* @see <a href="https://developers.stellar.org/api/introduction/rate-limiting/" target="_blank">Rate Limiting</a>
*/
public class TooManyRequestsException extends RuntimeException {
private int retryAfter;
private Integer retryAfter;

public TooManyRequestsException(int retryAfter) {
public TooManyRequestsException(Integer retryAfter) {
super("The rate limit for the requesting IP address is over its alloted limit.");
this.retryAfter = retryAfter;
}

/**
* Returns number of seconds a client should wait before sending requests again.
* Returns number of seconds a client should wait before sending requests again,
* or -1 this time is unknown.
*/
public int getRetryAfter() {
return retryAfter;
public Optional<Integer> getRetryAfter() {
return Optional.fromNullable(retryAfter);
}
}
66 changes: 66 additions & 0 deletions src/test/java/org/stellar/sdk/requests/ResponseHandlerTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
package org.stellar.sdk.requests;

import static org.junit.Assert.assertEquals;

import java.io.IOException;

import com.google.common.base.Optional;
import org.junit.Assert;
import org.junit.Test;

import okhttp3.OkHttpClient;
import okhttp3.mockwebserver.MockResponse;
import okhttp3.mockwebserver.MockWebServer;

public class ResponseHandlerTest {

@Test
public void testTooManyRequests() throws IOException, InterruptedException {

MockResponse response = new MockResponse();
response.setResponseCode(429);
response.setHeader("Retry-After", "10");

MockWebServer mockWebServer = new MockWebServer();
mockWebServer.start();
mockWebServer.enqueue(response);

OkHttpClient okHttpClient = new OkHttpClient().newBuilder().build();
try {

AccountsRequestBuilder.execute(okHttpClient, mockWebServer.url("/"));
Assert.fail();
} catch (TooManyRequestsException tmre) {
assertEquals(Optional.of(10), tmre.getRetryAfter());
} finally {

mockWebServer.shutdown();
mockWebServer.close();
}
}

@Test
public void testTooManyRequestsNoHeader() throws IOException, InterruptedException {

MockResponse response = new MockResponse();
response.setResponseCode(429);

MockWebServer mockWebServer = new MockWebServer();

mockWebServer.start();
mockWebServer.enqueue(response);

OkHttpClient okHttpClient = new OkHttpClient().newBuilder().build();

try {
AccountsRequestBuilder.execute(okHttpClient, mockWebServer.url("/"));
Assert.fail();
} catch (TooManyRequestsException tmre) {
assertEquals(Optional.absent(), tmre.getRetryAfter());
} finally {

mockWebServer.shutdown();
mockWebServer.close();
}
}
}

0 comments on commit 9444976

Please sign in to comment.