我可以让Sinatra / Rack不将整个请求体读入内存吗?

时间:2010-06-12 05:08:20

标签: sinatra httprequest rack

说我有一个Sinatra路线ala:

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

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

我知道我可以这样做来阅读部分身体,但是整个身体似乎仍然预先被读入记忆。

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

1 个答案:

答案 0 :(得分:4)

如果不修补Sinatra和/或Rack,你无法避免这种情况。当request.POST called by Sinatra params来创建{{3}}时,Rack::Request会完成此操作。

但是你可以在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