Основные концепции
Шлюз осуществляет свой вывод в стандартный поток вывода. Этот вывод может представлять собой или документ, сгенерированный шлюзом, или
инструкции серверу, где получить необходимый документ.
Как правило, шлюз производит свой вывод, который интерпретируется и посылается обратно клиенту. Преимущество этого подхода состоит в том,
что шлюз не должен посылать полный HTTP/1.0 заголовок на каждый запрос.
Заголовок выходного потока
Для некоторых шлюзов может быть необходимо избегать обработки сервером их вывода, и общаться с клиентом непосредственно. Для того, чтобы
отличить такие шлюзы от остальных, CGI требует, чтобы их имена начинались с префикса nph-. В этом случае, на шлюзе лежит ответственность
за возвращение клиенту синтаксически правильного ответа.
Заголовки с синтаксическим разбором
Вывод шлюза начинается с маленького заголовка. Он содержит текстовые строки, в том же формате, как и в HTTP заголовке и завершается пустой
строкой (содержащей только символ перевода строки или CR/LF).
Любые строки заголовка, не являющиеся директивами сервера, посылаются непосредственно клиенту. В настоящий момент, CGI спецификация определяет
три директивы сервера:
Content-type
MIME тип возвращаемого документа.
Location
Это поле используется в случае, когда необходимо указать серверу, что возвращается не сам документ, а ссылка на него.
Если аргументом является URL, то сервер передаст клиенту указание на перенаправление запроса. Если аргумент представляет собой виртуальный путь,
сервер вернет клиенту заданный этим путем документ, как если бы клиент запрашивал его непосредственно.
Status
Эта директива используется для задания серверу HTTP/1.0 строки-статус, которая будет послана клиенту. Формат: nnn xxxxx, где nnn - 3-х
цифровой статус-код, и xxxxx строка причины, такая, как "Forbidden" (Запрещено).
Примеры
Предположим, имеется некоторый текстовый конвертер в HTML. Когда он оканчивает свою работу, он должен произвести следующий вывод в
стандартный выходной поток:
--- начало вывода ---
Content-type: text/html
--- конец вывода ---
Теперь рассмотрим шлюз, который, в некоторых случаях, должен выдать документ /path/doc.txt с данного сервера, как если бы он был
непосредственно востребован клиентом через http://server:port/path/doc.txt
В этом случае вывод шлюза будет таков:
--- начало вывода ---
Location: /path/doc.txt
--- конец вывода ---
Наконец, предположим, что шлюз возвращает ссылки на gopher сервер, например на gopher://gopher.ncsa.uiuc.edu/