Skip to content

Instantly share code, notes, and snippets.

@TobiasPfeifer
Created February 21, 2016 13:41
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save TobiasPfeifer/b0a5bda9949659682d4b to your computer and use it in GitHub Desktop.
Save TobiasPfeifer/b0a5bda9949659682d4b to your computer and use it in GitHub Desktop.
trait RequestRateLimiter[T] {
def check(ctx: RequestContext, realIp: Option[RemoteAddress], proxiedIp: Option[RemoteAddress]) : RequestRateResult[T]
}
sealed trait RequestRateResult[T]
case class Pass[T](result: T) extends RequestRateResult[T]
case class Block[T](rejection: Rejection) extends RequestRateResult[T]
def limit[T](requestRateLimiter: RequestRateLimiter[T]): Directive1[T] = {
def remoteAddress: Directive1[Option[RemoteAddress]] = optionalHeaderValuePF { case `Remote-Address`(address) ⇒ address }
def xForwardedFor: Directive1[Option[RemoteAddress]] = optionalHeaderValuePF { case `X-Forwarded-For`(Seq(address, _*)) ⇒ address }
extract(identity) flatMap { ctx =>
remoteAddress.flatMap { realIp =>
xForwardedFor.flatMap { proxiedIp =>
requestRateLimiter.check(ctx, realIp, proxiedIp) match {
case Pass(result) => provide(result)
case Block(rejection) => reject(rejection)
}
}
}
}
}
@oreganrob
Copy link

Hi,

How would I use/call this?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment