gpt4 book ai didi

sinatra - 我可以让 Sinatra/Rack 不将整个请求正文读入内存吗?

转载 作者:行者123 更新时间:2023-12-02 17:28:32 29 4
gpt4 key购买 nike

假设我有一条 Sinatra 路线:

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

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

我知道我可以这样做来读取部分正文,但整个正文似乎仍然被预先读入内存。

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

最佳答案

如果不修补 Sinatra 和/或 Rack,通常无法避免这种情况。当 request.POST 时,由 Rack::Request 完成是 called by Sinatra创建params .

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

关于sinatra - 我可以让 Sinatra/Rack 不将整个请求正文读入内存吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3027564/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com