Функция 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
- HTTP_ACCEPT
- CONTENT_LENGTH
- CONTENT_TYPE
- PATH_INFO
- PATH_TRANSLATED
- QUERY_STRING
- REMOTE_ADDR
- REMOTE_HOST
- REMOTE_USER
- UNMAPPED_REMOTE_USER
- REQUEST_METHOD
- SCRIPT_NAME
- SERVER_NAME
- SERVER_PROTOCOL
- SERVER_PORT
- SERVER_PORT_SECURE
- SERVER_SOFTWARE
- ALL_HTTP
Переменная среды AUTH_TYPE содержит тип идентификации, который применяется сервером.
В этой переменной перечислены типы данных MIME, которые могут быть приняты навигатором от сервера WWW.
Количество байт данных, которые расширение ISAPI должно получить от навигатора.
Тип данных, присланных навигатором.
Путь к виртуальному каталогу, в котором находится библиотека DLL расширения ISAPI.
Физический путь к библиотеки DLL расширения ISAPI.
Строка параметров, указанная в форме или операторе ссылки <A>. Эта строка указывается после адреса URL библиотеки DLL расширения ISAPI вслед за разделительным символом “?”.
Адрес IP узла, на котором работает навигатор удаленного пользователя.
Доменное имя узла, на котором работает навигатор удаленного пользователя. Если эта информация недоступна (например, для узла не определен доменный адрес), то вместо доменного имени указывается адрес IP, как в переменной REMOTE_ADDR.
Имя пользователя, которое используется навигатором для аутентификации.
Имя пользователя до обработки фильтром ISAPI, которое используется навигатором для аутентификации.
Метод доступа, который используется для передачи данных от навигатора серверу WWW.
В эту переменную записывается путь к виртуальному каталогу и имя библиотеки DLL расширения ISAPI. Анализируя эту переменную, расширение ISAPI может определить путь к своему загрузочному файлу.
Доменное имя сервера WWW или адрес IP сервера WWW, если доменное имя недоступно или не определено.
Имя и версия протокола, который применяется для выполнения запроса к расширению ISAPI.
Номер порта, на котором навигатор посылает запросы серверу WWW.
Если обработка запроса выполняется через защищенный порт, в этой строке записано значение 1, а если через незащищенный - значение 0.
Название и версия программного обеспечения сервера WWW. Версия следует после названия и отделяется от последнего символом “/”.
Строка, закрытая двоичным нулем, в которую записаны значения всех переменных, имеющих отношение к протоколу 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 |
Данные не были получены |
CHAR szTempBuf[4096];
DWORD dwSize;
dwSize = 4096;
lpECB->GetServerVariable(lpECB->ConnID,
(LPSTR)"ALL_HTTP", (LPVOID)szTempBuf, &dwSize);
strcat(szBuff, szTempBuf);