This is an automated email from the ASF dual-hosted git repository.
toulmean pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/incubator-tuweni.git
The following commit(s) were added to refs/heads/main by this push:
new f752636 add caching handler
new a49cab1 Merge pull request #329 from atoulme/caching_handler
f752636 is described below
commit f7526364efafc7ff93baeb0f57100ff46be217c7
Author: Antoine Toulme <[email protected]>
AuthorDate: Fri Jul 30 21:41:50 2021 -0700
add caching handler
---
jsonrpc/build.gradle | 1 +
.../tuweni/jsonrpc/methods/MethodsHandler.kt | 38 ++++++++++++++++++++--
.../tuweni/jsonrpc/methods/MethodsHandlerTest.kt | 26 +++++++++++++++
3 files changed, 62 insertions(+), 3 deletions(-)
diff --git a/jsonrpc/build.gradle b/jsonrpc/build.gradle
index e09379c..e56512f 100644
--- a/jsonrpc/build.gradle
+++ b/jsonrpc/build.gradle
@@ -30,6 +30,7 @@ dependencies {
implementation project(':crypto')
implementation project(':concurrent')
implementation project(':eth')
+ implementation project(':kv')
implementation project(':net')
implementation project(':units')
diff --git
a/jsonrpc/src/main/kotlin/org/apache/tuweni/jsonrpc/methods/MethodsHandler.kt
b/jsonrpc/src/main/kotlin/org/apache/tuweni/jsonrpc/methods/MethodsHandler.kt
index 30fb39d..81cd4a0 100644
---
a/jsonrpc/src/main/kotlin/org/apache/tuweni/jsonrpc/methods/MethodsHandler.kt
+++
b/jsonrpc/src/main/kotlin/org/apache/tuweni/jsonrpc/methods/MethodsHandler.kt
@@ -20,11 +20,13 @@ import com.netflix.concurrency.limits.limit.FixedLimit
import com.netflix.concurrency.limits.limiter.SimpleLimiter
import io.opentelemetry.api.metrics.LongCounter
import io.opentelemetry.api.metrics.common.Labels
+import kotlinx.coroutines.runBlocking
import org.apache.tuweni.eth.JSONRPCRequest
import org.apache.tuweni.eth.JSONRPCResponse
import org.apache.tuweni.eth.methodNotEnabled
import org.apache.tuweni.eth.methodNotFound
import org.apache.tuweni.eth.tooManyRequests
+import org.apache.tuweni.kv.KeyValueStore
class MethodsRouter(val methodsMap: Map<String, (JSONRPCRequest) ->
JSONRPCResponse>) {
@@ -93,6 +95,36 @@ class ThrottlingHandler(private val threshold: Int, private
val delegateHandler:
}
}
-// TODO DelegateHandler - choose from a number of handlers to see which to
delegate to.
-// TODO FilterHandler - filter incoming requests per allowlist
-// TODO CachingHandler - cache some incoming requests
+class CachingHandler(private val allowedMethods: List<String>, private val
cacheStore: KeyValueStore<String, JSONRPCResponse>, private val
delegateHandler: (JSONRPCRequest) -> JSONRPCResponse) {
+
+ fun handleRequest(request: JSONRPCRequest): JSONRPCResponse {
+ var found = false
+ for (method in allowedMethods) {
+ if (request.method.startsWith(method)) {
+ found = true
+ break
+ }
+ }
+ if (!found) {
+ return delegateHandler(request)
+ } else {
+ val serializedRequest = serializeRequest(request)
+ return runBlocking {
+ var response = cacheStore.get(serializedRequest)
+ if (response == null) {
+ response = delegateHandler(request)
+ if (response.error == null) {
+ cacheStore.put(serializedRequest, response)
+ }
+ response
+ } else {
+ return@runBlocking response.copy(id = request.id)
+ }
+ }
+ }
+ }
+
+ private fun serializeRequest(request: JSONRPCRequest): String {
+ return request.method + "|" + request.params.joinToString(",")
+ }
+}
diff --git
a/jsonrpc/src/test/kotlin/org/apache/tuweni/jsonrpc/methods/MethodsHandlerTest.kt
b/jsonrpc/src/test/kotlin/org/apache/tuweni/jsonrpc/methods/MethodsHandlerTest.kt
index 9441a10..69fb2a5 100644
---
a/jsonrpc/src/test/kotlin/org/apache/tuweni/jsonrpc/methods/MethodsHandlerTest.kt
+++
b/jsonrpc/src/test/kotlin/org/apache/tuweni/jsonrpc/methods/MethodsHandlerTest.kt
@@ -28,6 +28,7 @@ import org.apache.tuweni.eth.JSONRPCRequest
import org.apache.tuweni.eth.JSONRPCResponse
import org.apache.tuweni.eth.methodNotFound
import org.apache.tuweni.junit.BouncyCastleExtension
+import org.apache.tuweni.kv.MapKeyValueStore
import org.junit.jupiter.api.Assertions.assertEquals
import org.junit.jupiter.api.Assertions.assertNotNull
import org.junit.jupiter.api.Assertions.assertNull
@@ -165,3 +166,28 @@ class ThrottlingHandlerTest {
}
}
}
+
+class CachingHandlerTest {
+
+ @Test
+ fun testCache() {
+ val map = HashMap<String, JSONRPCResponse>()
+ val kv = MapKeyValueStore.open(map)
+ val handler = CachingHandler(listOf("foo"), kv) {
+ if (it.params.size > 0) {
+ JSONRPCResponse(id = 1, error = JSONRPCError(1234, ""))
+ } else {
+ JSONRPCResponse(id = 1)
+ }
+ }
+ assertEquals(0, map.size)
+ handler.handleRequest(JSONRPCRequest(id = 1, method = "foo", params =
arrayOf()))
+ assertEquals(1, map.size)
+ handler.handleRequest(JSONRPCRequest(id = 1, method = "bar", params =
arrayOf()))
+ assertEquals(1, map.size)
+ handler.handleRequest(JSONRPCRequest(id = 1, method = "foo", params =
arrayOf()))
+ assertEquals(1, map.size)
+ handler.handleRequest(JSONRPCRequest(id = 1, method = "foo", params =
arrayOf("bleh")))
+ assertEquals(1, map.size)
+ }
+}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]