Skip to content

Instantly share code, notes, and snippets.

@jkal
Created July 21, 2014 12:25
Show Gist options
  • Save jkal/8bbb5d6b7913dd9f1426 to your computer and use it in GitHub Desktop.
Save jkal/8bbb5d6b7913dd9f1426 to your computer and use it in GitHub Desktop.
Finagle HTTP routing example
import com.twitter.finagle.http.{HttpMuxer, Request, Response}
import com.twitter.finagle.Http
import com.twitter.finagle.Service
import com.twitter.finagle.http.service.RoutingService
import com.twitter.finagle.http.path._
import com.twitter.finagle.http.Method
import com.twitter.util.{Await, Future}
class IndexHandler extends Service[Request, Response] {
def apply(req: Request): Future[Response] = {
val r = req.response
r.setStatusCode(200)
r.setContentString("Hello world!")
Future.value(r)
}
}
class GreetHandler(val name: String) extends Service[Request, Response] {
def apply(req: Request): Future[Response] = {
val r = req.response
r.setStatusCode(200)
r.setContentString("Hello " + name)
Future.value(r)
}
}
object HttpRouter {
def byRequest[REQUEST](routes: PartialFunction[Request, Service[REQUEST, Response]]) =
new RoutingService(
new PartialFunction[Request, Service[REQUEST, Response]] {
def apply(request: Request) = routes(request)
def isDefinedAt(request: Request) = routes.isDefinedAt(request)
})
}
object MyApp extends App {
val routingService =
HttpRouter.byRequest { request =>
(request.method, Path(request.path)) match {
case Method.Get -> Root => new IndexHandler()
case Method.Get -> Root / "hello" / name => new GreetHandler(name)
}
}
HttpMuxer.addRichHandler("/", routingService)
val server = Http.serve("0.0.0.0:8000", HttpMuxer)
Await.ready(server)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment