Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ПОКС.docx
Скачиваний:
69
Добавлен:
26.05.2015
Размер:
1.82 Mб
Скачать

Получение данных расширением isapi

Программа CGI получает данные из переменных среды и стандартного потока ввода STDIN (в случае применения метода доступа POST). Расширение ISAPI делает это по-другому.

Функция HttpExtensionProc получает указатель на структуру типа EXTENSION_CONTROL_BLOCK, некоторые поля которой заполняются сервером и должны использоваться для получения входных данных. Прежде всего это поле lpszMethod, через которое передается метод, использованный для посылки данных (GET или POST), поле lpszQueryString, в котором передаются параметры запуска расширения или данные при использовании метода GET, а также другие поля, описанные выше.

Через структуру EXTENSION_CONTROL_BLOCK передаются адреса функций GetServerVariable и ReadClient, специально предназначенных для получения данных от навигатора удаленного пользователя.

Функция GetServerVariable

Прототип функции GetServerVariable определен в структуре EXTENSION_CONTROL_BLOCK, описанной нами ранее:

BOOL (WINAPI * GetServerVariable)(HCONN hConn,

LPSTR lpszVariableName, LPVOID lpvBuffer, LPDWORD lpdwSize);

Через параметр hConn вы должны передать этой функции идентификатор канала, полученный через поле ConnID структуры EXTENSION_CONTROL_BLOCK.

Параметр lpszVariableName должен содержать указатель на строку имени переменной, содержимое которой необходимо получить. Это содержимое будет записано функцией в буфер, адрес которого передается через параметр lpvBuffer, а размер - через параметр lpdwSize.

Ниже мы перечислили возможные значения строк, передаваемых через параметр lpszVariableName:

·       AUTH_TYPE

Переменная среды AUTH_TYPE содержит тип идентификации, который применяется сервером.

·       HTTP_ACCEPT

В этой переменной перечислены типы данных MIME, которые могут быть приняты навигатором от сервера WWW.

·       CONTENT_LENGTH

Количество байт данных, которые расширение ISAPI должно получить от навигатора.

·       CONTENT_TYPE

Тип данных, присланных навигатором.

·       PATH_INFO

Путь к виртуальному каталогу, в котором находится библиотека DLL расширения ISAPI.

·       PATH_TRANSLATED

Физический путь к библиотеки DLL расширения ISAPI.

·       QUERY_STRING

Строка параметров, указанная в форме или операторе ссылки <A>. Эта строка указывается после адреса URL библиотеки DLL расширения ISAPI вслед за разделительным символом “?”.

·       REMOTE_ADDR

Адрес IP узла, на котором работает навигатор удаленного пользователя.

·       REMOTE_HOST

Доменное имя узла, на котором работает навигатор удаленного пользователя. Если эта информация недоступна (например, для узла не определен доменный адрес), то вместо доменного имени указывается адрес IP, как в переменной REMOTE_ADDR.

·       REMOTE_USER

Имя пользователя, которое используется навигатором для аутентификации.

·       UNMAPPED_REMOTE_USER

Имя пользователя до обработки фильтром ISAPI, которое используется навигатором для аутентификации.

·       REQUEST_METHOD

Метод доступа, который используется для передачи данных от навигатора серверу WWW.

·       SCRIPT_NAME

В эту переменную записывается путь к виртуальному каталогу и имя библиотеки DLL расширения ISAPI. Анализируя эту переменную, расширение ISAPI может определить путь к своему загрузочному файлу.

·       SERVER_NAME

Доменное имя сервера WWW или адрес IP сервера WWW, если доменное имя недоступно или не определено.

·       SERVER_PROTOCOL

Имя и версия протокола, который применяется для выполнения запроса к расширению ISAPI.

·       SERVER_PORT

Номер порта, на котором навигатор посылает запросы серверу WWW.

·       SERVER_PORT_SECURE

Если обработка запроса выполняется через защищенный порт, в этой строке записано значение 1, а если через незащищенный - значение 0.

·       SERVER_SOFTWARE

Название и версия программного обеспечения сервера WWW. Версия следует после названия и отделяется от последнего символом “/”.

·       ALL_HTTP

Строка, закрытая двоичным нулем, в которую записаны значения всех переменных, имеющих отношение к протоколу HTTP. Это, например, такие переменные как HTTP_ACCEPT, HTTP_CONNECTION, HTTP_USER_AGENT и так далее.

Извлекать содержимое отдельных переменных ваша программа должна самостоятельно. При этом следует учесть, что названия переменных отделены от их значений символом двоеточия “:”, а поля переменных разделены символом перевода строки.

Обратите внимание, что названия этих строк почти совпадают с названиями переменных среды, создаваемых для программ CGI, однако совпадение все же не полное.

В случае успешного завершения функция GetServerVariable возвращает значение TRUE, а при возникновении ошибки - значение FALSE. Код ошибки можно определить с помощью функции GetLastError, вызвав ее сразу после функции GetServerVariable. Эта функция может вернуть в данном случае следующие коды ошибок:

Код ошибки

Описание

ERROR_INVALID_INDEX

Неправильное имя переменной, передаваемой через параметр lpszVariableName

ERROR_INVALID_PARAMETER

Неправильное значение параметра hConn

ERROR_INSUFFICIENT_BUFFER

Буфер, адрес которого указан с помощью параметра lpvBuffer, слишком мал. Необходимый размер буфера записывается по адресу, который был передан функции через параметр lpdwSize

ERROR_MORE_DATA

Буфер, адрес которого указан с помощью параметра lpvBuffer, слишком мал. В результате данные были прочитаны частично, причем размер буфера, необходимый для чтения всех данных, неизвестен

ERROR_NO_DATA

Данные не были получены

Ниже мы привели пример использования функции GetServerVariable для получения содержимого переменной с именем ALL_HTTP в буфер szTempBuf.

CHAR szTempBuf[4096];

DWORD dwSize;

dwSize = 4096;

lpECB->GetServerVariable(lpECB->ConnID,

(LPSTR)"ALL_HTTP", (LPVOID)szTempBuf, &dwSize);

strcat(szBuff, szTempBuf);

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]