Как я могу определить, назвали ли сценарий из командной строки или как cgi сценарий?

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

my $js = build_javascript();

if ( exists $ENV{HTTP_HOST} ) {
   print "Content-type: text/javascript\n\n";
}
print $js;

Существует ли лучший путь?

8
задан spudly 16 December 2009 в 14:26
поделиться

2 ответа

В соответствии со спецификацией CGI в RFC3875 (раздел 4.1.4.), Переменная среды GATEWAY_INTERFACE будет иметь решающее значение для проверки того, работаете ли вы в контексте CGI. :

4.1.4. GATEWAY_INTERFACE

Переменная GATEWAY_INTERFACE ДОЛЖНА быть установлена ​​на диалекте CGI. используется сервером для связи со сценарием.

18
ответ дан 5 December 2019 в 05:56
поделиться

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

Зная, что, если вы хотите выбрать одну переменную среды для использования, просто должен быть тот, который вы не устанавливаете в другой ситуации, или тот, который вы устанавливаете в обоих, но задаете разные значения. В этом случае выберите любую переменную среды, которая вам нравится.

Если вы хотите усложнить задачу, вы можете использовать что-то вроде IO :: Interactive , чтобы определить, подключены ли вы к терминалу. Если это не так, то файловый ханандл, который возвращает is_interactive , является нулевым дескриптором файла, и результат никуда не денется:

 print { is_interactive() } $http_header;

Если вам не нравится, как IO :: Interactive решает, вы может переопределить is_interactive . Это очень короткий фрагмент кода, а интерфейс более высокого уровня очень приятный.

Если вы хотите усложнить ситуацию, вы можете использовать что-то вроде IO :: Interactive , чтобы определить, подключены ли вы к терминалу. Если это не так, то файловый ханандл, который возвращает is_interactive , является нулевым дескриптором файла, и результат никуда не денется:

 print { is_interactive() } $http_header;

Если вам не нравится, как IO :: Interactive решает, вы может переопределить is_interactive . Это очень короткий фрагмент кода, а интерфейс более высокого уровня очень приятный.

Если вы хотите усложнить ситуацию, вы можете использовать что-то вроде IO :: Interactive , чтобы определить, подключены ли вы к терминалу. Если это не так, то файловый ханандл, который возвращает is_interactive , является нулевым дескриптором файла, и результат никуда не денется:

 print { is_interactive() } $http_header;

Если вам не нравится, как IO :: Interactive решает, вы может переопределить is_interactive . Это очень короткий фрагмент кода, а интерфейс более высокого уровня очень приятный.

вы можете повторно реализовать is_interactive . Это очень короткий фрагмент кода, а интерфейс более высокого уровня очень приятный.

вы можете повторно реализовать is_interactive . Это очень короткий фрагмент кода, а интерфейс более высокого уровня очень приятный.

8
ответ дан 5 December 2019 в 05:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: