печать нескольких заголовков HTTP в Perl - PullRequest
0 голосов
/ 05 апреля 2019

Я пытаюсь запустить устаревшее веб-приложение Perl на основе TetraBB под Apache2 в Debian.

Это приложение использует print для вывода заголовков HTTP, например, print "Content-type: text/html\n";.

ОднакоПохоже, что после первого print дальнейшие заголовки не принимаются.В этом примере: print "A\n"; print "B\n"; print "\n";, заголовок A распознается браузером как заголовок ответа, тогда как B заканчивается в верхней части HTML-ответа.

Запись print "A\nB\n\n"; работает.

Кроме того, если первый print не содержит \n\n, генерируется 500 Internal Server Error.

Что является причиной такого поведения и что я могу сделать, чтобы это работало?

Ответы [ 2 ]

3 голосов
/ 06 апреля 2019

Нет разницы между

print "Content-Type: text/html\n";
print "Set-Cookie: ...\n";
print "\n";

и

print "Content-Type: text/html\nSet-Cookie: ...\n\n";

, если вы не изменили что-то, что делает их особенными (например, $\). Фактически, если вы не включили автоматическую очистку для STDOUT, выходные данные будут накапливаться в буфере, который будет отправлен в канал по 4 или 8 КиБ. Это означает, что нет абсолютно никакой заметной разницы с другим концом трубы.

1 голос
/ 06 апреля 2019

На самом деле вы выводите CGI-заголовки , которые сервер затем преобразует в ответные заголовки с правильными окончаниями строк.Заголовки CGI останавливаются после первого двойного перевода строки.Не печатайте два последовательных перевода строки, пока вы не будете готовы завершить заголовки, и печатайте их, когда вам нужно завершить заголовки:

print <<HEADERS;
Content-type: text/plain
X-Some-Other: header

This is the body
HEADERS

Некоторые серверы имеют ограничения по количеству заголовков и по длинезаголовков строк.Ваш журнал ошибок может сказать больше об этом.

Чтобы быть более полезным, нам нужно увидеть какой-то реальный код.Короткая программа, которая демонстрирует проблему, вероятно, поможет вам понять это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...