1010import io .vertx .httpproxy .ProxyRequest ;
1111import io .vertx .httpproxy .ProxyResponse ;
1212import io .vertx .httpproxy .spi .cache .Cache ;
13+ import io .vertx .httpproxy .spi .cache .Resource ;
1314
1415import java .time .Instant ;
1516import java .util .function .BiFunction ;
17+ import java .util .function .Predicate ;
1618
1719class CachingFilter implements ProxyInterceptor {
1820
19- private static final BiFunction <String , Resource , Resource > CACHE_GET_AND_VALIDATE = (key , resource ) -> {
20- long now = System .currentTimeMillis ();
21- long val = resource .timestamp + resource .maxAge ;
22- return val < now ? null : resource ;
23- };
21+ private final Cache cache ;
2422
25- private final Cache <String , Resource > cache ;
26-
27- public CachingFilter (Cache <String , Resource > cache ) {
23+ public CachingFilter (Cache cache ) {
2824 this .cache = cache ;
2925 }
3026
3127 @ Override
3228 public Future <ProxyResponse > handleProxyRequest (ProxyContext context ) {
33- Future <ProxyResponse > future = tryHandleProxyRequestFromCache (context );
34- if (future != null ) {
35- return future ;
36- }
37- return context .sendRequest ();
29+ return tryHandleProxyRequestFromCache (context );
3830 }
3931
4032 @ Override
@@ -66,32 +58,33 @@ private Future<Void> sendAndTryCacheProxyResponse(ProxyContext context) {
6658 System .currentTimeMillis (),
6759 response .maxAge ());
6860 Body body = response .getBody ();
69- response .setBody (Body .body (new BufferingReadStream (body .stream (), res .content ), body .length ()));
61+ response .setBody (Body .body (new BufferingReadStream (body .stream (), res .getContent () ), body .length ()));
7062 Future <Void > fut = context .sendResponse ();
7163 fut .onSuccess (v -> {
7264 cache .put (absoluteUri , res );
7365 });
7466 return fut ;
67+ } else if (request .getMethod () != HttpMethod .HEAD ) {
68+ return context .sendResponse ();
7569 } else {
76- if (request .getMethod () == HttpMethod .HEAD ) {
77- Resource resource = cache .get (request .absoluteURI ());
70+ return cache .get (request .absoluteURI ()).compose (resource -> {
7871 if (resource != null ) {
7972 if (!revalidateResource (response , resource )) {
8073 // Invalidate cache
8174 cache .remove (request .absoluteURI ());
8275 }
8376 }
84- }
85- return context . sendResponse ( );
77+ return context . sendResponse ();
78+ } );
8679 }
8780 } else {
8881 return context .sendResponse ();
8982 }
9083 }
9184
9285 private static boolean revalidateResource (ProxyResponse response , Resource resource ) {
93- if (resource .etag != null && response .etag () != null ) {
94- return resource .etag .equals (response .etag ());
86+ if (resource .getEtag () != null && response .etag () != null ) {
87+ return resource .getEtag () .equals (response .etag ());
9588 }
9689 return true ;
9790 }
@@ -102,49 +95,54 @@ private Future<ProxyResponse> tryHandleProxyRequestFromCache(ProxyContext contex
10295
10396 HttpServerRequest response = proxyRequest .proxiedRequest ();
10497
105- Resource resource ;
10698 HttpMethod method = response .method ();
107- if (method == HttpMethod .GET || method == HttpMethod .HEAD ) {
108- String cacheKey = proxyRequest .absoluteURI ();
109- resource = cache .computeIfPresent (cacheKey , CACHE_GET_AND_VALIDATE );
99+ if (method != HttpMethod .GET && method != HttpMethod .HEAD ) {
100+ return context .sendRequest ();
101+ }
102+
103+ String cacheKey = proxyRequest .absoluteURI ();
104+ return cache .get (cacheKey ).compose (resource -> {
110105 if (resource == null ) {
111- return null ;
106+ return context .sendRequest ();
107+ }
108+
109+ long now = System .currentTimeMillis ();
110+ long val = resource .getTimestamp () + resource .getMaxAge ();
111+ if (val < now ) {
112+ return cache .remove (cacheKey ).compose (v -> context .sendRequest ());
112113 }
113- } else {
114- return null ;
115- }
116114
117- String cacheControlHeader = response .getHeader (HttpHeaders .CACHE_CONTROL );
118- if (cacheControlHeader != null ) {
119- CacheControl cacheControl = new CacheControl ().parse (cacheControlHeader );
120- if (cacheControl .maxAge () >= 0 ) {
121- long now = System . currentTimeMillis ();
122- long currentAge = now - resource . timestamp ;
123- if ( currentAge > cacheControl . maxAge () * 1000 ) {
124- String etag = resource . headers . get ( HttpHeaders . ETAG );
125- if ( etag != null ) {
126- proxyRequest . headers (). set (HttpHeaders . IF_NONE_MATCH , resource . etag );
127- context .set ( "cached_resource" , resource );
128- return context . sendRequest ();
129- } else {
130- return null ;
115+ String cacheControlHeader = response .getHeader (HttpHeaders .CACHE_CONTROL );
116+ if (cacheControlHeader != null ) {
117+ CacheControl cacheControl = new CacheControl ().parse (cacheControlHeader );
118+ if (cacheControl .maxAge () >= 0 ) {
119+ long currentAge = now - resource . getTimestamp ();
120+ if ( currentAge > cacheControl . maxAge () * 1000 ) {
121+ String etag = resource . getHeaders (). get ( HttpHeaders . ETAG );
122+ if ( etag != null ) {
123+ proxyRequest . headers (). set ( HttpHeaders . IF_NONE_MATCH , resource . getEtag ());
124+ context . set ("cached_resource" , resource );
125+ return context .sendRequest ( );
126+ } else {
127+ return context . sendRequest ();
128+ }
131129 }
132130 }
133131 }
134- }
135132
136- //
137- String ifModifiedSinceHeader = response .getHeader (HttpHeaders .IF_MODIFIED_SINCE );
138- if ((response .method () == HttpMethod .GET || response .method () == HttpMethod .HEAD ) && ifModifiedSinceHeader != null && resource .lastModified != null ) {
139- Instant ifModifiedSince = ParseUtils .parseHeaderDate (ifModifiedSinceHeader );
140- if (!ifModifiedSince .isAfter (resource .lastModified )) {
141- response . response ().setStatusCode (304 ). end ( );
142- return Future . succeededFuture ();
133+ //
134+ String ifModifiedSinceHeader = response .getHeader (HttpHeaders .IF_MODIFIED_SINCE );
135+ if ((response .method () == HttpMethod .GET || response .method () == HttpMethod .HEAD ) && ifModifiedSinceHeader != null && resource .getLastModified () != null ) {
136+ Instant ifModifiedSince = ParseUtils .parseHeaderDate (ifModifiedSinceHeader );
137+ if (!ifModifiedSince .isAfter (resource .getLastModified () )) {
138+ return Future . succeededFuture ( proxyRequest . release (). response ().setStatusCode (304 ));
139+ }
143140 }
144- }
145- proxyRequest .release ();
146- ProxyResponse proxyResponse = proxyRequest .response ();
147- resource .init (proxyResponse );
148- return Future .succeededFuture (proxyResponse );
141+ proxyRequest .release ();
142+ ProxyResponse proxyResponse = proxyRequest .response ();
143+ resource .init (proxyResponse );
144+ return Future .succeededFuture (proxyResponse );
145+ });
146+
149147 }
150148}
0 commit comments