Skip to content

Commit 28565d5

Browse files
authored
Read rate limiter delay from response headers. (#34)
* Read rate limiter delay from response headers. * Renamed rate limiting delay header Added @SInCE to javadoc
1 parent 71f3484 commit 28565d5

File tree

4 files changed

+41
-0
lines changed

4 files changed

+41
-0
lines changed

driver/src/main/java/oracle/nosql/driver/http/Client.java

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import static oracle.nosql.driver.util.HttpConstants.NOSQL_DATA_PATH;
2626
import static oracle.nosql.driver.util.HttpConstants.REQUEST_ID_HEADER;
2727
import static oracle.nosql.driver.util.HttpConstants.USER_AGENT;
28+
import static oracle.nosql.driver.util.HttpConstants.X_RATELIMIT_DELAY;
2829
import static oracle.nosql.driver.util.LogUtil.isLoggable;
2930
import static oracle.nosql.driver.util.LogUtil.logFine;
3031
import static oracle.nosql.driver.util.LogUtil.logInfo;
@@ -644,6 +645,8 @@ public Result execute(Request kvRequest) {
644645
responseHandler.getHeaders(),
645646
wireContent,
646647
kvRequest);
648+
rateDelayedMs += getRateDelayedFromHeader(
649+
responseHandler.getHeaders());
647650
int resSize = wireContent.readerIndex();
648651
networkLatency = System.currentTimeMillis() - networkLatency;
649652

@@ -1620,4 +1623,25 @@ private SerializerFactory chooseFactory(Request rq) {
16201623
private String getSerdeVersion(Request rq) {
16211624
return chooseFactory(rq).getSerdeVersionString();
16221625
}
1626+
1627+
/*
1628+
* If the response has a header indicating the amount of time the
1629+
* server side delayed the request due to rate limiting, return that
1630+
* value (in milliseconds).
1631+
*/
1632+
private int getRateDelayedFromHeader(HttpHeaders headers) {
1633+
if (headers == null) {
1634+
return 0;
1635+
}
1636+
String v = headers.get(X_RATELIMIT_DELAY);
1637+
if (v == null || v.isEmpty()) {
1638+
return 0;
1639+
}
1640+
try {
1641+
return Integer.parseInt(v);
1642+
} catch (Exception e) {
1643+
}
1644+
1645+
return 0;
1646+
}
16231647
}

driver/src/main/java/oracle/nosql/driver/ops/Request.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -423,6 +423,16 @@ public void setRateLimitDelayedMs(int rateLimitDelayedMs) {
423423
this.rateLimitDelayedMs = rateLimitDelayedMs;
424424
}
425425

426+
/**
427+
* Get the time the operation was delayed due to rate limiting.
428+
* Cloud only.
429+
* If rate limiting is in place, this value will represent the number of
430+
* milliseconds that the operation was delayed due to rate limiting.
431+
* If the value is zero, rate limiting did not apply or the operation
432+
* did not need to wait for rate limiting.
433+
* @return delay time in milliseconds
434+
* @since 5.2.25
435+
*/
426436
public int getRateLimitDelayedMs() {
427437
return rateLimitDelayedMs;
428438
}

driver/src/main/java/oracle/nosql/driver/ops/Result.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@ public int getWriteUnitsInternal() {
7979
* If the value is zero, rate limiting did not apply or the operation
8080
* did not need to wait for rate limiting.
8181
* @return delay time in milliseconds
82+
* @since 5.2.25
8283
*/
8384
public int getRateLimitDelayedMs() {
8485
return rateLimitDelayedMs;

driver/src/main/java/oracle/nosql/driver/util/HttpConstants.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,12 @@ public class HttpConstants {
128128

129129
public static final String userAgent = makeUserAgent();
130130

131+
/*
132+
* If present, the amount of time the request was delayed due to
133+
* rate limiting (in milliseconds).
134+
*/
135+
public static final String X_RATELIMIT_DELAY = "X-Nosql-RL-Delay-Ms";
136+
131137
/*
132138
* Path Components
133139
*/

0 commit comments

Comments
 (0)