0

リクエストごとにファイルの次の 500 行を返す非常に単純な HTTP サーバーを作成しようとしています。ファイルを読み込もうとすると、サーバーが失敗します。

これは私のプログラムです:

#!/usr/bin/env ruby

require 'rubygems'
require 'net/http/server'
require 'pp'

file = File.foreach("data/all.txt").each_slice(500)

headers = {'Content-Type' => 'text/plain'}
Net::HTTP::Server.run(:port => 2000) do |request, stream|
    [200, headers, file.next]
end

リクエストを行うと、ファイルから最初の 500 行を取得しますが、コンソールには次のように表示されます。

/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/generator.rb:132:in`call'
/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/generator.rb:132:in`next'
/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/generator.rb:190:in`next' ./urlServer.rb:12
/Library/Ruby/Gems/1.8/gems/net-http-server-0.2.2/lib/net/http/server/daemon.rb:122:in`call'
/Library/Ruby/Gems/1.8/gems/net-http-server-0.2.2/lib/net/http/server/daemon.rb:122:in`serve'
/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/gserver.rb:211:in`start'
/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/gserver.rb:208:in`initialize'
/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/gserver.rb:208:in`new'
/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/gserver.rb:208:in`start'
/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/gserver.rb:198:in`initialize'
/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/gserver.rb:198:in`new'
/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/gserver.rb:198:in`start'
/Library/Ruby/Gems/1.8/gems/net-http-server-0.2.2/lib/net/http/server/server.rb:42:in`run' ./urlServer.rb:11

それ以降のすべてのリクエストは失敗します。

このプログラムを修正するにはどうすればよいですか?

4

1 に答える 1

1

file変数の Enumerator がend に達すると、nextメソッドはStopIteration例外を発生させますが、それをレスキューしていないため、ここで問題になる可能性があります。

おそらく、begin-rescue ブロックでラップする必要があります。たとえば、次のようになります。

Net::HTTP::Server.run(:port => 2000) do |request, stream|
  begin
    body = file.next
  rescue StopIteration
    body = []
  end

  [200, headers, body]
end
于 2013-09-26T21:40:42.830 に答える