Страница 1 из 1

Ruby, Premature end of script headers

Добавлено: 11 апр 2008, 14:28
sm
Из переписки с хостером.
[...]Сейчас у меня работает на сайте несколько php скриптов, и я хотел
бы переписать их на ruby. Но не получается просто запустить скрипт,
возможно я делаю что-то не так. Может вы подскажите что?

Создал файл 1.rb, закинул его в cgi-bin, сделал исполняемым, запустил:
http://www.удалено.by/cgi-bin/1.rb
Выдает ошибку, можете проверить, файл я не удалял:
The server encountered an internal error or misconfiguration and was
unable to complete your request.
Please contact the server administrator, удалено@удалено.by and
inform them of the time the error occurred, and anything you might
have done that may have caused the error.
More information about this error may be available in the server error log.

Содержимое файла:
#!/usr/bin/ruby
puts "Content-type: text/html\n\n"
puts "<html><body>This is a test It's #{Time.now}</body></html>\n"

В удалено.by.error.log:
[Fri Apr 04 11:17:11 2008] [error] [client 86.57.195.146] failed to open log file
[Fri Apr 04 11:17:11 2008] [error] [client 86.57.195.146] fopen: Permission denied
[Fri Apr 04 11:17:11 2008] [error] [client 86.57.195.146] Premature end of script headers: 1.rb
Здравствуйте,

Логи указывают на то, что скрипт неправильный. Читайте документацию по ruby.
Почитал книги, погуглил. Пробовал следующее:
- #!/usr/bin/ruby заменял на #!/usr/bin/env ruby
- менял различные права доступа для каталога и самого скрипта
- удалял .htaccess в каталоге со скритом, пробовал добавлять в него "AddHandler cgi-script .cgi .rb"
- пробовал сохранять файл в различных кодировках
- фтп-клиентом файл заливал и в двоичном и в текстовом режимах
- пробовал в puts-ах \n заменять на \r\n

Ошибка не исчезла. Может кто разруливал подобное?

Добавлено: 13 апр 2008, 00:09
Victor Gr.
sm, вряд ли, но всё же "Content-Type:".

В puts должно быть \n\n, да.

Исполняемым сделал для всех? (chmod a+x ?).

Почему в логах:
[Fri Apr 04 11:17:11 2008] [error] [client 86.57.195.146] failed to open log file
[Fri Apr 04 11:17:11 2008] [error] [client 86.57.195.146] fopen: Permission denied
?

Так же, попробуй создать там же скрипт на perl:

hello.pl:

Код: Выделить всё

#!/usr/bin/perl

print "Content-Type: text/plain\n\n";
print "Hello World!";
AddHandler cgi-script .pl в .htaccess

chmod a+x hello.pl

Будет работать?

Добавлено: 13 апр 2008, 00:25
grub
очень похоже на то что конфиг виртуал-хоста указывает на недоступный либо рид-онли лог-файл

где у тебя лог-файлы лежат? какие на них права?

перевод строки в HTTP и вообще

Добавлено: 13 апр 2008, 22:45
olecom
Victor Gr.,

Код: Выделить всё

print "Content-Type: text/plain\n\n";
                               ^^^^
Это Apache всё прожуёт и выплюнет. По всем правилам должно быть '\r\n' вместо просто '\n'.
Достаточно провести вот такой эксперимент в ближайшем эмуляторе терминала:

Код: Выделить всё

$ stty -onlcr ; printf '1\r\n2\r\n3\r\n----\n4\n5\n6\n' ; stty onlcr
Да, рога уNIX повсеместно.
_______

Добавлено: 14 апр 2008, 10:25
Eugene
Perl uses \n to represent a "logical" newline, regardless of platform. In MacPerl, \n always means \015. In DOSish Perls, \n usually means \012, but when accessing a file in "text mode", it is translated to (or from) \015\012, depending on whether you're reading or writing. Unix does the same thing on terminals in canonical mode. \015\012 is commonly referred to as CRLF.
(c) Programming Perl

Добавлено: 14 апр 2008, 10:34
olecom
Получаются классические многоуровни с параллельными багами.

Значит у перла ещё не одна библиотека для работы с хидерами есть,
только вот где они и как они работают порой вопрос?

По теме, похоже такой же абзац не помешал бы про руби.
____

Добавлено: 14 апр 2008, 11:26
grub
olecom писал(а): По теме, похоже такой же абзац не помешал бы про руби.
____

s/perl/ruby/
s/print/puts/g

:)

ascii в африке.

Добавлено: 14 апр 2008, 18:36
olecom
grub писал(а):
olecom писал(а): По теме, похоже такой же абзац не помешал бы про руби.
____
s/perl/ruby/
s/print/puts/g

:)
>> пробовал в puts-ах \n заменять на \r\n

а в них

> В puts должно быть \n\n, да.

тогда всё ясно :)

Хочу ещё раз подчеркнуть (не на перл примере), что HTTP (MS IIS) хочет ASCII \r\n на концах строки, так как оно и в африке ASCII.
_____

Добавлено: 15 апр 2008, 07:36
sm
Благодарю всех. Проблема разрулилась.

Права доступа лог файлов 440 заменены на 666. У меня не было к ним доступа, саппорт хостинга помог.
Проверил -- скрипты действительно запускаются только имея формат файла unix (в гвиме можно менять).
Проверил -- puts "Content-type: text/html\n\n" без двойного \n\n апач может прожует, но подавится. Выдает ошибку с одним \n или \r\n.

Тему можно закрыть.