Технология CGI разработана для выполнения на сервере прикладных программ по запросам из браузеров. Определение нужной прикладной программы, ее активация/дезактивация, передача параметров выполняются программой-посредником, иначе называемой шлюзом. Спецификация CGI не зависит от платформы.
Технология CGI обычно реализуется либо с использованием программ, написанных на языке PERL (Practical Extraction and ReportLanguage), либо с помощью приложений, созданных с применением языка С и откомпилированных непосредственно на сервере.
Как правило, посредник CGI находится на сервере в специальном каталоге cgi-bin, он является обработчиком запросов, идущих от браузера. Обращение к каталогу осуществляется по ссылке, например:
<A HREF="url_сценария?передаваемые_параметры">
ссылочная фраза
</A>
Обычно url_сценария имеет вид http://<имя_сервера>/cgi-bin/<имя_прикладной_программы>. Передаваемые_параметры могут содержаться или в самой ссылке, или в теле HTTP-сообщения (в случае использования методов POST или PUT). Информация о передаваемых_параметрах представляется в следующей форме:
имя=значение&имя1=значение1&..,
где имя- имя переменной, значение - ее реальное значение.
Сервер определяет тип URL, то есть то, что это именно сценарий, а не простой HTML-текст, либо по маршрутному имени ресурса (обычно - каталог cgi-bin), либо по расширению имени файла (обычно *.cgi). Запускается соответствующий обработчик. Выполняется предназначенная для вызова CGI программ функция CreateProcess() с помощью командной строки следующего формата:
WinCGI-exe cgi-data-file
где WinCGI-exe - это полный путь к исполняемой CGI программе; cgi-data-file - полный путь к CGI файлу данных.
Если браузер обращается к документу не в HTML-формате, то посредник преобразует форму документа в HTML-формат и возвращает его браузеру. Пример CGI-программы — WebDBC, организующей связь Web-сервера через ODBC-драйверы с нужными СУБД.
Сервер синхронизируется с CGI программой, поскольку он должен определить момент завершения CGI программы. Это достигается использованием специальной функции Win32, ожидающей получения сигнала завершения CGI программы.
Сервер использует CreateProcess() для запуска процесса, не имеющего главного окна. Вызванный процесс не будет отображаться каким либо образом на мониторе сервера.
Некоторые серверы поддерживают режим отладки CGI программ и скриптов, что позволяет серверу запускать CGI программу как обычный процесс с созданием главного окна и отображением информации на мониторе сервера. Данный способ весьма удобен на стадии отладки CGI программ.
Примечание 1
CGI файл данных состоит из нескольких секций.
Секция [CGI] содержит большинство специфических CGI параметров (тип доступа, тип запроса, дополнительные заголовки, определенные в других секциях и т.п.). Каждое значение представлено в виде символьной строки. Если значение является пустой строкой, то данный параметр был опущен. К числу параметров относятся:
  • Название и модификация информационного протокола, использованного для передачи данного запроса. Формат: протокол/модификация. Пример: "HTTP/1.0".
  • Метод, который использовался для данного запроса. Для HTTP это "GET", "HEAD", "POST" и т.д.
  • Логический путь к исполняемой CGI программе.
  • Путь к ресурсам, необходимым для выполнения данного запроса, и др.
Секция [Accept] содержит типы данных, посылаемых клиентом, найденные в заголовке запроса в виде Accept: type/subtype {parameters}
Секция [System] содержит параметры, специфические для Windows реализации CGI:
Секция [Extra Headers] содержит "дополнительные" заголовки, которые включены в запрос в виде "параметр=значение". Сервер должен раскодировать как параметр, так и его значение прежде чем они будут помещены в файл данных CGI.
Секция [Form Literal] содержит данные в виде "параметр=значение&параметр=значение&...", полученные по POST из формы и раскодированные сервером.
CGI программа возвращает результат работы, отвечающий (явно или неявно) целям запроса. Сервер кодирует результат работы в соответствии со стандартом HTTP и использует HTTP для отправки результата клиенту. Это означает, что сервер добавляет необходимый HTTP заголовки в сообщение, формируемое CGI программой.
Результат работы CGI программы состоит из двух частей: заголовка и тела сообщения. Заголовок состоит из одной или более строк текста, отделенных от тела пустой строкой. Тело сообщения содержит данные, представленные в MIME формате, указанном в заголовке.
Сервер не изменяет тело документа, что означает, что сервер передает сформированный CGI программой ответ "как он есть".
Главный недостаток технологии CGI - низкая скорость выполнения запросов пользователей.
Альтернативный подход - использование интерфейсов API, например NSAPI (API для Netscape), ISAPI (API для IIS), API для Apache. Суть API-интерфейсов заключается в повышении производительности работы сервера за счет того, что новых полноценных процессов для выполнения запросов не порождается. Главный недостаток API - сложность его использования, поскольку для написания API-приложения необходимы глубокие знания архитектуры сервера и ее реализации.