alwaysCache
Signature
def alwaysCache[K](cache: Cache[K, RouteResult], keyer: PartialFunction[RequestContext, K]): Directive0
Description
Like cache but disregards a Cache-Control
request header.
Example
- Scala
-
//Example keyer for non-authenticated GET requests val simpleKeyer: PartialFunction[RequestContext, Uri] = { val isGet: RequestContext ⇒ Boolean = _.request.method == GET val isAuthorized: RequestContext ⇒ Boolean = _.request.headers.exists(_.is(Authorization.lowercaseName)) PartialFunction { case r: RequestContext if isGet(r) && !isAuthorized(r) ⇒ r.request.uri } } var i = 0 val route = alwaysCache(routeCache, simpleKeyer) { complete { i += 1 i.toString } } Get("/") ~> route ~> check { responseAs[String] shouldEqual "1" } // now cached Get("/") ~> route ~> check { responseAs[String] shouldEqual "1" } Get("/") ~> `Cache-Control`(`no-cache`) ~> route ~> check { responseAs[String] shouldEqual "1" }
- Java
-
final CachingSettings cachingSettings = CachingSettings.create(system()); // Example keyer for non-authenticated GET requests final JavaPartialFunction<RequestContext, Uri> simpleKeyer = new JavaPartialFunction<RequestContext, Uri>() { public Uri apply(RequestContext in, boolean isCheck) { final HttpRequest request = in.getRequest(); final boolean isGet = request.method() == HttpMethods.GET; final boolean isAuthorized = request.getHeader(Authorization.class).isPresent(); if (isGet && !isAuthorized) return request.getUri(); else throw noMatch(); } }; final AtomicInteger count = new AtomicInteger(0); final Route route = alwaysCache(routeCache(cachingSettings), simpleKeyer, () -> extractUri(uri -> complete(String.format("Request for %s @ count %d", uri, count.incrementAndGet())) ) ); // tests: testRoute(route) .run(HttpRequest.GET("/")) .assertEntity("Request for http://example.com/ @ count 1"); // now cached testRoute(route) .run(HttpRequest.GET("/")) .assertEntity("Request for http://example.com/ @ count 1"); final CacheControl noCache = CacheControl.create(CacheDirectives.NO_CACHE); testRoute(route) .run(HttpRequest.GET("/").addHeader(noCache)) .assertEntity("Request for http://example.com/ @ count 1");