timeout when acting as a cache proxy
Adeodato Simó <[email protected]> Mon, 21 Feb 2005 02:46:48 +0100
| Newsgroups | gmane.comp.apache.mod-ruby |
|---|---|
| Message-ID | <[email protected]> |
Hello,
I've written a small ruby cgi that acts as a proxy for file downloads.
If the requested file is in the cache, it's sent to the client
directly. If not, it is fetched from its remote location and it's sent
to the client at the same time (with req.read_body { block }).
A very simplified version of it follows; the downloaded file is large
enough that it takes more than 5min to be downloaded in my system.
When run as a CGI, all goes fine. When using modruby, however, I get
the following error exactly after 270 seconds:
mod_ruby: /var/www/adeodato/cgi/timeout.rbx:5:in `rbuf_fill': timeout (270 sec) (Apache::TimeoutError)
mod_ruby: from /usr/lib/ruby/1.8/net/protocol.rb:196:in `timeout'
mod_ruby: from /usr/lib/ruby/1.8/timeout.rb:55:in `timeout'
mod_ruby: from /usr/lib/ruby/1.8/net/protocol.rb:196:in `rbuf_fill'
mod_ruby: from /usr/lib/ruby/1.8/net/protocol.rb:128:in `read'
mod_ruby: from /usr/lib/ruby/1.8/net/http.rb:1735:in `read_body_0'
mod_ruby: from /usr/lib/ruby/1.8/net/http.rb:1697:in `read_body'
mod_ruby: from /var/www/adeodato/cgi/timeout.rbx:17
mod_ruby: from /var/www/adeodato/cgi/timeout.rbx:15:in `request'
mod_ruby: from /usr/lib/ruby/1.8/net/http.rb:835:in `reading_body'
mod_ruby: from /usr/lib/ruby/1.8/net/http.rb:835:in `request'
mod_ruby: from /usr/lib/ruby/1.8/net/http.rb:823:in `request'
mod_ruby: from /usr/lib/ruby/1.8/net/http.rb:821:in `start'
mod_ruby: from /usr/lib/ruby/1.8/net/http.rb:821:in `request'
mod_ruby: from /usr/lib/ruby/1.8/net/http.rb:734:in `request_get'
mod_ruby: from /var/www/adeodato/cgi/timeout.rbx:15
mod_ruby: from /usr/lib/ruby/1.8/apache/ruby-run.rb:53:in `load'
mod_ruby: from /usr/lib/ruby/1.8/apache/ruby-run.rb:53:in `handler'
Is this a known behavior of modruby, and I should be just rescueing
timeouts, or there is a better solution. Perhaps something is wrong
with my code?
This is the script, thanks in advance:
------------------------8<------------------------------------------------------
#! /usr/bin/ruby -w
require 'cgi'
require 'uri'
require 'net/http'
Apache.request.sync_output = true if defined? MOD_RUBY
file = "http://ftp.de.debian.org/debian/pool/main/o/openoffice.org/openoffice.org-bin_1.1.3-6_i386.deb"
uri = URI.parse(file)
http = Net::HTTP.new(uri.host, uri.port)
http.request_get(uri.request_uri) do |r|
print CGI.new.header('Content-Length' => r['Content-Length'])
r.read_body { |seg|
print seg
# in the real cgi, I also do this:
# somefile.print seg
}
end
------------------------8<------------------------------------------------------
--
Adeodato Simó
EM: asp16 [ykwim] alu.ua.es | PK: DA6AE621
There is no man so good who, were he to submit all his thoughts to the
laws, would not deserve hanging ten times in his life
-- Michel de Montaigne