Введение

Simple Common Gateway Interface (SCGI) — это протокол для взаимодействия приложений с HTTP-серверами, являющийся альтернативой протоколу CGI. Он аналогичен FastCGI, но разработан с учетом упрощения разбора. В отличие от CGI, SCGI позволяет длительно работающему процессу обслуживания продолжать обработку запросов, избегая задержек в ответах, вызванных накладными расходами на настройку (например, подключением к базе данных). SCGI — это протокол, определяющий связь между веб-сервером и сервером приложений. Это отличается от CGI, который представляет собой более ранний интерфейс приложения (шлюз), предназначенный для того, чтобы программист приложения мог избежать сложности работы с сокетами и длительно работающими процессами обслуживания, когда допустимы низкая масштабируемость и высокие накладные расходы. Протокол SCGI использует тот факт, что веб-сервер уже выполнил разбор и проверку HTTP-запроса и передает запрос серверу SCGI в каноническом виде, избавляя программиста приложения от необходимости разбирать неоднозначности и граничные случаи протокола. Это позволяет избежать сложных правил разбора и объединения заголовков, определенных в RFC 2616, что значительно упрощает процесс работы сервера SCGI.

История

Нил Шемэнауэр опубликовал оригинальную спецификацию протокола SCGI, датированную октябрем 2001 года. Он разработал первые реализации SCGI и впервые опубликовал их в апреле 2002 года.

Спецификация

Клиент подключается к SCGI-серверу по надёжному протоколу потока, обеспечивающему передачу 8-битных байтов. Клиент начинает с отправки запроса. Когда SCGI-сервер определяет конец запроса, он отправляет ответ и закрывает соединение. Формат ответа протоколом не определён, однако обычно используются ответы HTTP, эквивалентные CGI.

Формат запроса

Запрос SCGI представляет собой конкатенацию заголовков, закодированных в формате netstring, и тела. Ответ SCGI — это обычный HTTP-ответ. Каждый заголовок состоит из пары имя-значение, где и имя, и значение являются null-терминированными строками (C-строками). Значение может быть пустой строкой, в этом случае завершающий null-символ всё равно остаётся. Ни имя, ни значение не могут содержать встроенные null-байты. Эти требования стандартны для C-строк, но часто вызывают путаницу у программистов, привыкших к другим стандартам обработки строк. Все предоставленные заголовки объединяются в единую последовательность байтов, а затем кодируются в формате netstring. Далее, при наличии, добавляется необработанное тело. Дублирующие имена в заголовках запроса недопустимы; объединение заголовков, соответствующее RFC 2616, должно быть выполнено заранее. Первый заголовок запроса должен иметь имя "CONTENT LENGTH" и значение, равное длине тела запроса в десятичном формате. Заголовок запроса "CONTENT LENGTH" всегда должен присутствовать, даже если его значение равно "0". Также всегда должен присутствовать заголовок запроса с именем "SCGI" и значением "1". Для обеспечения совместимости при преобразовании старых CGI-программ в SCGI, стандартные переменные окружения CGI должны быть предоставлены в заголовках SCGI. Тело запроса (если оно есть) следует за заголовками; его длина указывается в заголовке запроса "CONTENT LENGTH". Хотя протокол SCGI изолирует разработчика сервиса от некоторых аспектов HTTP, различные детали (например, интерпретация октетов тела сообщения в соответствии с заголовком Transfer Encoding, а также то, что CONTENT LENGTH представляет собой количество октетов после кодирования тела для передачи и т.д.) всё ещё требуют знания спецификации протокола HTTP.