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");