All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.twitter.finagle.http.service.RoutingService.scala Maven / Gradle / Ivy

package com.twitter.finagle.http.service

import com.twitter.finagle.Service
import com.twitter.finagle.http.{Request, Response, Method}
import com.twitter.finagle.http.path.Path
import com.twitter.util.Future

/**
 * RoutingService for composing Services.  Responds with 404 Not Found if no
 * matching service.
 *
 * RoutingService.byPath {
 *   case "/search.json" => mySearchService
 *   ....
 * }
 */
class RoutingService[REQUEST <: Request](
     val routes: PartialFunction[Request, Service[REQUEST, Response]])
  extends Service[REQUEST, Response] {

  // Try routes, fall back to 404 Not Found
  protected[this] val notFoundService = new NotFoundService[REQUEST]
  protected[this] val notFoundPf: PartialFunction[REQUEST, Service[REQUEST, Response]] = {
    case _ => notFoundService
  }
  protected[this] val requestToService = routes orElse notFoundPf

  def apply(request: REQUEST): Future[Response] = {
    val service = requestToService(request)
    service(request)
  }
}


object RoutingService {
  def byPath[REQUEST](routes: PartialFunction[String, Service[REQUEST, Response]]) =
   new RoutingService(
     new PartialFunction[Request, Service[REQUEST, Response]] {
       def apply(request: Request)       = routes(request.path)
       def isDefinedAt(request: Request) = routes.isDefinedAt(request.path)
     })

  def byPathObject[REQUEST](routes: PartialFunction[Path, Service[REQUEST, Response]]) =
   new RoutingService(
     new PartialFunction[Request, Service[REQUEST, Response]] {
       def apply(request: Request)       = routes(Path(request.path))
       def isDefinedAt(request: Request) = routes.isDefinedAt(Path(request.path))
     })

  def byMethodAndPath[REQUEST](routes: PartialFunction[(Method, String), Service[REQUEST, Response]]) =
    new RoutingService(
      new PartialFunction[Request, Service[REQUEST, Response]] {
        def apply(request: Request) = routes((request.method, request.path))
        def isDefinedAt(request: Request) = routes.isDefinedAt((request.method, request.path))
      })

  def byMethodAndPathObject[REQUEST](routes: PartialFunction[(Method, 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)))
      })
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy