2017-07-08 2 views
0

Je veux mettre en cache des fichiers statiques avec littleproxy. J'ai donc créé HashMap avec la clé pour l'uri et les valeurs pour le corps de la réponse. Voici le code java:Comment mettre en cache le trafic avec 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; 
       } 
      }; 
     } 
    }; 
} 

Mais quelque chose ne va pas ici avec la réponse dans la carte. Lorsque le navigateur atteint les fichiers statiques d'abord, il y a un message de débogage dans la console: AJOUT AU CACHE. Lorsque le navigateur atteint des fichiers statiques en second lieu, il y a un message: "GOT FROM CACHE", mais le navigateur tourne à jamais en attente d'une réponse.

Quelle est la bonne façon d'enregistrer et de stocker les réponses du serveur et de le renvoyer au client quand vient le temps?

Répondre

0

Je pense que vous devez également dupliquer le FullHttpResponse pour vous assurer d'avoir les bons indexeurs/lecteurs.

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

et:

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

Vérifiez également que vous appelez release() une fois que vous retirez quelque chose à partir du cache.