3

Sinatra ルート ala があるとします。

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

request.body 全体がメモリに読み込まれているようです。事前にラック/シナトラにすべてバッファリングするのではなく、システムに入ってきたときにボディを消費する方法はありますか?

体を部分的に読み取るためにこれを行うことができますが、体全体はまだ事前にメモリに読み込まれているようです.

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 に答える