Skip to content

Instantly share code, notes, and snippets.

@j5ik2o
Last active December 25, 2015 19:29
Show Gist options
  • Save j5ik2o/7027947 to your computer and use it in GitHub Desktop.
Save j5ik2o/7027947 to your computer and use it in GitHub Desktop.
val service = new Service[HttpRequest, HttpResponse] {
  def apply(request: HttpRequest) =
    Future(new DefaultHttpResponse(HTTP_1_1, OK))
}

val server: Server = ServerBuilder()                                                       // 4
  .codec(Http())
  .bindTo(new InetSocketAddress(8080))
  .name("HttpServer")
  .build(service)
class Authorize extends SimpleFilter[HttpRequest, HttpResponse] {
  def apply(request: HttpRequest,
    continue: Service[HttpRequest, HttpResponse]) = {
    if ("shared secret" == request.getHeader("Authorization")) {
      continue(request)
    } else {
      Future.exception(
        new IllegalArgumentException("You don't know the secret")
      )
    }
  }
}
object HttpServer extends App {
  class HandleExceptions extends SimpleFilter[HttpRequest, HttpResponse] {...}
  class Authorize extends SimpleFilter[HttpRequest, HttpResponse] {...}
  class Respond extends Service[HttpRequest, HttpResponse] {...}

  val handleExceptions = new HandleExceptions
  val authorize = new Authorize
  val respond = new Respond

  val myService: Service[HttpRequest, HttpResponse]
    = handleExceptions andThen authorize andThen respond

  val server: Server = ServerBuilder()
    .name("myService")
    .codec(Http())
    .bindTo(new InetSocketAddress(8080))
    .build(myService) 
}
  val myService: Service[Request, Response] = byMethodAndPath {
    case (Method.Get, Root / "user" / Integer(userId)) => getUserService
    case (Method.Get, Root / "group" / Integer(groupId)) => getGroupService
  }

  val server: Server = ServerBuilder()
    .name("myService")
    .codec(RichHttp[Request](Http()))
    .bindTo(new InetSocketAddress(8080))
    .build(myService)

  def byMethodAndPath(routes: PartialFunction[(HttpMethod, Path),
    Service[Request, Response]]) =
    new RoutingService(
      new PartialFunction[Request, Service[Request, Response]] {
        def apply(request: Request) =
          routes((request.method, Path(request.path)))
        def isDefinedAt(request: Request) =
          routes.isDefinedAt((request.method, Path(request.path)))
      }
    )
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment