Skip to content

Commit 07e617c

Browse files
authored
[Chore] FIx rate limit exception (#834)
1 parent 8735acc commit 07e617c

File tree

2 files changed

+21
-8
lines changed

2 files changed

+21
-8
lines changed

src/main/scala/io/iohk/ethereum/jsonrpc/JsonRpcError.scala

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,22 +2,31 @@ package io.iohk.ethereum.jsonrpc
22

33
import io.iohk.ethereum.consensus.Protocol
44
import io.iohk.ethereum.jsonrpc.serialization.JsonEncoder
5-
import org.json4s.{JInt, JObject, JString, JValue}
5+
import org.json4s.{JLong, JInt, JObject, JString, JValue}
66

77
case class JsonRpcError(code: Int, message: String, data: Option[JValue])
88

99
// scalastyle:off magic.number
1010
// scalastyle:off public.methods.have.type
11-
object JsonRpcError {
11+
object JsonRpcError extends JsonMethodsImplicits {
12+
1213
def apply[T: JsonEncoder](code: Int, message: String, data: T): JsonRpcError =
1314
JsonRpcError(code, message, Some(JsonEncoder[T].encodeJson(data)))
1415

16+
implicit val rateLimitInformation: JsonEncoder[RateLimitInformation] = (rateLimit: RateLimitInformation) =>
17+
JObject(
18+
"backoff_seconds" -> JLong(rateLimit.backoffSeconds)
19+
)
20+
1521
implicit val jsonRpcErrorEncoder: JsonEncoder[JsonRpcError] = err =>
1622
JObject(
1723
List("code" -> JsonEncoder.encode(err.code), "message" -> JsonEncoder.encode(err.message)) ++
1824
err.data.map("data" -> _)
1925
)
2026

27+
case class RateLimitInformation(backoffSeconds: Long)
28+
def RateLimitError(backoffSeconds: Long) =
29+
JsonRpcError(-32005, "request rate exceeded", RateLimitInformation(backoffSeconds))
2130
val ParseError = JsonRpcError(-32700, "An error occurred on the server while parsing the JSON text", None)
2231
val InvalidRequest = JsonRpcError(-32600, "The JSON sent is not a valid Request object", None)
2332
val MethodNotFound = JsonRpcError(-32601, "The method does not exist / is not available", None)

src/main/scala/io/iohk/ethereum/jsonrpc/server/http/JsonRpcHttpServer.scala

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,19 +10,19 @@ import ch.megard.akka.http.cors.javadsl.CorsRejection
1010
import ch.megard.akka.http.cors.scaladsl.CorsDirectives._
1111
import ch.megard.akka.http.cors.scaladsl.model.HttpOriginMatcher
1212
import ch.megard.akka.http.cors.scaladsl.settings.CorsSettings
13+
import com.typesafe.config.{Config => TypesafeConfig}
1314
import de.heikoseeberger.akkahttpjson4s.Json4sSupport
1415
import io.iohk.ethereum.faucet.jsonrpc.FaucetJsonRpcController
1516
import io.iohk.ethereum.jsonrpc._
16-
import io.iohk.ethereum.security.SSLError
1717
import io.iohk.ethereum.jsonrpc.serialization.JsonSerializers
1818
import io.iohk.ethereum.jsonrpc.server.controllers.JsonRpcBaseController
1919
import io.iohk.ethereum.jsonrpc.server.http.JsonRpcHttpServer.JsonRpcHttpServerConfig
20+
import io.iohk.ethereum.security.SSLError
2021
import io.iohk.ethereum.utils.{ConfigUtils, Logger}
2122
import javax.net.ssl.SSLContext
2223
import monix.eval.Task
2324
import monix.execution.Scheduler.Implicits.global
2425
import org.json4s.{DefaultFormats, JInt, native}
25-
import com.typesafe.config.{Config => TypesafeConfig}
2626

2727
import scala.concurrent.duration.{FiniteDuration, _}
2828

@@ -73,10 +73,14 @@ trait JsonRpcHttpServer extends Json4sSupport with RateLimit with Logger {
7373
}
7474

7575
def handleRateLimitedRequest(clientAddress: RemoteAddress, request: JsonRpcRequest): StandardRoute = {
76-
if (isBelowRateLimit(clientAddress)) {
77-
log.warn(s"Request limit exceeded for ip ${clientAddress.toIP.getOrElse("unknown")}")
76+
if (isBelowRateLimit(clientAddress))
7877
complete(jsonRpcController.handleRequest(request).runToFuture)
79-
} else complete(StatusCodes.TooManyRequests)
78+
else {
79+
log.warn(s"Request limit exceeded for ip ${clientAddress.toIP.getOrElse("unknown")}")
80+
complete(
81+
(StatusCodes.TooManyRequests, JsonRpcError.RateLimitError(config.rateLimit.minRequestInterval.toSeconds))
82+
)
83+
}
8084
}
8185

8286
/**
@@ -113,7 +117,7 @@ trait JsonRpcHttpServer extends Json4sSupport with RateLimit with Logger {
113117
.traverse(requests)(request => jsonRpcController.handleRequest(request))
114118
.runToFuture
115119
}
116-
} else complete(StatusCodes.MethodNotAllowed)
120+
} else complete(StatusCodes.MethodNotAllowed, JsonRpcError.MethodNotFound)
117121
}
118122
}
119123

0 commit comments

Comments
 (0)