说我有一个Sinatra路线ala:
put '/data' do
request.body.read
# ...
end
看来整个request.body被读入内存。有没有办法在身体进入系统时消耗它,而不是事先将它全部缓冲在Rack / Sinatra中?
我知道我可以这样做来阅读部分身体,但是整个身体似乎仍然预先被读入记忆。
put '/data' do
while request.body.read(1024) != nil
# ...
end
# ...
end
答案 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