Формат базового протокола CGI. Примеры

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

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

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

Указывать мне на подробный RFC бесполезно.

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


person unixman83    schedule 21.05.2011    source источник
comment
RFC 3875: tools.ietf.org/html/rfc3875   -  person Travis Gockel    schedule 21.05.2011


Ответы (1)


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

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

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

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

#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 specific variables:
    • SERVER_SOFTWARE — name/version of HTTP server.
    • SERVER_NAME — имя хоста сервера, может быть десятичным IP-адресом.
    • GATEWAY_INTERFACE — CGI/версия.
  • Request specific variables:
    • SERVER_PROTOCOL — HTTP/version.
    • 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 application/x-www-form-urlencoded.
    • REMOTE_HOST — имя хоста клиента, сбрасывается, если сервер не выполнял такой поиск.
    • REMOTE_ADDR — IP-адрес клиента (десятичный с точкой).
    • AUTH_TYPE — тип идентификации, если применимо.
    • REMOTE_USER используется для определенных AUTH_TYPE.
    • REMOTE_IDENT — видеть 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

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

person paxdiablo    schedule 21.05.2011
comment
Это это протокол CGI. - person Ken White; 21.05.2011
comment
@ unixman83, я обновил ответ, добавив больше деталей. Больше подробностей, чем это, вероятно, превратит этот ответ в копию подробного RFC, поэтому вам, вероятно, следует сослаться на это, если вы хотите получить более подробную информацию :-) - person paxdiablo; 21.05.2011
comment
extern char **environ; — это правильный переносимый (POSIX) способ доступа к переменным среды в виде массива. envp нет. Кстати, вы можете так же легко использовать getenv, который является чистым C, если вы знаете имена переменных, которые хотите. - person R.. GitHub STOP HELPING ICE; 21.05.2011