2017-07-08 71 views
0

我想用littleproxy缓存静态文件。所以我使用uri的键和响应体的值创建了HashMap。这里的java代码:如何使用littleproxy/netty缓存流量?

private static Map<String, FullHttpResponse> cache = new HashMap<>(); 

private static HttpFiltersSource getHttpFiltersSource() { 
    return new HttpFiltersSourceAdapter() { 
      @Override 
      public int getMaximumResponseBufferSizeInBytes() { 
       return 10 * 1024 * 1024; 
      } 

     public HttpFilters filterRequest(HttpRequest originalRequest, ChannelHandlerContext ctx) { 
      return new HttpFiltersAdapter(originalRequest) { 
       @Override 
       public HttpResponse clientToProxyRequest(HttpObject httpObject) { 

        if (httpObject instanceof HttpRequest) { 
         HttpRequest request = (HttpRequest) httpObject; 
         String requestUri = request.getUri(); 

         if(requestUri.matches(".*[./]png.*$") || 
           requestUri.matches(".*[./]jpg.*$") || 
           requestUri.matches(".*[./]jpeg.*$") || 
           requestUri.matches(".*[./]woff2.*$") || 
           requestUri.matches(".*[./]js.*$")) { 
          if (cache.containsKey(requestUri)) { 
           System.out.println("GOT FROM CACHE " + requestUri); 

           return cache.get(requestUri); 
          } 
         } 
        } 

        return null; 
       } 

       @Override 
       public HttpObject serverToProxyResponse(HttpObject httpObject) { 
        if (httpObject instanceof FullHttpResponse) { 
         FullHttpResponse response = (FullHttpResponse) httpObject; 
         String requestUri = originalRequest.getUri(); 

          if(requestUri.matches(".*[./]png.*$") || 
            requestUri.matches(".*[./]jpg.*$") || 
            requestUri.matches(".*[./]jpeg.*$") || 
            requestUri.matches(".*[./]woff2.*$") || 
            requestUri.matches(".*[./]js.*$")) { 
           cache.put(requestUri, response.retain()); 
           System.out.println("ADDED TO CACHE " + requestUri); 
          } 
        } 

        return httpObject; 
       } 
      }; 
     } 
    }; 
} 

但是,这里的地图中的响应有问题。当浏览器首先到达静态文件时,控制台中会显示一条调试消息:ADDED TO CACHE。当浏览器第二次到达静态文件时,会出现一条消息:“GOT FROM CACHE”,但浏览器永远在等待响应。

什么是正确的方式来保存和存储来自服务器的响应,并在需要时将其返回给客户端?

回答

0

我想你还需要复制FullHttpResponse以确保你有正确的作家/读者索引。

cache.put(requestUri, response.duplicate().retain());

和:

return cache.get(requestUri).duplicate();

还要确保你调用release()一旦你从缓存中删除的东西。