From ed4e37ba9f9e8c0c6b699aa6e1cf05547b95d6bc Mon Sep 17 00:00:00 2001 From: Ivo van Dongen Date: Fri, 2 Sep 2016 17:36:23 +0200 Subject: [PATCH] [android] HttpFileSource - rate limit --- .../com/mapbox/mapboxsdk/http/HTTPRequest.java | 11 +++++++++-- platform/android/src/http_file_source.cpp | 18 ++++++++++++++++-- platform/android/src/jni.cpp | 3 +++ 3 files changed, 28 insertions(+), 4 deletions(-) diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/http/HTTPRequest.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/http/HTTPRequest.java index accdbec40..7655d2fbb 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/http/HTTPRequest.java +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/http/HTTPRequest.java @@ -43,7 +43,7 @@ class HTTPRequest implements Callback { private native void nativeOnFailure(int type, String message); - private native void nativeOnResponse(int code, String etag, String modified, String cacheControl, String expires, byte[] body); + private native void nativeOnResponse(int code, String etag, String modified, String cacheControl, String expires, String retryAfter, String xRateLimitReset, byte[] body); private HTTPRequest(long nativePtr, String resourceUrl, String userAgent, String etag, String modified) { mNativePtr = nativePtr; @@ -120,7 +120,14 @@ class HTTPRequest implements Callback { mLock.lock(); if (mNativePtr != 0) { - nativeOnResponse(response.code(), response.header("ETag"), response.header("Last-Modified"), response.header("Cache-Control"), response.header("Expires"), body); + nativeOnResponse(response.code(), + response.header("ETag"), + response.header("Last-Modified"), + response.header("Cache-Control"), + response.header("Expires"), + response.header("Retry-After"), + response.header("x-rate-limit-reset"), + body); } mLock.unlock(); } diff --git a/platform/android/src/http_file_source.cpp b/platform/android/src/http_file_source.cpp index 97ccdb14b..00b61aa10 100644 --- a/platform/android/src/http_file_source.cpp +++ b/platform/android/src/http_file_source.cpp @@ -29,6 +29,7 @@ public: void onResponse(jni::JNIEnv&, int code, jni::String etag, jni::String modified, jni::String cacheControl, jni::String expires, + jni::String retryAfter, jni::String xRateLimitReset, jni::Array body); static jni::Class javaClass; @@ -101,8 +102,11 @@ HTTPRequest::~HTTPRequest() { } void HTTPRequest::onResponse(jni::JNIEnv& env, int code, - jni::String etag, jni::String modified, jni::String cacheControl, - jni::String expires, jni::Array body) { + jni::String etag, jni::String modified, + jni::String cacheControl, jni::String expires, + jni::String jRetryAfter, jni::String jXRateLimitReset, + jni::Array body) { + using Error = Response::Error; if (etag) { @@ -135,6 +139,16 @@ void HTTPRequest::onResponse(jni::JNIEnv& env, int code, response.notModified = true; } else if (code == 404) { response.error = std::make_unique(Error::Reason::NotFound, "HTTP status code 404"); + } else if (code == 429) { + optional retryAfter; + optional xRateLimitReset; + if (jRetryAfter) { + retryAfter = jni::Make(env, jRetryAfter); + } + if (jXRateLimitReset) { + xRateLimitReset = jni::Make(env, jXRateLimitReset); + } + response.error = std::make_unique(Error::Reason::RateLimit, "HTTP status code 429", http::parseRetryHeaders(retryAfter, xRateLimitReset)); } else if (code >= 500 && code < 600) { response.error = std::make_unique(Error::Reason::Server, std::string{ "HTTP status code " } + std::to_string(code)); } else { diff --git a/platform/android/src/jni.cpp b/platform/android/src/jni.cpp index c0e4665de..5f136595a 100755 --- a/platform/android/src/jni.cpp +++ b/platform/android/src/jni.cpp @@ -1508,6 +1508,9 @@ void setOfflineRegionObserver(JNIEnv *env, jni::jobject* offlineRegion_, jni::jo case mbgl::Response::Error::Reason::Connection: errorReason = "REASON_CONNECTION"; break; + case mbgl::Response::Error::Reason::RateLimit: + errorReason = "REASON_RATE_LIMIT"; + break; case mbgl::Response::Error::Reason::Other: errorReason = "REASON_OTHER"; break;