Могу ли я сделать так, чтобы Sinatra / Rack не считывал все тело запроса в память? - PullRequest
3 голосов
/ 12 июня 2010

Скажи, что у меня есть маршрут Синатры аля:

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

Похоже, что весь request.body читается в память. Есть ли способ потреблять тело, когда оно входит в систему, вместо того, чтобы заранее хранить все это в Rack / Sinatra?

Я вижу, что могу сделать это, чтобы прочитать тело по частям, но кажется, что все тело заранее считывается в память.

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

1 Ответ

4 голосов
/ 12 июня 2010

Вы не можете избежать этого вообще, не исправляя Синатру и / или Стойку. Это делается Rack::Request, когда request.POST равно , вызванному Синатрой для создания params.

Но вы можете поместить промежуточное программное обеспечение перед Синатрой, чтобы снять тело:

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
...