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.

One Response to Decodificacion de la variable de ambiente Query_String

  1. Winrock says:

    I’m also writing to make you be aware of what a extraordinary discovery my wife’s daughter had studying your site. She picked up plenty of issues, not to mention what it’s like to have an incredible teaching character to make the others just learn various extremely tough issues. You really did more than my expected results. Many thanks for offering these interesting, trustworthy, informative and unique tips on the topic to Kate.

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 )

Google+ photo

Estás comentando usando tu cuenta de Google+. 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 )

Conectando a %s

A %d blogueros les gusta esto: