Формат основного протокола CGI.Примеры - PullRequest
1 голос
/ 21 мая 2011

Я пишу программу C CGI

Для запросов GET я предполагаю, что вся информация каким-то образом хранится в getenv ().Мой вопрос заключается в том, как этот массив выглядит как основной запрос CGI от веб-сервера.С двумя параметрами, например, username = и password =.

Для запроса POST я не уверен.Я читал, что материал обрабатывается на стандартном вводе.Как выглядят эти строки, которые передаются в CGI-программу через стандартный ввод (с веб-сервера)?

Указание на подробный RFC бесполезно.

Любая книга?Меня особенно интересуют подробности протокола низкого уровня.Я уже знаю, как писать приложения CGI с помощью вспомогательных библиотек ... Мне просто нужно знать семантику этих вспомогательных библиотек.

1 Ответ

3 голосов
/ 21 мая 2011

envp не является стандартом (ну, во всяком случае, не стандартом ISO C или C ++, хотя POSIX может иметь что-то для этого).

Тем не менее, envp - это почти тот же формат, что и argv, за исключением того, что у него нет управляющего argc для его ограничения.

Каждый envp[x] будет иметь форму "key=value", где key - это имя переменной среды, а value - это ее значение, что удивительно: -)

Вы должны обрабатывать элементы последовательно, пока не получите нулевой указатель, что-то вроде:

#include <stdio.h>
int main (int argc, char *argv[], char *envp[]) {
    int i = 0;
    while (envp[i] != NULL)
        printf ("[%s]\n", envp[i++]);
    return 0;
}

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

Копирование соответствующего материала, чтобы этот ответ был автономным:

  • Переменные, специфичные для сервера:
    • SERVER_SOFTWARE - имя / версия HTTP-сервера.
    • SERVER_NAME - имя хоста сервера, может быть десятичным десятичным IP-адресом.
    • GATEWAY_INTERFACE - CGI / версия.
  • Запрос конкретных переменных:
    • SERVER_PROTOCOL - HTTP / версия.
    • SERVER_PORT - порт TCP (десятичный).
    • REQUEST_METHOD - имя метода HTTP (см. Выше).
    • PATH_INFO - суффикс пути, если он добавляется к URL-адресу после имени программы и косой черты.
    • PATH_TRANSLATED - соответствующий полный путь, как предполагается сервером, если присутствует PATH_INFO.
    • SCRIPT_NAME - относительный путь к программе, например /cgi-bin/script.cgi.
    • QUERY_STRING - часть URL после? персонаж. Может состоять из пар * имя = значение, разделенных амперсандами (например, var1 = val1 & var2 = val2…), когда они используются для отправки данных формы, переданных с помощью метода GET, как определено в приложении HTML / x-www-form-urlencoded.
    • REMOTE_HOST - имя хоста клиента, сбрасывается, если сервер не выполнял такой поиск.
    • REMOTE_ADDR - IP-адрес клиента (десятичная точка).
    • AUTH_TYPE - тип идентификации, если применимо.
    • REMOTE_USER используется для определенных AUTH_TYPE.
    • REMOTE_IDENT - видеть идентификатор, только если сервер выполнил такой поиск.
    • CONTENT_TYPE - MIME-тип входных данных, если используется метод PUT или POST, как предусмотрено в заголовке HTTP.
    • CONTENT_LENGTH - аналогично, размер входных данных (десятичный, в октетах), если он предоставляется через заголовок HTTP.
    • Переменные, передаваемые пользовательским агентом (HTTP_ACCEPT, HTTP_ACCEPT_LANGUAGE, HTTP_USER_AGENT, HTTP_COOKIE и, возможно, другие), содержат значения соответствующих заголовков HTTP и, следовательно, имеют тот же смысл.

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

В частности, для POST переменные среды включаются перед первой пустой строкой запроса (той, которая вводит тело сообщения). Они имеют вид:

Content-Type: application/wonderful_app_by_pax
Content-Length: 314159

где ключ нечувствителен к регистру, а значение следует за двоеточием.

...