Сервер Web своими руками. Язык HTML, приложения CGI и ISAPI

Функция 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);


                                        Содержание раздела