VFPCGI
 КАК ЭТО РАБОТАЕТ 


 
 


 
 


 
 

 

    Установка библиотеки VFPCGI в системе

         Все очень легко. Просто скопируйте библиотеку VFPCGI.DLL в системную папку. Это \Windows\system для Windows 9x и \WinNT\system32 для NT/2000. Не надо регистрировать ее в системе. Все готово к работе. Создавайте ваш EXE-файл на FoxPro, копируйте его в каталог для скриптов Вашего web-сервера и запускайте.

    Взаимодействие CGI и web-сервера

         Предварительно несколько слов о способах передачи данных между web-сервером и CGI программой. Если Вы хорошо знакомы с этим механизмом, можете пропустить этот подраздел и перейти к методике написания CGI c VFPCGI.DLL
         Когда Вы описываете форму в HTML, то в тэге <form action=...> обычно указываете метод передачи запроса от browser к web-серверу: GET или POST. Web-сервер в свою очередь сообщает запускаемой им программе какой именно метод передачи затребовал клиент. В случае использования метода GET все параметры передаются web-сервером через переменные окружения. Количество и тип параметров зависят от типа запроса, но для разных web-серверов имеются и специфичные параметры. Чтобы самостоятельно выяснить какие параметры формирует конкретно Ваш web-сервер, можете в Visual C++ сделать такую маленькую программку под названием cgitest:

    #include "stdafx.h"
    #include <stdio.h>
    #include <stdlib.h>

    int main(int argc, char* argv[])
    {
        char **envptr;
        envptr = environ;
        printf("Content-type: text/html\n\n");
        while ( NULL != *envptr )
           {
           printf("<br>");
           printf("%s",*envptr);
           envptr++;
           }
        return 0;
    }

         Если у Вас не установлен C++ или Вы испытываете к нему неприязнь, то можете просто скачать .exe файл этой программки.
         Теперь, указав в форме например

    <form action="http://localhost/scripts/cgitest.exe">
    Вы можете абсолютно точно узнать какие именно переменные окружения создает и передает CGI программе установленный у Вас web-сервер конкретно для этой формы. Теперь, создавая скрипт на VFP, Вы можете читать эти данные функцией GETENV ( ) и нормально их обрабатывать.
         Есть и стандартные для всех серверов переменные окружения. Например, функция GETENV("REQUEST_METHOD") возвращает символьную строку с указанием используемого метода передачи данных формы: GET или POST, GETENV("QUERY_STRING") возвращает кодированную строку запроса метода GET, и так далее.

    Методика написания CGI 

         Библиотека VFPCGI.DLL экспортирует для CGI программ всего три функции, которые должны быть объявлены в Вашем скрипте:
     

      declare integer wwwWrite in vfpcgi.dll string,integer
      declare integer wwwRead in vfpcgi.dll string,integer
      declare integer wwwDecode in vfpcgi.dll string


         Назначение этих функций:

         wwwWrite  пишет из CGI программы для  web-сервера строку символов для передачи клиенту. То есть эта функция по сути возвращает результат работы скрипта. Параметры: символьная строка, длина строки. Возвращает всегда число 0.
         Пример: 
     

      wwwWrite("<h1>Hello,world !</h1>",22)
       
        Замечание. Эта функция может вызываться скриптом многократно, если Вам удобнее передавать результаты выполнения скрипта по частям (например, если данные имеют очень большой объем и Вы хотите, чтобы пользователь не ждал завершения работы программы, а начинал получать данные последовательно, но сразу). Однако всегда первой должна передаваться стандартная строка для броузера, содержащая тип MIME передаваемых данных, например:
     
      htmlHeader="Content-type: text/html" + chr(10) +chr(10)
      wwwWrite(htmlHeader,len(htmlHeader))


    указывает, что скрипт генерирует обычный гипертекстовый документ. Вместо text/html Вы должны указать, например, image/gif, если Ваш скрипт возвращает картинку баннера в формате GIF и т.д.

         wwwRead  позволяет CGI программе читать данные, переданные web-серверу из формы методом POST. Функция работает почти аналогично обычной функции FREAD ( ), то есть буфер чтения должен быть заранее объявлен и его адрес передается по ссылке. Отличие от FREAD - буфер должен быть проинициализирован на полную длину , и функция всегда возвращает 0.
         Пример:
     

      if GETENV("REQUEST_METHOD") = "POST"
      Buffer = space(val(getenv("CONTENT_LENGTH")))
      wwwRead(@Buffer,len(Buffer))
      endif


         В этом примере данные, передаваемые методом POST, читаются в переменную Buffer. Длина данных при использовании метода POST всегда определена переменной окружения CONTENT_LENGTH.

         wwwDecode  декодирует данные формы, переданные методом GET. То есть позволяет превратить строку вида %D2%F3%F2+%E1%FB%EB+%C2%E0%F1%FF в написанное в форме Тут был Вася.
         Функции передается один параметр: ссылка на строку кодированных данных запроса, возвращается длина декодированной строки. 
         Пример: 
     

      if GETENV("REQUEST_METHOD") = "GET"
      Buffer = GETENV("QUERY_STRING")
      nLen = wwwDecode(@Buffer)
      Buffer = substr(Buffer,1,nLen)
      endif


         В этом примере данные, передаваемые методом GET, читаются в переменную Buffer. Обратите внимание, что после декодирования FoxPro сам не определяет, что длина строки изменилась, поэтому надо использовать SUBSTR.

    Подводя итоги 

         В заключение, самый простой пример CGI скрипта, написанный с использованием VFPCGI.DLL :
     

      procedure Hello

      declare integer wwwWrite in vfpcgi.dll string,integer

      htmlHeader="Content-type: text/html" + chr(10) +chr(10)
      wwwWrite(htmlHeader,len(htmlHeader))
      wwwWrite("<h1>Hello,world !</h1>",22)

      clear dlls



Hosted by uCoz