0

I'm trying to write a very simple HTTP server that returns the next 500 lines of a file on each request. If I try to read a file, the server fails.

This is my program:

#!/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

If I make a request, I get the first 500 lines from the file, but I get this on the console:

/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

All further requests fail.

How do I fix this program?

4

1 回答 1

1

file变量中的 Enumerator 到达 then 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 回答