Ruby and CGI error 500

G

greyfade

this is a problem that's been driving me nuts ever since i first tried
it.

i can create simple, minimal scripts in Python, Perl, and PHP that run
flawlessly on the first try with minimal effort, both on my local
testing system (Apache 2.0.52 and Ruby 1.8.2) and on the server my
personal site is hosted on (Apache 1.3.33 and unknown version of Ruby -
i'm trying to find out). but no matter what i try, i simply can not
get even the most minimal ruby script to function:

#!/usr/bin/env ruby

print "Content-type: text/html\n\n"
print "<html><body>Hello World!</body></html>\n"

it runs perfectly fine at the console, no warnings, no errors, no
problems. but as a CGI script, it's another story: i get an error 500
and the cryptic (and seemingly common) "Premature end of script
headers". no other warnings or errors. if i simply change "ruby" to
"python" on the shebang line, the above script magically works with no
other effort on my part.

i'm going insane because nothing, AFAICT, is wrong. the server is
correctly set-up, permissions are correct, ownership is correct, ruby
is installed and working, yet NOTHING seems to coax it into working.
it repeatedly reports this incredibly uninformative "Premature end of
script headers" error.

is there something i could have missed? a possible misconfiguration?
or does ruby just hate me?
 
J

James Britt

(e-mail address removed) wrote:

Given this:
#!/usr/bin/env ruby

What user is executing the script, and is ruby in that user's env?

Try putting the literal path to Ruby there instead.


James
 
A

Ara.T.Howard

this is a problem that's been driving me nuts ever since i first tried it.

i can create simple, minimal scripts in Python, Perl, and PHP that run
flawlessly on the first try with minimal effort, both on my local testing
system (Apache 2.0.52 and Ruby 1.8.2) and on the server my personal site is
hosted on (Apache 1.3.33 and unknown version of Ruby - i'm trying to find
out). but no matter what i try, i simply can not get even the most minimal
ruby script to function:

#!/usr/bin/env ruby

print "Content-type: text/html\n\n"
print "<html><body>Hello World!</body></html>\n"

it runs perfectly fine at the console, no warnings, no errors, no problems.
but as a CGI script, it's another story: i get an error 500 and the cryptic
(and seemingly common) "Premature end of script headers". no other warnings
or errors. if i simply change "ruby" to "python" on the shebang line, the
above script magically works with no other effort on my part.

nothing magic about it:

[ahoward@localhost ~]$ cat a.rb
#!/usr/bin/env ruby
print "Content-type: text/html\n\n"
print "<html><body>Hello World!</body></html>\n"

[ahoward@localhost ~]$ cat a.py
#!/usr/bin/env python
print "Content-type: text/html\n\n"
print "<html><body>Hello World!</body></html>\n"

[ahoward@localhost ~]$ a.rb | od -c > a.rb.out

[ahoward@localhost ~]$ a.py | od -c > a.py.out

[ahoward@localhost ~]$ diff -u a.rb.out a.py.out
--- a.rb.out 2005-05-21 17:58:33.000000000 -0600
+++ a.py.out 2005-05-21 17:58:35.000000000 -0600
@@ -1,5 +1,6 @@
0000000 C o n t e n t - t y p e : t e
-0000020 x t / h t m l \n \n < h t m l > <
-0000040 b o d y > H e l l o W o r l d
-0000060 ! < / b o d y > < / h t m l > \n
-0000100
+0000020 x t / h t m l \n \n \n < h t m l >
+0000040 < b o d y > H e l l o W o r l
+0000060 d ! < / b o d y > < / h t m l >
+0000100 \n \n
+0000102

or, put another way:

harp:~ > ruby -e 'print 42' | od -c
0000000 4 2
0000002

harp:~ > python -c 'print 42' | od -c
0000000 4 2 \n
0000003


so you were just lucky that python and perl were sending you 'extra' newline.
you'd have even more issues if you did something like on a unix vs windows box
and it's the reason cgi abstraction are made.

this will work no matter what platform:

[ahoward@localhost ~]$ cat a.rb
#!/usr/bin/env ruby
require 'cgi'
CGI::new.out{ "<html><body>Hello World!</body></html>\n" }

[ahoward@localhost ~]$ ruby a.rb < /dev/null
Content-Type: text/html
Content-Length: 39

<html><body>Hello World!</body></html>
[ahoward@localhost ~]$ ruby a.rb < /dev/null | od -c
0000000 C o n t e n t - T y p e : t e
0000020 x t / h t m l \r \n C o n t e n t
0000040 - L e n g t h : 3 9 \r \n \r \n <
0000060 h t m l > < b o d y > H e l l o
0000100 W o r l d ! < / b o d y > < /
0000120 h t m l > \n
0000126


you'll also note that cgis are supposed to send '\r\n' not '\n\n' so the other
two never really should have worked anyhow ;-)
i'm going insane because nothing, AFAICT, is wrong. the server is correctly
set-up, permissions are correct, ownership is correct, ruby is installed and
working, yet NOTHING seems to coax it into working. it repeatedly reports
this incredibly uninformative "Premature end of script headers" error.

this is because the script headers prematurely ended before the content started
since \r\n was never seen ;-)
is there something i could have missed? a possible misconfiguration? or
does ruby just hate me?

doubtful ;-)

-a
--
===============================================================================
| email :: ara [dot] t [dot] howard [at] noaa [dot] gov
| phone :: 303.497.6469
| My religion is very simple. My religion is kindness.
| --Tenzin Gyatso
===============================================================================
 
E

ES

Le 21/5/2005 said:
this is a problem that's been driving me nuts ever since i first tried
it.

i can create simple, minimal scripts in Python, Perl, and PHP that run
flawlessly on the first try with minimal effort, both on my local
testing system (Apache 2.0.52 and Ruby 1.8.2) and on the server my
personal site is hosted on (Apache 1.3.33 and unknown version of Ruby -
i'm trying to find out). but no matter what i try, i simply can not
get even the most minimal ruby script to function:

#!/usr/bin/env ruby

print "Content-type: text/html\n\n"
print "<html><body>Hello World!</body></html>\n"

it runs perfectly fine at the console, no warnings, no errors, no
problems. but as a CGI script, it's another story: i get an error 500
and the cryptic (and seemingly common) "Premature end of script
headers". no other warnings or errors. if i simply change "ruby" to
"python" on the shebang line, the above script magically works with no
other effort on my part.

This, actually, goes to the HTTP spec. Try this:

#!/bin/env/ ruby
print "HTTP/1.0 200 OK\r\n"
print "Content-type: text/html\r\n\r\n"
print said:
i'm going insane because nothing, AFAICT, is wrong. the server is
correctly set-up, permissions are correct, ownership is correct, ruby
is installed and working, yet NOTHING seems to coax it into working.
it repeatedly reports this incredibly uninformative "Premature end of
script headers" error.

is there something i could have missed? a possible misconfiguration?
or does ruby just hate me?

E
 
G

greyfade

(apologies to ES: i hit "reply to author" entirely by accident.)
This, actually, goes to the HTTP spec. Try this:

#!/bin/env/ ruby
print "HTTP/1.0 200 OK\r\n"
print "Content-type: text/html\r\n\r\n"
print "<html><body>Hello World!</body></html>\n"

does not work. see quoted below.
 
G

greyfade

James said:
(e-mail address removed) wrote:

Given this:


What user is executing the script, and is ruby in that user's env?
the user(s) i control, in both cases, and yes, it is in the env. the
script works executing with the same command as in the shebang line
from a commond console.
Try putting the literal path to Ruby there instead.
no effect.

again, i've tried everything. i still get an error 500, but *ONLY*
with ruby scripts. _no_other_language_ gives me this trouble.
 
G

greyfade

Ara.T.Howard said:
nothing magic about it:
would it have been better if i'd said "works as expected" or "begins
working as expected" instead of "magically"? you seem to have missed
everything else in my post.
or, put another way:

harp:~ > ruby -e 'print 42' | od -c
0000000 4 2
0000002

harp:~ > python -c 'print 42' | od -c
0000000 4 2 \n
0000003


so you were just lucky that python and perl were sending you 'extra' newline.
you'd have even more issues if you did something like on a unix vs windows box
and it's the reason cgi abstraction are made.
irrelevant. running the script locally at a console produces the
expected result: ruby gives two newlines (resulting in one blank line)
after the Content-Type header and Python gives three newlines
(resulting in two). by my understanding, the extra newline in python
*SHOULDN'T* work.
you'll also note that cgis are supposed to send '\r\n' not '\n\n' so the other
two never really should have worked anyhow ;-)
irregardless, they *DID*. so stop nitpicking and telling me things i
already know.
error.

this is because the script headers prematurely ended before the content started
since \r\n was never seen ;-)
not true. the script works in Python and Perl perfectly without
"\r\n". if that's out of spec, so be it. i'll be sure to obsrve the
spec in the future and use "\r\n" from now on.

but writing a script to produce *identical* output compared to the ruby
script in other programming languages WORKS FINE in CGI.
_RUBY_DOES_NOT_ and this is the issue i've come asking for help on.
your nitpicking on irrelevant details does not help to further anything.
 
G

greyfade

(apologies to ES for email.)
This, actually, goes to the HTTP spec. Try this:

#!/bin/env/ ruby
print "HTTP/1.0 200 OK\r\n"
print "Content-type: text/html\r\n\r\n"
print "<html><body>Hello World!</body></html>\n"
not the case, apparently. it works happily with "\n" instead of "\r\n"
and doesn't seem to require the 200 header.

on one of my test servers, it turns out there is no ruby installed and
on another, it seems to be a major misconfiguration. so it seems
there's a lot i've missed as my original script runs unmodified on yet
another server.
 
G

greyfade

Ara.T.Howard wrote:
<snip a bunch of pointless drivel>

you missed everything i actually said in my post.

would it have helped if i had not said "magically worked" but instead
some more boring phrase like "worked as expected"? or would
"mystically worked" have thrown you off as well?

(if this message sounds condescending, it is. i was seriously offended
by the verbosity and tone of your post. apologies if you are
offended.)
error.

this is because the script headers prematurely ended before the content started
since \r\n was never seen ;-)
it works without any linefeeds. newlines are sufficient in all my test
cases, irregarldess of my choice of language. all platforms are
unix-based, and i've not touched Windows in quite some time, so i'm
unsure of its behavior or requirements.

if it's out of spec, it doesn't seem to matter.
doubtful ;-)
no, it turns out to be a major misconfiguration on my part. there is
something seriously wrong with one of my test environments. it works
on another server (one of my targets).
-a
--
===============================================================================
| email :: ara [dot] t [dot] howard [at] noaa [dot] gov
| phone :: 303.497.6469
| My religion is very simple. My religion is kindness.
| --Tenzin Gyatso
===============================================================================
 
E

ES

Le 23/5/2005 said:
Ara.T.Howard wrote:
<snip a bunch of pointless drivel>

you missed everything i actually said in my post.

would it have helped if i had not said "magically worked" but instead
some more boring phrase like "worked as expected"? or would
"mystically worked" have thrown you off as well?

(if this message sounds condescending, it is. i was seriously offended
by the verbosity and tone of your post. apologies if you are
offended.)

Yours is quite a poor attitude to take toward people who
are attempting to assist you on their own time, for free,
particularly in light of A) your example not being exactly
valid HTTP and B) that it appears the problem was somewhere
else altogether.

Hopefully your issue is solved, now. If it is not, feel free
to askfor further advice but please try to do so with civility
and respect.
it works without any linefeeds. newlines are sufficient in all my test
cases, irregarldess of my choice of language. all platforms are
unix-based, and i've not touched Windows in quite some time, so i'm
unsure of its behavior or requirements.

if it's out of spec, it doesn't seem to matter.

no, it turns out to be a major misconfiguration on my part. there is
something seriously wrong with one of my test environments. it works
on another server (one of my targets).

E
 
H

Hal Fulton

it works without any linefeeds. newlines are sufficient in all my test
cases, irregarldess of my choice of language. all platforms are
unix-based, and i've not touched Windows in quite some time, so i'm
unsure of its behavior or requirements.

if it's out of spec, it doesn't seem to matter.

I think that's dependent on the web server, or is it the browser?
Too late for my poor brain.

Some are "looser" than others, but Ara is quite right in saying
that it is supposed to be a CRLF combination.

It really is better to code to the spec -- better to work 100%
of the time than 98%.


Cheers,
Hal
 

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

Similar Threads

Ruby, CGI and HTML Forms 1
Ruby 1.9.1 gem command - can't find user for 500 2
Ruby CGI 0
Cgi and file access 8
rhtml and apache trouble 5
CGI and Methods?? 5
Ruby a good choice for CGI? 23
perl and CGI 23

Members online

No members online now.

Forum statistics

Threads
473,969
Messages
2,570,161
Members
46,705
Latest member
Stefkari24

Latest Threads

Top