Dominar la programación web en C++ con CGI
¿Qué es CGI?
La Interfaz Común de Puerta de Enlace (Common Gateway Interface, CGI) es un conjunto de estándares que definen cómo se intercambia información entre el servidor web y un script personalizado.
Las especificaciones CGI son mantenidas actualmente por la NCSA, que define CGI como sigue:
La Interfaz Común de Puerta de Enlace, o CGI, es un estándar para programas de puerta de enlace externos que interactúan con servidores de información como servidores HTTP.
La versión actual es CGI/1.1 y CGI/1.2 está en desarrollo.
Navegación Web
Para entender el concepto de CGI, veamos qué ocurre cuando hacemos clic en un hipervínculo para navegar a una página web o URL específica.
Tu navegador contacta al servidor web HTTP y solicita la URL, es decir, el nombre de archivo.
El servidor web analiza la URL y busca el archivo. Si encuentra el archivo solicitado, el servidor web envía ese archivo de vuelta al navegador; de lo contrario, envía un mensaje de error indicando que has solicitado un archivo incorrecto.
El navegador web toma la respuesta del servidor web y muestra el archivo recibido o el mensaje de error según la respuesta recibida.
Sin embargo, es posible configurar el servidor HTTP de manera que cuando se solicita un archivo en un determinado directorio, ese archivo no se envíe de vuelta; en su lugar, se ejecuta como un programa, y la salida producida por el programa se envía de vuelta a tu navegador para mostrarla.
La Interfaz Común de Puerta de Enlace (CGI) es un protocolo estándar para permitir que aplicaciones (llamadas programas CGI o scripts CGI) interactúen con servidores web y con clientes. Estos programas CGI pueden escribirse en Python, PERL, Shell, C o C++, etc.
Diagrama de Arquitectura CGI
El siguiente programa simple muestra una arquitectura simple de CGI:

Configuración del Servidor Web
Antes de proceder con la programación CGI, asegúrate de que tu servidor web soporte CGI y esté configurado para manejar programas CGI. Todos los programas CGI que deben ser ejecutados por el servidor HTTP se mantienen en un directorio preconfigurado. Este directorio se llama directorio CGI y por convención se nombra como /var/www/cgi-bin. Por convención, los archivos CGI tendrán extensión .cgi, aunque sean ejecutables de C++.
Por defecto, Apache Web Server está configurado para ejecutar programas CGI en /var/www/cgi-bin. Si quieres especificar cualquier otro directorio para ejecutar tus scripts CGI, puedes modificar la siguiente sección en el archivo httpd.conf:
<Directory "/var/www/cgi-bin">
AllowOverride None
Options ExecCGI
Order allow,deny
Allow from all
</Directory>
<Directory "/var/www/cgi-bin">
Options All
</Directory>
Aquí asumo que tienes el servidor web funcionando correctamente y puedes ejecutar cualquier otro programa CGI como Perl o Shell, etc.
Primer Programa CGI
Considera el siguiente contenido de programa en C++:
#include <iostream>
using namespace std;
int main() {
cout << "Content-type:text/html\r\n\r\n";
cout << "<html>\n";
cout << "<head>\n";
cout << "<title>Hola Mundo - Primer Programa CGI</title>\n";
cout << "</head>\n";
cout << "<body>\n";
cout << "<h2>¡Hola Mundo! Este es mi primer programa CGI</h2>\n";
cout << "</body>\n";
cout << "</html>\n";
return 0;
}
Compila el código anterior y nombra el ejecutable como cplusplus.cgi. Este archivo se guarda en el directorio /var/www/cgi-bin y tiene el siguiente contenido. Antes de ejecutar tu programa CGI, asegúrate de cambiar el modo del archivo usando el comando UNIX chmod 755 cplusplus.cgi para hacer el archivo ejecutable.
Mi Primer Programa CGI
El programa C++ anterior es un programa simple que escribe su salida en el archivo STDOUT, es decir, la pantalla. Hay una característica importante y adicional disponible: la primera línea imprime Content-type:text/html\r\n\r\n. Esta línea se envía de vuelta al navegador y especifica el tipo de contenido que se mostrará en la pantalla del navegador. Ahora debes haber entendido el concepto básico de CGI y puedes escribir muchos programas CGI complicados usando Python. Un programa CGI en C++ puede interactuar con cualquier otro sistema externo, como RDBMS, para intercambiar información.
Cabecera HTTP
La línea Content-type:text/html\r\n\r\n es parte de la cabecera HTTP, que se envía al navegador para entender el contenido. Todas las cabeceras HTTP tendrán la siguiente forma:
Nombre del Campo HTTP: Contenido del Campo
Por ejemplo: Content-type: text/html\r\n\r\n
Hay otras cabeceras HTTP importantes que usarás frecuentemente en tu programación CGI.
| Nº | Cabecera y descripción |
|---|---|
| 1 | Content-type: Una cadena MIME que define el formato del archivo que se devuelve. Ejemplo: Content-type:text/html. |
| 2 | Expires: Fecha La fecha en que la información se vuelve inválida. El navegador usa esto para decidir cuándo una página necesita actualizarse. Una cadena de fecha válida debe tener el formato 01 Jan 1998 12:00:00 GMT. |
| 3 | Location: URL La URL que debería devolverse en lugar de la URL solicitada. Puedes usar este campo para redirigir una solicitud a cualquier archivo. |
| 4 | Last-modified: Fecha La fecha de la última modificación del recurso. |
| 5 | Content-length: N La longitud, en bytes, de los datos que se devuelven. El navegador usa este valor para informar el tiempo estimado de descarga de un archivo. |
| 6 | Set-Cookie: Cadena Establece la cookie pasada a través de la cadena. |
Variables de Entorno CGI
Todos los programas CGI tendrán acceso a las siguientes variables de entorno. Estas variables juegan un papel importante al escribir cualquier programa CGI.
| Nº | Nombre de variable y descripción |
|---|---|
| 1 | CONTENT_TYPE El tipo de datos del contenido, usado cuando el cliente envía contenido adjunto al servidor. Por ejemplo, subida de archivos, etc. |
| 2 | CONTENT_LENGTH La longitud de la información de consulta disponible solo para peticiones POST. |
| 3 | HTTP_COOKIE Devuelve las cookies establecidas en forma de pares clave-valor. |
| 4 | HTTP_USER_AGENT El campo de cabecera de solicitud User-Agent contiene información sobre el agente de usuario que origina la solicitud. Es el nombre del navegador web. |
| 5 | PATH_INFO La ruta para el script CGI. |
| 6 | QUERY_STRING La información codificada en URL que se envía con el método GET. |
| 7 | REMOTE_ADDR La dirección IP del host remoto que hace la solicitud. Útil para registro o autenticación. |
| 8 | REMOTE_HOST El nombre completamente calificado del host que hace la solicitud. Si esta información no está disponible, REMOTE_ADDR puede usarse para obtener la dirección IP. |
| 9 | REQUEST_METHOD El método usado para hacer la solicitud. Los métodos más comunes son GET y POST. |
| 10 | SCRIPT_FILENAME La ruta completa al script CGI. |
| 11 | SCRIPT_NAME El nombre del script CGI. |
| 12 | SERVER_NAME El nombre de host o dirección IP del servidor. |
| 13 | SERVER_SOFTWARE El nombre y versión del software que el servidor está ejecutando. |
Aquí hay un pequeño programa CGI para listar todas las variables CGI.
#include <iostream>
#include <stdlib.h>
using namespace std;
const string ENV[24] = {
"COMSPEC", "DOCUMENT_ROOT", "GATEWAY_INTERFACE",
"HTTP_ACCEPT", "HTTP_ACCEPT_ENCODING", "HTTP_ACCEPT_LANGUAGE",
"HTTP_CONNECTION", "HTTP_HOST", "HTTP_USER_AGENT", "PATH",
"QUERY_STRING", "REMOTE_ADDR", "REMOTE_PORT", "REQUEST_METHOD",
"REQUEST_URI", "SCRIPT_FILENAME", "SCRIPT_NAME", "SERVER_ADDR",
"SERVER_ADMIN", "SERVER_NAME", "SERVER_PORT", "SERVER_PROTOCOL",
"SERVER_SIGNATURE", "SERVER_SOFTWARE"
};
int main() {
cout << "Content-type:text/html\r\n\r\n";
cout << "<html>\n";
cout << "<head>\n";
cout << "<title>Variables de Entorno CGI</title>\n";
cout << "</head>\n";
cout << "<body>\n";
cout << "<table border=\"0\" cellspacing=\"2\">";
for(int i = 0; i < 24; i++) {
cout << "<tr><td>" << ENV[i] << "</td><td>";
// Intentar recuperar valor de variable de entorno
char *value = getenv(ENV[i].c_str());
if(value != 0) {
cout << value;
} else {
cout << "La variable de entorno no existe.";
}
cout << "</td></tr>\n";
}
cout << "</table>\n";
cout << "</body>\n";
cout << "</html>\n";
return 0;
}
Biblioteca CGI para C++
Para ejemplos reales, necesitarías realizar muchas operaciones con tu programa CGI. Existe una biblioteca CGI escrita para programas C++ que puedes descargar desde ftp://ftp.gnu.org/gnu/cgicc/ y seguir los pasos para instalar la biblioteca:
$tar xzf cgicc-X.X.X.tar.gz
$cd cgicc-X.X.X/
$./configure --prefix=/usr
$make
$make install
Puedes consultar la documentación relacionada disponible en 'C++ CGI Lib Documentation'.
Métodos GET y POST
Seguramente te has encontrado en muchas situaciones donde necesitas pasar información desde tu navegador al servidor web y finalmente a tu programa CGI. Los navegadores usan con mayor frecuencia dos métodos para pasar esta información al servidor web. Estos métodos son el Método GET y el Método POST.
Pasar Información Usando el Método GET
El método GET envía la información de usuario codificada anexada a la solicitud de página. La página y la información codificada están separadas por el carácter ? de la siguiente manera:
https://www.test.com/cgi-bin/cpp.cgi?key1=value1&key2=value2
El método GET es el método por defecto para pasar información del navegador al servidor web y produce una cadena larga que aparece en la casilla Location: de tu navegador. Nunca uses el método GET si tienes contraseña u otra información sensible para pasar al servidor. El método GET tiene limitación de tamaño y puedes pasar hasta 1024 caracteres en una cadena de solicitud.
Al usar el método GET, la información se pasa usando la cabecera HTTP QUERY_STRING y será accesible en tu programa CGI a través de la variable de entorno QUERY_STRING.
Puedes pasar información simplemente concatenando pares clave-valor junto con cualquier URL o puedes usar etiquetas HTML <FORM> para pasar información usando el método GET.
Ejemplo Simple de URL: Método GET
Aquí hay una URL simple que pasará dos valores al programa hello_get.py usando el método GET.
/cgi-bin/cpp_get.cgi?first_name=ZARA&last_name=ALI
A continuación, un programa para generar el programa CGI cpp_get.cgi para manejar la entrada dada por el navegador web. Vamos a usar la biblioteca CGI de C++ que facilita mucho el acceso a la información pasada:
#include <iostream>
#include <vector>
#include <string>
#include <stdio.h>
#include <stdlib.h>
#include <cgicc/CgiDefs.h>
#include <cgicc/Cgicc.h>
#include <cgicc/HTTPHTMLHeader.h>
#include <cgicc/HTMLClasses.h>
using namespace std;
using namespace cgicc;
int main() {
Cgicc formData;
cout << "Content-type:text/html\r\n\r\n";
cout << "<html>\n";
cout << "<head>\n";
cout << "<title>Usando Métodos GET y POST</title>\n";
cout << "</head>\n";
cout << "<body>\n";
form_iterator fi = formData.getElement("first_name");
if(!fi->isEmpty() && fi != (*formData).end()) {
cout << "Nombre: " << **fi << endl;
} else {
cout << "No se ingresó texto para el nombre" << endl;
}
cout << "<br/>\n";
fi = formData.getElement("last_name");
if(!fi->isEmpty() && fi != (*formData).end()) {
cout << "Apellido: " << **fi << endl;
} else {
cout << "No se ingresó texto para el apellido" << endl;
}
cout << "<br/>\n";
cout << "</body>\n";
cout << "</html>\n";
return 0;
}
Ahora, compila el programa anterior de la siguiente manera:
$g++ -o cpp_get.cgi cpp_get.cpp -lcgicc
Genera cpp_get.cgi y colócalo en tu directorio CGI e intenta acceder usando el siguiente enlace:
/cgi-bin/cpp_get.cgi?first_name=ZARA&last_name=ALI
Esto generaría el siguiente resultado:
Nombre: ZARA
Apellido: ALI
Ejemplo Simple de FORMULARIO: Método GET
Aquí hay un ejemplo simple que pasa dos valores usando un FORMULARIO HTML y un botón de envío. Vamos a usar el mismo script CGI cpp_get.cgi para manejar esta entrada.
<form action="/cgi-bin/cpp_get.cgi" method="get">
Nombre: <input type="text" name="first_name">
<br />
Apellido: <input type="text" name="last_name" />
<input type="submit" value="Enviar" />
</form>
Aquí está la salida real del formulario anterior. Ingresas Nombre y Apellido y luego haces clic en el botón enviar para ver el resultado.
Pasar Información Usando el Método POST
Un método generalmente más fiable para pasar información a un programa CGI es el método POST. Este empaqueta la información exactamente de la misma manera que los métodos GET, pero en lugar de enviarla como una cadena de texto después de un ? en la URL, la envía como un mensaje separado. Este mensaje llega al script CGI en forma de entrada estándar.
El mismo programa cpp_get.cgi manejará el método POST también. Tomemos el mismo ejemplo anterior, que pasa dos valores usando FORMULARIO HTML y botón de envío pero esta vez con el método POST:
<form action="/cgi-bin/cpp_get.cgi" method="post">
Nombre: <input type="text" name="first_name"><br />
Apellido: <input type="text" name="last_name" />
<input type="submit" value="Enviar" />
</form>
Aquí está la salida real del formulario anterior. Ingresas Nombre y Apellido y luego haces clic en el botón enviar para ver el resultado.
Pasar Datos de Casilla de Verificación al Programa CGI
Las casillas de verificación se usan cuando se requiere seleccionar más de una opción.
Aquí hay un código HTML de ejemplo para un formulario con dos casillas de verificación:
<form action="/cgi-bin/cpp_checkbox.cgi" method="POST" target="_blank">
<input type="checkbox" name="maths" value="on" /> Matemáticas
<input type="checkbox" name="physics" value="on" /> Física
<input type="submit" value="Seleccionar Asignatura" />
</form>
El resultado de este código es el siguiente formulario:
A continuación, el programa C++ que generará el script cpp_checkbox.cgi para manejar la entrada dada por el navegador web a través del botón de casilla de verificación.
#include <iostream>
#include <vector>
#include <string>
#include <stdio.h>
#include <stdlib.h>
#include <cgicc/CgiDefs.h>
#include <cgicc/Cgicc.h>
#include <cgicc/HTTPHTMLHeader.h>
#include <cgicc/HTMLClasses.h>
using namespace std;
using namespace cgicc;
int main() {
Cgicc formData;
bool maths_flag, physics_flag;
cout << "Content-type:text/html\r\n\r\n";
cout << "<html>\n";
cout << "<head>\n";
cout << "<title>Datos de Casilla de Verificación a CGI</title>\n";
cout << "</head>\n";
cout << "<body>\n";
maths_flag = formData.queryCheckbox("maths");
if(maths_flag) {
cout << "Bandera Matemáticas: ON " << endl;
} else {
cout << "Bandera Matemáticas: OFF " << endl;
}
cout << "<br/>\n";
physics_flag = formData.queryCheckbox("physics");
if(physics_flag) {
cout << "Bandera Física: ON " << endl;
} else {
cout << "Bandera Física: OFF " << endl;
}
cout << "<br/>\n";
cout << "</body>\n";
cout << "</html>\n";
return 0;
}
Pasar Datos de Botón de Radio al Programa CGI
Los botones de radio se usan cuando solo se requiere seleccionar una opción.
Aquí hay un código HTML de ejemplo para un formulario con dos botones de radio:
<form action="/cgi-bin/cpp_radiobutton.cgi" method="post" target="_blank">
<input type="radio" name="subject" value="maths" checked="checked"/> Matemáticas
<input type="radio" name="subject" value="physics" /> Física
<input type="submit" value="Seleccionar Asignatura" />
</form>
El resultado de este código es el siguiente formulario:
A continuación, el programa C++ que generará el script cpp_radiobutton.cgi para manejar la entrada dada por el navegador web a través de botones de radio.
#include <iostream>
#include <vector>
#include <string>
#include <stdio.h>
#include <stdlib.h>
#include <cgicc/CgiDefs.h>
#include <cgicc/Cgicc.h>
#include <cgicc/HTTPHTMLHeader.h>
#include <cgicc/HTMLClasses.h>
using namespace std;
using namespace cgicc;
int main() {
Cgicc formData;
cout << "Content-type:text/html\r\n\r\n";
cout << "<html>\n";
cout << "<head>\n";
cout << "<title>Datos de Botón de Radio a CGI</title>\n";
cout << "</head>\n";
cout << "<body>\n";
form_iterator fi = formData.getElement("subject");
if(!fi->isEmpty() && fi != (*formData).end()) {
cout << "Botón de radio seleccionado: " << **fi << endl;
}
cout << "<br/>\n";
cout << "</body>\n";
cout << "</html>\n";
return 0;
}
Pasar Datos de Área de Texto al Programa CGI
El elemento TEXTAREA se usa cuando se debe pasar texto multilínea al Programa CGI.
Aquí hay un código HTML de ejemplo para un formulario con una caja TEXTAREA:
<form action="/cgi-bin/cpp_textarea.cgi" method="post" target="_blank">
<textarea name="textcontent" cols="40" rows="4">
Escribe tu texto aquí...
</textarea>
<input type="submit" value="Enviar" />
</form>
El resultado de este código es el siguiente formulario:
A continuación, el programa C++ que generará el script cpp_textarea.cgi para manejar la entrada dada por el navegador web a través del área de texto.
#include <iostream>
#include <vector>
#include <string>
#include <stdio.h>
#include <stdlib.h>
#include <cgicc/CgiDefs.h>
#include <cgicc/Cgicc.h>
#include <cgicc/HTTPHTMLHeader.h>
#include <cgicc/HTMLClasses.h>
using namespace std;
using namespace cgicc;
int main() {
Cgicc formData;
cout << "Content-type:text/html\r\n\r\n";
cout << "<html>\n";
cout << "<head>\n";
cout << "<title>Datos de Área de Texto a CGI</title>\n";
cout << "</head>\n";
cout << "<body>\n";
form_iterator fi = formData.getElement("textcontent");
if(!fi->isEmpty() && fi != (*formData).end()) {
cout << "Contenido de Texto: " << **fi << endl;
} else {
cout << "No se ingresó texto" << endl;
}
cout << "<br/>\n";
cout << "</body>\n";
cout << "</html>\n";
return 0;
}
Pasar Datos de Cuadro Desplegable al Programa CGI
El cuadro desplegable se usa cuando tenemos muchas opciones disponibles pero solo se seleccionarán una o dos.
Aquí hay un código HTML de ejemplo para un formulario con un cuadro desplegable:
<form action="/cgi-bin/cpp_dropdown.cgi" method="post" target="_blank">
<select name="dropdown">
<option value="Maths" selected>Matemáticas</option>
<option value="Physics">Física</option>
</select>
<input type="submit" value="Enviar"/>
</form>
El resultado de este código es el siguiente formulario:
A continuación, el programa C++ que generará el script cpp_dropdown.cgi para manejar la entrada dada por el navegador web a través del cuadro desplegable.
#include <iostream>
#include <vector>
#include <string>
#include <stdio.h>
#include <stdlib.h>
#include <cgicc/CgiDefs.h>
#include <cgicc/Cgicc.h>
#include <cgicc/HTTPHTMLHeader.h>
#include <cgicc/HTMLClasses.h>
using namespace std;
using namespace cgicc;
int main() {
Cgicc formData;
cout << "Content-type:text/html\r\n\r\n";
cout << "<html>\n";
cout << "<head>\n";
cout << "<title>Datos de Cuadro Desplegable a CGI</title>\n";
cout << "</head>\n";
cout << "<body>\n";
form_iterator fi = formData.getElement("dropdown");
if(!fi->isEmpty() && fi != (*formData).end()) {
cout << "Valor Seleccionado: " << **fi << endl;
}
cout << "<br/>\n";
cout << "</body>\n";
cout << "</html>\n";
return 0;
}
Uso de Cookies en CGI
El protocolo HTTP es un protocolo sin estado. Pero para un sitio web comercial se requiere mantener información de sesión entre diferentes páginas. Por ejemplo, un registro de usuario termina después de completar muchas páginas. Pero ¿cómo mantener la información de sesión del usuario en todas las páginas web?
En muchas situaciones, el uso de cookies es el método más eficiente para recordar y rastrear preferencias, compras, comisiones y otra información requerida para una mejor experiencia del visitante o estadísticas del sitio.
Cómo Funciona
Tu servidor envía algunos datos al navegador del visitante en forma de cookie. El navegador puede aceptar la cookie. Si lo hace, se almacena como un registro de texto plano en el disco duro del visitante. Ahora, cuando el visitante llega a otra página de tu sitio, la cookie está disponible para recuperación. Una vez recuperada, tu servidor sabe/recuerda lo que se almacenó.
Las cookies son un registro de datos de texto plano de 5 campos de longitud variable:
Expires - Muestra la fecha en que la cookie expirará. Si está en blanco, la cookie expirará cuando el visitante cierre el navegador.
Domain - Muestra el nombre de dominio de tu sitio.
Path - Muestra la ruta al directorio o página web que estableció la cookie. Puede estar en blanco si quieres recuperar la cookie desde cualquier directorio o página.
Secure - Si este campo contiene la palabra "secure", la cookie solo puede recuperarse con un servidor seguro. Si está en blanco, no existe tal restricción.
Name = Value - Las cookies se establecen y recuperan en forma de pares clave-valor.
Configuración de Cookies
Es muy fácil enviar cookies al navegador. Estas cookies se enviarán junto con la cabecera HTTP antes del campo Content-type. Suponiendo que quieres establecer UserID y Password como cookies. La configuración de cookies se hará de la siguiente manera:
#include <iostream>
using namespace std;
int main() {
cout << "Set-Cookie:UserID = XYZ;\r\n";
cout << "Set-Cookie:Password = XYZ123;\r\n";
cout << "Set-Cookie:Domain = www.tutorialspoint.com;\r\n";
cout << "Set-Cookie:Path = /perl;\n";
cout << "Content-type:text/html\r\n\r\n";
cout << "<html>\n";
cout << "<head>\n";
cout << "<title>Cookies en CGI</title>\n";
cout << "</head>\n";
cout << "<body>\n";
cout << "Configurando cookies" << endl;
cout << "<br/>\n";
cout << "</body>\n";
cout << "</html>\n";
return 0;
}
De este ejemplo, debes haber entendido cómo establecer cookies. Usamos la cabecera HTTP Set-Cookie para establecer cookies.
Aquí, es opcional establecer atributos de cookies como Expires, Domain y Path. Es notable que las cookies se establecen antes de enviar la línea mágica "Content-type:text/html\r\n\r\n".
Compila el programa anterior para producir setcookies.cgi, e intenta establecer cookies usando el siguiente enlace. Establecerá cuatro cookies en tu computadora:
/cgi-bin/setcookies.cgi
Recuperar Cookies
Es fácil recuperar todas las cookies establecidas. Las cookies se almacenan en la variable de entorno CGI HTTP_COOKIE y tendrán la siguiente forma:
key1 = value1; key2 = value2; key3 = value3....
Aquí hay un ejemplo de cómo recuperar cookies.
#include <iostream>
#include <vector>
#include <string>
#include <stdio.h>
#include <stdlib.h>
#include <cgicc/CgiDefs.h>
#include <cgicc/Cgicc.h>
#include <cgicc/HTTPHTMLHeader.h>
#include <cgicc/HTMLClasses.h>
using namespace std;
using namespace cgicc;
int main() {
Cgicc cgi;
const_cookie_iterator cci;
cout << "Content-type:text/html\r\n\r\n";
cout << "<html>\n";
cout << "<head>\n";
cout << "<title>Cookies en CGI</title>\n";
cout << "</head>\n";
cout << "<body>\n";
cout << "<table border=\"0\" cellspacing=\"2\">";
// Obtener variables de entorno
const CgiEnvironment& env = cgi.getEnvironment();
for(cci = env.getCookieList().begin(); cci != env.getCookieList().end(); ++cci) {
cout << "<tr><td>" << cci->getName() << "</td><td>";
cout << cci->getValue();
cout << "</td></tr>\n";
}
cout << "</table>\n";
cout << "<br/>\n";
cout << "</body>\n";
cout << "</html>\n";
return 0;
}
Ahora, compila el programa anterior para producir getcookies.cgi, e intenta obtener una lista de todas las cookies disponibles en tu computadora:
/cgi-bin/getcookies.cgi
Esto producirá una lista de las cuatro cookies establecidas en la sección anterior y todas las demás cookies establecidas en tu computadora:
UserID XYZ
Password XYZ123
Domain www.tutorialspoint.com
Path /perl
Ejemplo de Subida de Archivos
Para subir un archivo, el formulario HTML debe tener el atributo enctype establecido en multipart/form-data. La etiqueta input con el tipo file creará un botón "Examinar".
<html>
<body>
<form enctype="multipart/form-data" action="/cgi-bin/cpp_uploadfile.cgi" method="post">
<p>Archivo: <input type="file" name="userfile" /></p>
<p><input type="submit" value="Subir" /></p>
</form>
</body>
</html>
El resultado de este código es el siguiente formulario:
Nota - El ejemplo anterior ha sido deshabilitado intencionalmente para evitar que la gente suba archivos a nuestro servidor. Pero puedes probar el código anterior con tu servidor.
Aquí está el script cpp_uploadfile.cpp para manejar la subida de archivos:
#include <iostream>
#include <vector>
#include <string>
#include <stdio.h>
#include <stdlib.h>
#include <cgicc/CgiDefs.h>
#include <cgicc/Cgicc.h>
#include <cgicc/HTTPHTMLHeader.h>
#include <cgicc/HTMLClasses.h>
using namespace std;
using namespace cgicc;
int main() {
Cgicc cgi;
cout << "Content-type:text/html\r\n\r\n";
cout << "<html>\n";
cout << "<head>\n";
cout << "<title>Subida de Archivos en CGI</title>\n";
cout << "</head>\n";
cout << "<body>\n";
// Obtener lista de archivos a subir
const_file_iterator file = cgi.getFile("userfile");
if(file != cgi.getFiles().end()) {
// Enviar tipo de datos en cout.
cout << HTTPContentHeader(file->getDataType());
// Escribir contenido en cout.
file->writeToStream(cout);
}
cout << "<Archivo subido exitosamente>\n";
cout << "</body>\n";
cout << "</html>\n";
return 0;
}
El ejemplo anterior es para escribir contenido en el flujo cout, pero puedes abrir tu flujo de archivo y guardar el contenido del archivo subido en un archivo en la ubicación deseada.
Esperamos que hayas disfrutado este tutorial. Si es así, por favor envíanos tus comentarios.
Lenguaje C
- Dominando los Espacios de Nombres en C#: Organización, Ámbito y Mejores Prácticas
- Dominando los Operadores en C++: Guía Completa con Ejemplos Prácticos
- Comentarios en C++: Mejores Prácticas para Código Legible y Mantenible
- Cómo Pasar Arrays a Funciones en C++: Guía Práctica
- Dominar la programación en C: Tutorial completo para principiantes
- Lenguaje de Programación C++: Visión General y Características Clave
- Constantes y Literales en C++: Tipos, Sintaxis y Mejores Prácticas
- Guía Completa de Operadores en C++: Tipos, Uso y Mejores Prácticas
- Dominando los Tipos Numéricos en C++: Guía Práctica
- Entendiendo las Referencias en C++: Conceptos Clave y Diferencias con Punteros
- Dominando Plantillas en C++: Guía de Programación Genérica