3

假设我有一条 Sinatra 路线:

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

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

我知道我可以这样做以部分读取身体,但整个身体似乎仍然事先被读入内存。

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

1 回答 1

4

如果不修补 Sinatra 和/或 Rack,您通常无法避免这种情况。由Sinatra 调用创建时Rack::Request完成。request.POSTparams

但是你可以在 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
于 2010-06-12T09:43:02.863 回答