http - Kemal 使用处理程序中间件缓存响应

标签 http caching crystal-lang kemal

Kemal 使用处理程序中间件缓存响应

我正在尝试使用 Kemal 缓存一些 GET 请求。

class CachingHandler < Kemal::Handler

    property cache : Hash(String, IO::Memory)

    def initialize
        @cache = Hash(String, IO::Memory).new
    end

    def call(context)
        puts "Caching"
        puts "Key: #{ context.request.resource }"
        if output = @cache[context.request.resource]?
            puts "Cache: true"
            IO.copy output, context.response.output
        else
            puts "Cache: false"
            puts "Cache: building"
            context.response.output          =
            @cache[context.request.resource] = IO::Memory.new
            # continue
            puts "Cache: continue"
            call_next context
        end
    end
end

但在第一个请求中,浏览器总是在等待响应。并在第二个请求中发送“Closed stream (IO::Error)”错误。

最佳答案

您间接将 context.response.output 设置为 IO::Memory.new。因此,下一个处理程序不会写入连接的输出流,而是写入内存 IO。

您需要将流数据复制到内存 套接字。也许 IO::MultiWriter 可以提供帮助,例如 response.output = IO::MultiWriter.new(response.output, memory_io)

此外,我建议不要存储 IO::Memory 实例,而是将它们的原始数据存储为 Bytes (io.to_slice) .一旦将其放入缓存中,就没有必要再使用 IO 了。您可以在命中缓存时直接将字节写入输出流 (response.write(bytes)。

关于http - Kemal 使用处理程序中间件缓存响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47121991/

相关文章:

c++ - CAtlHttpClient - 导航到 IP6 地址似乎不起作用

ruby-on-rails - 如何在开发过程中关闭 Rails 缓存

针对 Pagespeed 优化的 Apache Vhost 指令

python - 在 Crystal-lang 中编写 Python 函数时出错

udp - 使用 Crystal/Kemal 监听 UDP 数据包

java - 如何从用java开发的web应用程序的http请求中检索源系统的ip地址?

node.js - 指定根文件夹 express-http-proxy

scala - 使用 akka http,如何将请求 header 注入(inject)到服务器中的传入路由中?

java - Guava 缓存的预加载值

crystal-lang - 带参数的方法 proc