Decodificacion de la variable de ambiente Query_String

Bueno continuo sacando algunos programas CGI de mis apuntes, en este Post quiero mostrar como se puede decodificar la variable de ambiente Query_String recordemos que esta variable es la que contiene los nombres y sus valores de las variables que llegan de un formulario a un programa CGI. El fuente HTML del formulario que se va a enviar al programa CGI es el siguiente:

<!--
	Instituto Tecnologico de Zacatepec
    Descripcion:
    Formulario de datos que se usara en conjunto con el programa decodifica_QueryString.cgi para
    leer los valores que son enviados de este formulario.
    Author:     Gonzalo Silverio  gonzasilve@gmail.com
    Archivo:    formulario.html
-->

<html>
<head>
<title>Decodificar Query String</title>
</head>
<body>
    <br><br><br>
    <form name="formulario1" action="http://localhost/cgi-bin/pruebas/decodifica_QueryString.cgi" method="GET">
        <table width="90%" border="0" align="center" cellspacing="0">
        <tr>
            <td colspan="2" bgcolor="#6D6DFF"><h2 align="center">
                    <font color="white"><br>
                        Decodificar la variable Query String
                    </font></h2>
            </td>
        </tr>
        <tr>
            <td bgcolor="#ff9019"><b>N.C:</b> </td><td><input type="text" name="nc" size="30" maxlength="10"> </td>
        </tr>
        <tr>
            <td bgcolor="#ff9019"><b>Nombre:</b> </td><td><input type="text" name="nombre" size="67" maxlength="255"> </td>
        </tr>
        <tr>
            <td bgcolor="#ff9019"><b>Apellidos:</b> </td><td><input type="text" name="apellidos" size="67" maxlength="255"> </td>
        </tr>
        <tr>
            <td bgcolor="#ff9019"><b>Domicilio:</b> </td><td><textarea COLS="60" rows="3"  name="domicilio" ></textarea></td>
        </tr>
        <tr>
            <td bgcolor="#ff9019">
                <b>Edad:</b> </td><td><input type="text" name="edad" size="10" maxlength="10">
                <font color="#a4a2a1">a&ntilde;os</font>
            </td>
        </tr>
        <tr>
            <td bgcolor="#ff9019">
                <b>Estatura:</b> </td><td><input type="text" name="estatura" size="10" maxlength="10">
                <font color="#a4a2a1">mts.</font>
            </td>
        </tr>
        <tr>
            <td bgcolor="#ff9019">
                <b>Peso:</b> </td><td><input type="text" name="peso" size="10" maxlength="10">
                <font color="#a4a2a1">kgs.</font>
            </td>
        </tr>
        <tr>
            <td bgcolor="#ff9019"><b>Fecha de ingreso:</b> </td><td>Dia
                <select name="dia" size="1">
                    <option value="1">1</option>
                    <option value="2">2</option>
                    <option value="3">3</option>
                    <option value="4">4</option>
                    <option value="5">5</option>
                    <option value="6">6</option>
                    <option value="7">7</option>
                    <option value="8">8</option>
                    <option value="9">9</option>
                    <option value="10">10</option>
                    <option value="11">11</option>
                    <option value="12">12</option>
                    <option value="13">13</option>
                    <option value="14">14</option>
                    <option value="15">15</option>
                    <option value="16">16</option>
                    <option value="17">17</option>
                    <option value="18">18</option>
                    <option value="19">19</option>
                    <option value="20">20</option>
                    <option value="21">21</option>
                    <option value="22">22</option>
                    <option value="23">23</option>
                    <option value="24">24</option>
                    <option value="25">25</option>
                    <option value="26">26</option>
                    <option value="27">27</option>
                    <option value="28">28</option>
                    <option value="29">29</option>
                    <option value="30">30</option>
                    <option value="31">31</option>
                </select>
                <b>Mes</b>
                <select name="mes" size="1">
                    <option value="1">Enero</option>
                    <option value="2">Febrero</option>
                    <option value="3">Marzo</option>
                    <option value="4">Abril</option>
                    <option value="5">Mayo</option>
                    <option value="6">Junio</option>
                    <option value="7">Julio</option>
                    <option value="8">Agosto</option>
                    <option value="9">Septiembre</option>
                    <option value="10">Octubre</option>
                    <option value="11">Noviembre</option>
                    <option value="12">Diciembre</option>
                </select>
                <b>a&ntilde;o</b>
                <input type="text" size="4" maxlength="4" name="anio" value="">
            </td>
        </tr>
        <tr>
            <td bgcolor="#ff9019"><b>Sexo:</b> </td><td>
                <input type="radio" name="sexo" value="hombre">Masculino &nbsp;&nbsp;
                <input type="radio" name="sexo" value="mujer">Femenino
            </td>
        </tr>
        <tr>
            <td colspan="2" align="center"><br><br>
                <input type="submit" name="enviar" value="Enviar datos a CGI">&nbsp;&nbsp;&nbsp;
                <input type="reset" name="limpiar" value="Limpiar">
            </td>
        </tr>
    </table>
    </form>
</body>
</html>

Y su aspecto en el navegador es mas o menos similar a esto:


El usuario una vez que ha llenado los campos da click en el boton Enviar datos a CGI, dicho boton manda a llamar al programa decodifica_QueryString.cgi y este programa es el que recibe los datos del formulario. A continuacion muestro el programa fuente en C del CGI que recibira los datos del formulario anterior y ‘ despedazara’ la variable de ambiente Query_String para obtener los valores de los campos de dicho formulario:

/*
	Instituto Tecnologico de Zacatepec
  Descripcion:	Programa que decodifica la variable de ambiente Query_String obtiendo los
		valores de las variables que se reciben de un formulario.
  Author:	Gonzalo Silverio     gonzasilve@gmail.com
  Archivo: 	decodifica_QueryString.c
*/

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

/* Estrutura de datos que guarda los nombres de las variables CGI y sus valores de los formularios */
struct 
{
  char nombre[128];
  char valor[128];
} elementos[16];

/* declaraciones de las funciones que se van a utilizar en el programa */
void splitword(char *out, char *in, char stop);
char x2c(char *x);
void unescape_url(char *url);

/* Almacenamiento temporal de la variable de ambiente */
char *cp;
char *empty = "<vacio>";

/* Macro para desplegar las variables de ambiente */
#define safenv(a) ( (cp = getenv(a)) ? cp : empty)

main(int argc, char **argv)
{
  char *qs;	/* qs servira para guardar la cadena de consulta */
  int i;

  /* Enviar primero el encabezado MIME */
  printf("Content-type: text/html\n\n");
  
	//Titulo de la pagina web
	printf("<HTML><HEAD><TITLE>Decodificacion de Query_String</TITLE></HEAD>\n");
	//Cuerpo de la pagina web
	printf("<BODY><br>");

  printf("<b>Contenido de la variable sin decodificar: <br>QUERY_STRING =</b> %s <br>",safenv("QUERY_STRING"));
  

  /* Asignar la cadena de consulta a qs, abortar si esta vacia */
  if((qs = getenv("QUERY_STRING")) == NULL )
  {
    printf("No hay cadena de consulta a decodificar!<br> ");
    exit(1);
  }

  /* Dividir cada uno de los parametros de la cadena de consulta */
  for(i=0; qs[0] != '\0'; i++)
  {
    /* Primero dividir por '&' cada parametro */
    splitword(elementos[i].valor,qs,'&');
    /* Convertir la cadena para caracteres exadecimales y signos mas */
    unescape_url(elementos[i].valor);
    /* separar ahora name y value */
    splitword(elementos[i].nombre,elementos[i].valor,'=');    
    
  }

  /* Imprimir todos los valores de formulario */
  printf("<br></b>LAS VARIABLES Y SUS VALORES SON: </b><br><br>");
  for(i=0; elementos[i].nombre[0]; i++)
    printf("%s=%s  <br>",elementos[i].nombre,elementos[i].valor);

	printf("</BODY>");
}

void splitword(char *out, char *in, char stop)
{
  int i,j;

  for(i=0; in[i] && ( in[i] != stop ); i++)  
    out[i] = in[i];
  
  out[i] = '\0'; 	/* Terminar */
  if( in[i] )
    i++;

  for( j=0; in[j]; )
    in[j++] = in[i++];
}

char x2c(char *x)
{
  register char c;
  /* NOTA: (x & oxdf) cambia a mayusculas a x */
  c = ( x[0] >= 'A' ? ( (x[0] & 0xdf) - 'A') +10 : ( x[0] -'0' ));
  c *= 16;
  c += (x[1] >= 'A' ? ( (x[1] & 0xdf) - 'A') +10 : ( x[1] -'0' ));
  return(c);
}

void unescape_url(char *url)
{
  register int i,j;

  for(i=0, j=0; url[j]; ++i,++j)
  {
    if( (url[i] = url[j]) =='%' )
    {
      url[i] = x2c(&url[j+1]);
      j += 2;      
    }
    else if(url[i] == '+')
	  url[i] = ' ';
  }
  
  url[i] = '\0';	/* Terminar en la nueva longitud */
}

…cabe mencionar que parte del codigo que muestro no es de mi propia cosecha pues lo saque de un libro que me pidieron que consultara y cuyo titulo y autor ahora no recuerdo su nombre, pero en cuanto recuerde lo pongo para que lo consulten, esta muy bueno el libro, bueno aca la compilacion del programa anterior:

y por ultimo muestro lo que arroja el programa CGI decodifica_QueryString.cgi una vez que a decodificado la variable de ambiente Query_String:

buen, espero comentarios o dudas o si les interesan los fuentes, adelante basta dejar su correo. Hasta pronto y gracias x pasar por aqui.

Acerca de gonzasilve
Freelance Web Developer.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: