Webrick problem, PREMATURE END OF SCRIPT HEADERS

K

Kevin Layman

I've downloaded and installed Ruby (v1.8.5) w/the latest Windows
installer and am trying to run some cgi's per these examples:
http://microjet.ath.cx/webrickguide/html/CGIHandler.html

I keep getting HTTP 500 - Internal server error, and in the Ruby command
line PREMATURE END OF SCRIPT HEADERS.

I've got the path to the Ruby executable in test.cgi, and the next line
outputs a valid header, and this cgi will execute correctly when run by
Webrick directly. Programs are below.


test.cgi:
#!g:\ruby\bin\ruby.exe
print "Content-type: text/plain\r\n\r\n"
ENV.keys.sort.each{|k| puts "#{k} ==> #{ENV[k]}"}

cgi_handler.rb:
require 'webrick'

include WEBrick # let's import the namespace so
# I don't have to keep typing
# WEBrick:: in this documentation.

def start_webrick(config = {})
# always listen on port 8080
config.update:)Port => 8080)
server = HTTPServer.new(config)
yield server if block_given?
['INT', 'TERM'].each {|signal|
trap(signal) {server.shutdown}
}
server.start

end

#start_webrick:)DocumentRoot =>
"g:/infoproweb/webfolder/cgi-bin/ruby",:CGIInterpreter =>
"g:/ruby/bin/ruby.exe")
start_webrick:)DocumentRoot => "g:/infoproweb/webfolder/")


start_webrick {|server|
#cgi_dir = File.expand_path('~/cgi-bin/ruby')
cgi_dir = "g:/infoproweb/webfolder/cgi-bin/ruby"
server.mount("/cgi-bin/ruby", HTTPServlet::FileHandler, cgi_dir,
{:FancyIndexing=>true})
}
 
P

PerfectDayToChaseTornados

Kevin Layman said:
I've downloaded and installed Ruby (v1.8.5) w/the latest Windows
installer and am trying to run some cgi's per these examples:
http://microjet.ath.cx/webrickguide/html/CGIHandler.html

I keep getting HTTP 500 - Internal server error, and in the Ruby command
line PREMATURE END OF SCRIPT HEADERS.

I've got the path to the Ruby executable in test.cgi, and the next line
outputs a valid header, and this cgi will execute correctly when run by
Webrick directly. Programs are below.


test.cgi:
#!g:\ruby\bin\ruby.exe
print "Content-type: text/plain\r\n\r\n"
ENV.keys.sort.each{|k| puts "#{k} ==> #{ENV[k]}"}

cgi_handler.rb:
require 'webrick'

include WEBrick # let's import the namespace so
# I don't have to keep typing
# WEBrick:: in this documentation.

def start_webrick(config = {})
# always listen on port 8080
config.update:)Port => 8080)
server = HTTPServer.new(config)
yield server if block_given?
['INT', 'TERM'].each {|signal|
trap(signal) {server.shutdown}
}
server.start

end

#start_webrick:)DocumentRoot =>
"g:/infoproweb/webfolder/cgi-bin/ruby",:CGIInterpreter =>
"g:/ruby/bin/ruby.exe")
start_webrick:)DocumentRoot => "g:/infoproweb/webfolder/")


start_webrick {|server|
#cgi_dir = File.expand_path('~/cgi-bin/ruby')
cgi_dir = "g:/infoproweb/webfolder/cgi-bin/ruby"
server.mount("/cgi-bin/ruby", HTTPServlet::FileHandler, cgi_dir,
{:FancyIndexing=>true})
}

You probably have something else already running on that port. Either start
Webrick on a different port or stop whatever is bound to that port.
 
P

Paul Stickney

Try to run that program using ruby directly.
It might be something as simple as a syntax error.

Starting WEBrick from a ``CGI'' like that looks kind of odd...
 
D

Diego Guillen

Hi, I think the problem is that webrick doesn't know how to execute the
"shebang" line found in cgi scripts on Windows (in Linux it's not a
problem).

I found the same problem more recently with Ruby 1.9.1 on Windows.

A generic solution that works for both Ruby 1.8.6.pxxx and 1.9.1.p0 on
Windows is the following:

Edit the file: c:\ruby\lib\ruby\1.8\webrick\httpservlet\cgi_runner.rb

Add the following lines at the top of the file:

if "1.9.1" == RUBY_VERSION
require 'rbconfig' #constants telling where Ruby runs from
end

Now, locate the last line where is says: exec ENV["SCRIPT_FILENAME"]
Comment that line out and add the following code:

# --- from here ---
if "1.9.1" == RUBY_VERSION #use RbConfig
Ruby = File::join(RbConfig::CONFIG['bindir'],
RbConfig::CONFIG['ruby_install_name'])
Ruby << RbConfig::CONFIG['EXEEXT']
else # use ::Config
Ruby = File::join:):Config::CONFIG['bindir'],
::Config::CONFIG['ruby_install_name'])
Ruby << ::Config::CONFIG['EXEEXT']
end

if /mswin|bccwin|mingw/ =~ RUBY_PLATFORM
exec "#{Ruby}", ENV["SCRIPT_FILENAME"]
else
exec ENV["SCRIPT_FILENAME"]
end
# --- to here ---

Save the file and restart the webrick server.

Explanation:
This code just builds a constant 'Ruby' with the full path to
"ruby.exe", and
(if you're running on Windows) it passes the additional parameter
"c:\ruby\bin\ruby.exe" , to the Kernel.exec() method, so that your
script can be executed.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,744
Messages
2,569,484
Members
44,903
Latest member
orderPeak8CBDGummies

Latest Threads

Top