2017-07-08 4 views
0

私はlittleproxyで静的ファイルをキャッシュします。そこで私は、uriのキーとレスポンスボディの値を持つHas​​hMapを作成しました。ここに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。ブラウザが静的なファイルに達すると、2番目に "GOT FROM CACHE"というメッセージが表示されますが、ブラウザは永遠に応答を待っています。

サーバーからの応答を保存して保存し、時間が来たらクライアントに返す正しい方法は何ですか?

答えて

0

ライター/リーダーの正しいインデックスがあるように、FullHttpResponseも複製する必要があると思います。

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

と:

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

また、あなたがキャッシュから何かを削除したら、あなたはrelease()を呼び出すことを確認してください。

関連する問題