handle rate limiting by NewMotion API

This commit is contained in:
johan12345
2020-09-20 23:02:23 +02:00
parent e875e0ee42
commit 40503b6bd2
3 changed files with 36 additions and 0 deletions

View File

@@ -0,0 +1,33 @@
package net.vonforst.evmap.api
import com.google.common.util.concurrent.RateLimiter
import okhttp3.Interceptor
import okhttp3.Response
class RateLimitInterceptor : Interceptor {
private val rateLimiter = RateLimiter.create(3.0)
override fun intercept(chain: Interceptor.Chain): Response {
val request = chain.request()
if (request.url.host == "my.newmotion.com") {
// limit requests sent to NewMotion to 3 per second
rateLimiter.acquire(1)
var response: Response = chain.proceed(request)
// 403 is how the NewMotion API indicates a rate limit error
if (!response.isSuccessful && response.code == 403) {
response.close()
// wait & retry
try {
Thread.sleep(1000)
} catch (e: InterruptedException) {
}
response = chain.proceed(request)
}
return response
} else {
return chain.proceed(request)
}
}
}

View File

@@ -3,6 +3,7 @@ package net.vonforst.evmap.api.availability
import com.facebook.stetho.okhttp3.StethoInterceptor
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
import net.vonforst.evmap.api.RateLimitInterceptor
import net.vonforst.evmap.api.await
import net.vonforst.evmap.api.goingelectric.ChargeLocation
import net.vonforst.evmap.api.goingelectric.Chargepoint
@@ -123,6 +124,7 @@ private val cookieManager = CookieManager().apply {
}
private val okhttp = OkHttpClient.Builder()
.addInterceptor(RateLimitInterceptor())
.addNetworkInterceptor(StethoInterceptor())
.readTimeout(10, TimeUnit.SECONDS)
.connectTimeout(10, TimeUnit.SECONDS)