sinatra - 我可以让 Sinatra/Rack 不将整个请求正文读入内存吗?

标签 sinatra httprequest rack

假设我有一条 Sinatra 路线:

put '/data' do
  request.body.read
  # ...
end

看起来整个 request.body 都被读入内存了。有没有办法在主体进入系统时消耗它,而不是预先将其全部缓冲在 Rack/Sinatra 中?

我知道我可以这样做来读取部分正文,但整个正文似乎仍然被预先读入内存。

put '/data' do
  while request.body.read(1024) != nil 
    # ...
  end
  # ...
end

最佳答案

如果不修补 Sinatra 和/或 Rack,通常无法避免这种情况。当 request.POST 时,由 Rack::Request 完成是 called by Sinatra创建params .

但是您可以在 Sinatra 前面放置一个中间件来删除主体:

require 'sinatra'
require 'stringio'

use Rack::Config do |env|
  if env['PATH_INFO'] == '/data' and env['REQUEST_METHOD'] == 'PUT'
    env['rack.input'], env['data.input'] = StringIO.new, env['rack.input']
  end
end

put '/data' do
  while request.env['data.input'].body.read(1024) != nil 
    # ...
  end
  # ...
end

关于sinatra - 我可以让 Sinatra/Rack 不将整个请求正文读入内存吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3027564/

相关文章:

ruby - 在没有猴子修补的情况下禁用 Rack::CommonLogger

ruby - 如何在 Heroku 上托管的 Sinatra 应用程序中设置 HTTP 响应(缓存) header

ruby - 无法使用 Curl 在 Sinatra 中接受帖子

java - 如何确保客户端在访问应用程序的某些页面时正在使用(或能够使用)TLS v1.2?

c# - ASP.NET 中的 Request.Browser.Cookies 属性有多可靠?

linux - Ubuntu 18.04 发出证书请求时出现问题,字符串太短

ruby - 使用 sinatra 和 Rack::Session::Encrypted Cookie 根据每个请求更改 Cookie

ruby - Sinatra::ConfigFile 中的动态属性

sinatra - 避免为 Rack 使用多余的Bundler依赖项声明

java - 记录 http 请求获取/发布参数的最佳方式(且快速)