java - 如何使用 littleproxy/netty 缓存流量?

标签 java http caching networking netty

我想用littleproxy缓存静态文件。所以我用 uri 的键和响应主体的值创建了 HashMap。这是 Java 代码:

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;
                }
            };
        }
    };
}

但是 map 中的响应有问题。当浏览器首先访问静态文件时,控制台中会出现一条调试消息:已添加到缓存中。当浏览器第二次访问静态文件时,会出现一条消息:“GOT FROM CACHE”,但浏览器会一直旋转以等待响应。

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

最佳答案

我认为您还需要复制 FullHttpResponse 以确保您拥有正确的作者/读者索引。

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

和:

返回 cache.get(requestUri).duplicate();

还要确保在从缓存中删除内容后调用 release()

关于java - 如何使用 littleproxy/netty 缓存流量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44985182/

相关文章:

http - 什么是可见的 ASCII 字符?

java - 出现错误 "type=Method Not Allowed, status=405"

java - 将自定义持久层迁移到 hibernate3

python - do_POST 过程中发生 KeyError,但 key 存在

javascript - 拒绝在 chrome 中获取不安全的 header "Location",在 firefox 中没有内容

iOS - 是否可以缓存 CGContextDrawImage?

linux - 如何在 Linux 中操作页面缓存?

c# - 如何在运行时正确清除 Awesomium.NET WPF 1.7.1 上的缓存

java - 如何在 SimpleRenderer 上设置抗锯齿选项

java - 如何在不使用 toString() 的情况下将任何类型的 Number 转换为 BigDecimal?