处理Sinatra中的分块请求

时间:2013-01-08 02:57:06

标签: ruby http nginx sinatra passenger

在Sinatra,我有一个类似于以下的路线设置:

put '/test' do
  begin
    logger.info 'In put begin block'

    write_to_file(request.body.read)

    [200, '']
  rescue RuntimeError => e
    [500, 'some error']
  end
end

def write_to_file(data)
  logger.info "writing data with size #{data.size}"
  # Code to save file...
end

当我发送的数据是< ~500 MBytes它似乎一切正常工作但当我尝试发送> = 500 MBytes的数据时,我得到一些奇怪的日志输出然后客户端最终错误输出以下错误:Excon :: Errors :: SocketError:EOFError (引发EOFError)

来自服务器(Sinatra)的日志如下所示:

对于数据< 500 MBytes:

I, [2013-01-07T21:33:59.386768 #17380]  INFO -- : In put begin block
I, [2013-01-07T21:34:01.279922 #17380]  INFO -- : writing data with size 209715200
xxx.xxx.xxx.xxx - - [07/Jan/2013 21:34:22] "PUT /test " 200 - 22.7917

对于数据> 500 MBytes:

I, [2013-01-07T21:47:37.434022 #17386]  INFO -- : In put begin block
I, [2013-01-07T21:47:41.152932 #17386]  INFO -- : writing data with size 524288000
I, [2013-01-07T21:48:16.093683 #17380]  INFO -- : In put begin block
I, [2013-01-07T21:48:20.300391 #17380]  INFO -- : writing data with size 524288000
xxx.xxx.xxx.xxx - - [07/Jan/2013 21:48:39] "PUT /test " 200 - 62.4515
I, [2013-01-07T21:48:54.718971 #17386]  INFO -- : In put begin block
I, [2013-01-07T21:49:00.381725 #17386]  INFO -- : writing data with size 524288000
I, [2013-01-07T21:49:33.980043 #17267]  INFO -- : In put begin block
I, [2013-01-07T21:49:41.990671 #17267]  INFO -- : writing data with size 524288000
xxx.xxx.xxx.xxx - - [07/Jan/2013 21:50:06] "PUT /test " 200 - 110.2076
xxx.xxx.xxx.xxx - - [07/Jan/2013 21:51:22] "PUT /test " 200 - 108.5339

不完全确定这里发生了什么,所以我想我的问题有两个,A。这两种情况之间根本不同的是什么会导致他们这样做? B.有没有更好的方法来处理数据以减轻这种影响?

1 个答案:

答案 0 :(得分:1)

问题原来是阿帕奇/乘客。使用WEBrick运行服务器缓解了这个问题。