El servidor web 4D soporta CGIs (Common Gateway Interface). Los CGIs son para los servidores web similares a los que plug-ins son para los métodos 4D. Son llamados por el servidor web para ejecutar una tarea y devolver una respuesta, una página web completa o algo del código HTML insertado en la página enviada por el servidor. Los CGIs se utilizan con frecuencia para mostrar los contadores de visitantes, generar libros de visitantes, recibir el resultado de un formulario (form-mail), etc. Hoy en día hay una multitud de CGIs disponibles, la mayoría de los cuales son públicos.
Nota: originalmente, el término CGI era un estándar para designar la interfaz de las aplicaciones externas con el servidor HTTP. Ahora la palabra "CGI" se utiliza para designar estas mismas aplicaciones externas.
4D soporta todos los tipos de CGIs, bajo Mac OS X y bajo Windows. Un CGI puede ser una aplicación, un script PERL o una DLL que interactúa con un servidor Web.
- Ejecutables (.EXE) utilizando la “consola” y las variables de entorno. El código fuente generalmente es multiplataforma (Windows y Unix). Los nombres CGI generalmente se escriben de esta forma: nnn.exe o nph-nnn.exe. Para mayor información de CGI, por favor consulte el sitio web http://httpd.apache.org/docs/2.1/howto/cgi.html.
- DLL ISAPI, es decir las extensiones para IIS (Internet Information Server). Los nombres CGI se escriben de esta forma: nnn.dll o nph-nnn.dll. Los DLLs se descargan una vez el servidor web haya sido detenido por razones de rendimiento.
Para mayor información de este tipo de CGI, por favor consulte http://www.microsoft.com/iis/.
- PERL scripts utilizando la “consola” y las variables de entorno. Los CGIs necesitan la presencia de un intérprete para ejecutarlos. Sin embargo son multiplataforma (Windows, Unix y Mac OS). Sus nombres se escriben de esta forma: nnnn.pl, nph-nnnn.pl, nnnn.cgi o nph-nnnn.cgi.
Para mayor información sobre este tipo de CGI, por favor consulte http://www.perl.com/.
La llamada automática de un CGI se efectúa por intermedio de un URL, de una acción de formulario o de una etiqueta HTML insertada en una página, en función de la tarea efectuada por el CGI. En todos los casos, la cadena HTML debe contener /cgi-bin/ seguida por el nombre del CGI y eventualmente de una ruta de acceso (utilizando la sintaxis HTML) así como la cadena de búsqueda.
Por ejemplo, el URL “http://195.1.2.3/cgi-bin/search.exe” provoca la ejecución del CGI search.exe. De la misma forma, si coloca el marcador <IMG SRC="/special/cgi-bin/counter.exe"> dentro de una página HTML, el CGI counter.exe será ejecutado cuando la página se envíe.
Para poder ser llamados, los CGI deben obligatoriamente estar ubicados en la raíz de una carpeta llamada cgi-bin. Esta carpeta debe estar en la raíz del servidor web o en una subcarpeta. Un servidor puede tener varias carpetas cgi-bin. Esta carpeta puede contener otros archivos diferentes de los ejecutables, pero sólo estos últimos pueden llamarse desde un cliente web.
Ejemplo de instalación con un CGI llamado “Count.exe”:

A continuación algunos ejemplos de ubicaciones y URLs:
Ubicación de los elementosURLs correspondientes
(raíz del servidor Web)
[mibase] carpeta
mibase.4db(estructura)(http//195.1.2.3/)
[cgi-bin] carpeta
contador.exe(http//195.1.2.3/cgi-bin/counter.exe)
[Misc] carpeta
[cgi-bin] carpeta
script.pl(http//195.1.2.3/Misc/cgi-bin/script.pl)
La llamada de CGIs en modo manual requiere la utilización del comando SET CGI EXECUTABLE. En particular, este comando le permite ejecutar un CGI sin que sea visible para el usuario web en el URL.
Para mayor información sobre este punto, consulte la descripción de este comando.
La llamada de un CGI no modifica el entorno de 4D (selección, variables...).
4D no limita el tamaño de la respuesta. Sin embargo, la duración máxima del proceso concedida al CGI está limitada a 30 segundos. Después de ese tiempo, el servidor web devolverá un error.
Cuando la llamada a un CGI genera un error, 4D devolverá una de las siguientes respuestas, en una página HTML estándar:
- No se encontró: 4D no encuentra el CGI, o no está instalado el interprete PERL
- Prohibido: el cliente Web está solicitando algo diferente a un ejecutable en una carpeta [cgi-bin]
- Timeout: el CGI no pudo procesar la solicitud en menos de 30 segundos
- Respuesta incorrecta: la respuesta del CGI no pudo ser procesada por 4D o la DLL ISAPI produjo una excepción
- Error interno: memoria llena, etc.
Nota: cuando un CGI no funciona, verifique que los privilegios de ejecución del CGI son los adecuados y que los retornos de línea en el script CGI sean correctos.
Esta sección está destinada principalmente a los programadores que quieren desarrollar CGIs específicos para sus bases 4D.
4D define las variables de entorno en conformidad con las especificaciones CGI/1.1, con las siguientes precisiones:
GATEWAY_INTERFACE: siempre “CGI/1.1”
SERVER_SOFTWARE: siempre “4D WebStar_D/version”
SERVER_PROTOCOL: siempre “HTTP/1.0”
SERVER_PORT_SECURE: contiene “1” si la conexión HTTP es segura, de lo contrario “0”.
PATH_TRANSLATED: contiene la ruta de acceso completa de la raíz HTML del servidor y la parte de la ruta después del nombre del CGI. Por razones de seguridad, esta parte no contiene las secuencias de caracteres // o ..
Ejemplo: Raíz del servidor “C:/web”
Para una llamada CGI tal como /cgi-bin/cgi.exe/path, PATH_TRANSLATED vale “C:/web/path”. Para una llamada CGI del tipo /cgi-bin/cgi.exe/../path, 4D devuelve el error Prohibido.
REMOTE_IDENT: nombre del usuario (si es relevante), de lo contrario indefinido.
HTTP_AUTHORIZATION, HTTP_CONTENT_LENGTH y HTTP_CONTENT_TYPE: no definidos.
ALL_HTTP y URL son definidos en caso de llamadas de DLL ISAPI.
CERT_xxx and HTTPS_xxx son definidos si la conexión es segura (para los DLL únicamente).
Nota: el comando SET ENVIRONMENT VARIABLE permite definir estas variables.
Además de las variables del entorno estándar, 4D ofrece variables de texto del tipo FORMVAR_nomvariable:
- si la petición se envía utilizando el método "POST", estas variables corresponden a las áreas de entrada del formulario (por ejemplo FORMVAR_NAME, FORMVAR_FIRSTNAME...) excepto los campos binarios (INPUT TYPE="FILE"). Este sistema puede utilizarse con los formularios codificados “www/url-encoded” y “multipart/form-data”.
- si la solicitud se envía utilizando el método "GET", estas variables se llenan con los valores pasados en la cadena de consulta (por ejemplo, en el caso del URL .../cgi.exe?name=martin&code=75, FORMVAR_NAME obtendrá el valor “martin” y FORMVAR_CODE obtendrá el valor “75”).
Esta funcionalidad presenta la ventaja de facilitar el procesamiento de los formularios (no es necesario analizar las cadenas a=1&b=2&...), sin embargo el CGI es específico para 4D.
- Procesamiento de las respuestas devueltas por los CGI
Si el nombre del CGI (ejecutable Windows o script PERL) comienza por nph- (No Parsing Header), 4D envía la respuesta “as is” al cliente Web. En este caso, depende del CGI cumplir con las reglas HTTP. Respecto a los DLL ISAPI, 4D no analizará nunca la respuesta, sin importar el prefijo.
De lo contrario, 4D enviará el encabezado HTTP:
- si “Content-Tipo” no es especificado por el CGI, 4D enviará sistemáticamente “Content-Tipo: text/html”,
- si “Location” se especifica, 4D ignora los otros elementos de la respuesta y efectúa una redirección HTTP,
- si “Status” no se especifica, 4D enviará “HTTP/1.0 200 OK”.
4D acepta todo tipo de cambio de línea (Windows-CRLF, Mac OS-CR, Unix-LF) en el encabezado de la respuesta HTTP y se encarga del reformato.
En el caso de los DLL ISAPI, 4D acepta los procesos asincrónicos (HttpExtensionProc devuelve HSE_STATUS_PENDING). Una llamada a ServerSupportFunction (HSE_REQ_DONE_WITH_SESSION) debe ocurrir en los próximos 30 segundos. Si la función TerminateExtension está definida, siempre se llama con el valor HSE_TERM_MUST_UNLOAD.