Программа CGI получает данные из переменных среды и стандартного потока ввода STDIN (в случае применения метода доступа POST). Расширение ISAPI делает это по-другому.
Функция HttpExtensionProc получает указатель на структуру типа EXTENSION_CONTROL_BLOCK, некоторые поля которой заполняются сервером и должны использоваться для получения входных данных. Прежде всего это поле lpszMethod, через которое передается метод, использованный для посылки данных (GET или POST), поле lpszQueryString, в котором передаются параметры запуска расширения или данные при использовании метода GET, а также другие поля, описанные выше.
Через структуру EXTENSION_CONTROL_BLOCK передаются адреса функций GetServerVariable и ReadClient, специально предназначенных для получения данных от навигатора удаленного пользователя.
Прототип функции GetServerVariable определен в структуре EXTENSION_CONTROL_BLOCK, описанной нами ранее:
Через параметр 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.