2011-09-07 2 views
2

Я меняю некоторые скрипты на Perl в существующем решении. Из-за некоторых изменений при обновлении (Windows) сервера я переключил их с работы ISAPI на CGI. Это означает, что теперь мне нужно отправить Content-Type вручную или он не удастся.Perl-буферный выход

Поэтому мне нужно включить буферизацию вывода (инструкции печати, так что STDOUT), отправить Content-Type: text/html, но в случаях, когда это перенаправление, мне нужно очистить выходной буфер и отправить новый заголовок.

Как это сделать?

Или есть другой способ? Обратите внимание, что скрипт уже использует print для вывода HTML, и я не могу его изменить. (Это было написано в начале 90-х годов.)

select(STDOUT); 
$| = 0; 
print "Content-Type: text/html\n\n"; 
# somehow clear output 
print "Location: login.pl\n\n"; 

ответ

6

Вы не можете «отменить» print в STDOUT. Вам нужно решить, генерируете ли вы вывод HTML или перенаправлять до, вы отправляете что-либо в STDOUT.

Один из способов сделать это было бы select буфер в памяти вместо STDOUT:

my $buffer = ''; 
open(my $out, '>', \$buffer) or die; 
select($out); 
print "Content-Type: text/html\n\n"; 

if (generate_redirect) { 
    print STDOUT "Location: login.pl\n\n"; 
} else { 
    print STDOUT $buffer; 
} 

Как только вы уверены, что вы не будете получать редирект, вы можете повторно select STDOUT и выходной буфер:

select STDOUT; 
print $buffer; 
print "<p>HTML now goes to client instead of \$buffer</p>\n"; 
+0

Итак, ответ на этот вопрос НЕТ. Поэтому я взял на себя задачу ручного обновления всех скриптов для правильной отправки заголовка. Благодарю. –

1

Один из самых безопасных (ИМО) способов сделать это, чтобы положить всю логику вам нужно решить, хотите ли вы, чтобы перенаправить или не в верхней части вашего сценарий, до вы выводите что-нибудь еще.

Если вы не хотите вообще менять исходный скрипт, напишите отдельный скрипт, который просто выполняет логику перенаправления/типа контента и после этого вызывается ваш исходный сценарий, если это необходимо.

0

Один ответ, который не был покрыт просто заменить ручку STDOUT по умолчанию на другую ручку в Бегине, то обработка его в КОНЦЕ добавления Content-Type: text/html\n\n, если нет заголовка. Уродливый, но должен работать ... теоретически.