Breve discusión acerca del protocolo HTTP
Septiembre 8, 2008
Nota: No hay ni una sola imagen, entonces el contenido puede ser dificil de leer. Recomiendo leer varias partes por separado. El contenido de ésta publicación es básico.
Protocolo HTTP
Es un protocolo donde se debe seguir el esquema de cliente-servidor (Donde el cliente se conecta al servidor, hace una petición, y el servidor responde de acuerdo a la estructura de esa petición), luego de que el servidor procesa la petición, se cierra la conexión, aunque el cliente también la puede cerrar.
Como este protocolo no es un protocolo de estado, esto es que no guarda información que haya mandado el cliente, entonces se recurre a las cookies como archivo temporal para realizar tal proceso.
Cliente
Existe un formato estándar para la petición que realiza el cliente, así:
El crlf significa retorno de carro y avance de línea [enter]
(Cabecera1)(:) (Valor)(crlf)
(Cabecera2)(:) (Valor)(crlf)
(CabeceraN)(:) (Valor)(crlf)
(crlf)
(Cuerpo del mensaje)
Métodos
Los métodos dependen del servidor y pueden ser definidos por el programador, aunque los que se usan comúnmente o los “necesarios” por así decir son el método GET y POST. También existen varios como OPTIONS, HEAD, TRACE, PUT, pero no los vamos a tratar.
GET: Se utiliza para hacer petición de un archivo X indicado en la primera línea del formato de petición del cliente.
POST: Se utiliza para enviar datos a un archivo X indicado en la primera línea del formato de petición el cliente.
OPTIONS: Se utiliza para hacer petición al servidor de los métodos que puede usar el cliente.
Cabeceras
Son varias las cabeceras que necesitamos para realizar una petición correctamente. Entre ellas encontramos Host, User-Agent, Accept, Accept-Charset, Keep-Alive, Connection. Cabe decir que no son necesarias las cabeceras, ya que con solo la conexión y el método podemos hacer un request a una página.
Host: Indica el nombre de la “página web” a la que queremos acceder. Si el servidor aloja varias páginas web, se debe indicar esta cabecera, ya que si no lo hacemos se puede estar accediendo a otra parte del servidor.
User-Agent: Indica el nombre de la aplicación que usa el cliente en el momento de la conexión.
Accept: Indica los tipos de archivo que acepta el cliente.
Acept-Charset: Indica que tipo de caracteres acepta el cliente.
Connection: Indica si la conexión se cierra al momento de procesar la petición, o si queda a la escucha de mas peticiones. Si es así se indica la cabecera keep-alive.
Keep-Alive: Indica el tiempo en milisegundos de espera del servidor en escucha de más peticiones. Se usa en conexiones persistentes, y sirve para hace peticiones sobre múltiples objetos (Para no andar conectándose y desconectándose haciendo peticiones).
Servidor
La respuesta del servidor al cliente va así:
(Cabeceras del servidor)(crlf)
(crlf)
(Cuerpo del mensaje)
Respuesta
Indica la versión y un código de estado. Los códigos más comunes son:
200 = Indica que todo va bien
300 = Que existen múltiples archivos con algún nombre
302 = Recurso movido temporalmente
400 = Mala petición
403 = Denegado
404 = No se encontró el recurso
500 = Error interno del servidor
501 = No implementado (Para los métodos)
Entre otros.
Cabeceras del servidor
En estas cabeceras se puede encontrar información acerca del servidor, tal como el nombre mismo del servidor que se usa, el sistema operativo en el cual se encuentra (Aunque muchas veces no lo da), la fecha y hora en la que se encuentra, las cookies que nos manda, el tipo de contenido que se envió, entre otros.
Cuerpo del mensaje
En esta se encuentra la respuesta en si del servidor a un recurso que existe. Es lo que podemos observar en nuestros navegadores, el código fuente.
Archivado en: Programación |




Que hay brother, tengo una consulta, haber si me puedes hechar una mano.
Estoy tratando de validar un dato via post desde telnet, todo lo estoy haciendo en mi maquina (localhost) con el lammp.
Solo recibo un dato ($var=$_POST['codigo'];) para no hacerlo tan complicado ;D. Pero he a qui el problema:
Aqui esta mi peticion:
******************************
post /ejercicios/cabeceras/cabecera.php http/1.1 (ctrl)
host: localhost (ctrl)
content-length: 12 (ctrl)
(ctrl)
codigo=kmykc
Y esta es la respuesta de que segun esta mal
********************************************
HTTP/1.1 200 OK
Date: Wed, 24 Sep 2008 00:13:35 GMT
Server: Apache/2.2.9 (Unix) DAV/2 mod_ssl/2.2.9 OpenSSL/0.9.8h PHP/5.2.6 mod_apreq2-20051231/2.6.0 mod_perl/2.0.4 Perl/v5.10.0
X-Powered-By: PHP/5.2.6
Content-Length: 3
Content-Type: text/html
Mal
Ya lo he probado con el metodo GET y funciona perfecto, pero con el POST tengo ese problemilla, ya he buscado mucha info, pero lo que encuentro tampoco me ha servido.
Espero puedas hecharme la mano brother.
Puedes poner el código del script "cabecera.php"? Para poder verlo y ver que es lo que hace el script. Porque lo que haces está bien hecho.
Aparte de todo esto tengo una duda.
Cuando pones esto en telnet:
host: localhost (ctrl)
content-length: 12 (ctrl)
(ctrl)
codigo=kmykc
el (ctrl) ¿qué simboliza?, porque lo correcto sería que simbolizara un retorno de carro y un avance de línea: "\r\n", chr(13) + chr(10) o como lo llamamos comúnmente "enter"
"El crlf significa retorno de carro y avance de línea [enter]"
Gracias por responder brother.
*******************************************
Este es el script, no es gran cosa, es solo para practicar:
********************************************
Lo del (ctrl) si me referia a un "enter", segui el formato que le diste a los ejemplos para que no hubiera confusion.
********************************************
Y como comentas, yo tambien no le veo error alguno, pero como apenas comence a practicar esto con tus ejemplos, pues igual y se me paso algo.
*******************************************
Creo que hubo un error al colocar mi codigo, hay lo pongo de nuevo
< ?php
$var = $_POST['codigo'];
if($var == 'kmykc') {
echo "Bien";
} else {
echo "Mal";
}
?>
Es posible entonces que falte una cabecera, y creo saber cual es. Mira si probando esto te funciona:
host: localhost
content-length: 12
content-type: application/www-x-form-urlencoded
codigo=kmykc
Pues no tio, no me da, de hecho le meti un formulario y cheque las cabeceras que manda, las coloque y no me da resultado, solo me muestra el formulario.
Solo que ahora solo lo estoy comparando con un simple "1" (if($var==1)).
*********PETICION*****************************
post /ejercicios/cabeceras/cabecera.php http/1.1
host: localhost
accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
accept-charset: iso-8859-1,utf-8;q=0.7,*;q=0.7
keep-alive: 300
connection: keep-alive
referer: http://localhost/ejercicios/cabeceras/cabecera.php
content-type: application/x-www-form-urlencode
content-length: 8
codigo=1
**********RESPUESTA***************************
HTTP/1.1 200 OK
Date: Wed, 24 Sep 2008 19:22:29 GMT
Server: Apache/2.2.9 (Unix) DAV/2 mod_ssl/2.2.9 OpenSSL/0.9.8h PHP/5.2.6 mod_apreq2-20051231/2.6.0 mod_perl/2.0.4 Perl/v5.10.0
X-Powered-By: PHP/5.2.6
Content-Length: 99
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: text/html
*******SCRIPT****************************
< ?php
$var = $_POST['codigo'];
if(isset($var)) {
if($var == 1) {
echo "bien";
} else {
echo "mal";
}
} else {
echo "
";
}
? >
***************************************
Seguire intentando haber que puedo hacer, esto no se tiene que quedar asi jejejeje.
Y gracias por tus respuestas !!!.
Mira, mejor te dejo el enlace a la imagen con el codigo, por que hay problemas al escribir el code
http://kmykc.110mb.com/img/codigo.jpg
Tenes dos problemas, el primer problema está en el código
if($var == 1){
El problema es que cuando asignas $var a $_POST['codigo'], éste retorna una cadena y no un número. Así que lo correcto sería poner
if($var == '1'){
De todas formas se interpreta de igual forma.
El segundo error está en la petición
content-type: application/x-www-form-urlencode
La forma correcta de realizar la petición sería
content-type: application/x-www-form-urlencoded
Lo acabe de probar con tu script, y funciona de maravilla.
Gracias por la ayuda brother, pero lamentablemente sigue son darme el resultado.
Si a ti te ha funcionado y lo he hecho tal cual lo has hecho tu, pues entonces creo que puede ser algun error de mi servidor, crees que sea posible eso ?.
De nuevo gracias por las respuestas.
Yo diría que no es posible, porque si es un servidor que ha venido en desarollo, no debe porque ser error del servidor.
Si puedes, pon de nuevo la petición que haces.
********Peticion con telnet*********
http://img229.imageshack.us/img229/4096/telent1tm4.jpg
********Script PHP******************
http://img375.imageshack.us/img375/1/telnet2uy9.jpg
Pero no entiendo porque en el código php está
echo "Variable: ".$var."<br>"
En la respuesta del script está "Var2 : <br>" y debería ser "Variable: <br>". Seguro que lo que modificaste no afectó para nada el script?
Por otra parte vas a tener que hacer lo siguiente:
Instalar la extensión Tamper data para firefox, hacer un formulario que envie los datos a ese script y comprobar que lance la respuesta de "Bien". Abre el tamper data antes de enviar la petición, y te fijas cuales son todas las cabeceras que envia el firefox. Y estas mismas cabeceras usalas con el telnet. Depronto tu servidor a la falta de alguna cabecera responde mal y por eso te falla el script.
Chale brother, no se que diablos pasa, ya instale el complemento al firefox (muy bueno por cierto), cheque todas las cabeceras que manda, escribi todas en telnet y sigue dandome el mensaje de que esta mal.
De hecho ni siquiera recibe la variable, por que no la imprime.
Lo que me decias de "var2" no hay problema, lo que pasa que modifique solo esa parte despues de capturar la ventana, osea que no hay problema por eso.
Por eso te preguntaba si existia una posibilidad de que tuviera algo que ver el servidor, pero creo que no tiene nada que ver.
Ni hablar, seguire buscando mas info para ver que se puede hacer, por que no pienso descansar hasta encontrar el fallo o lo que este pasando.
Si averiguas que es, me contas porque me dejas con la duda, de todas formas el procedimiento que estás realizando es el correcto.
Un último intento que yo haría sería imprimir todas las variables con PHP, y luego por medio de telnet observar que es lo que está recibiendo el PHP
La forma de hacerlo sería como lo hace mi visor http pero sin una restricción. Así queda:
foreach($_SERVER as $i => $val){
echo $i.' = '.$val.chr(13).chr(10);
}
?>
O imprimiendo las variables globales
print_r($GLOBALS);
?>
Que tal brother, pues finalmente he encontrado el error del por que la peticion POST no me estaba funcionando, como comentaste que cuando lo solucionara lo comentara, pues a qui esta.
Creo que tu, al igual que yo, te vas a cagar de la risa por el error que tenia.
Y el ERROR era por que simplemente tenia que poner el nombre de las cabeceras en mayusculas, si como lo lees, en mayusculas, probablemente asi lo estabas haciendo tu, pero yo lo estaba haciendo con minusculas, ya que en las peticiones GET no tenia ningun problema.
*******PETICION MAL HECHA****************
post /ejercicios/cabeceras/cabecera.php http/1.1
host: localhost
content-type: application/x-www-form-urlencoded
content-length: 12
codigo=kmykc
*******PETICION BIEN HECHA****************
POST /ejercicios/cabeceras/cabecera.php http/1.1
HOST: localhost
CONTENT-TYPE: application/x-www-form-urlencoded
CONTENT-LENGTH: 12
codigo=kmykc
Y como veras solamente utilice las cabeceras de CONTENT-TYPE y la forzosa CONTENT-LENGTH, claro, aparte de las cabeceras de ley.
Esto lo hice gracias a que se me ocurrio hacerlo con "lynx", y ver las respuestas que me mandaba de las cabeceras que recibia, y tambien aclarar que fue por mera coincidencia, ya que me dio flojera estar escribiendo todo y solamente lo copie y pegue y zaazzzz !!!!.
Pero bueno, agreguemos otro dato a la experiencia y gracias por apoyarme todos estos dias HaDeS.
Que bueno que lo hayas logrado, había pensado lo de las mayúsculas, pero lo obvie.
Ciertamente es una parte muy importante del protocolo, y en el RFC indican los métodos con mayúscula.
yo entiendo casi todo, lo que no me queda claro es, como haga para enviar estas cabeceras???
se que se hacen con las cookies, pero como es el mecanismo para que funcione esto???
soalmente guardo la cookie, y la pagina abrira solita????
Hola BLACKUBAY, la forma en que podes enviar las cabeceras desde tú computador al servidor es por medio de extensiones o de programas.
Un programa muy utilizado hace mucho era Achilles, que hacía las veces de proxy y de extensión para modificar datos, ahora con la salida del navegador Firefox, podes descargar extensiones que permiten fácilmente la modificación de dichas cabeceras. Personalmente uso dos extensiones, la primera se llama Tamper Data, la cual deja modificar en tiempo de ejecución las cabeceras, y la extensión Modify Headers, con la cual podes modificar las cabeceras sin tener que modificarlas en tiempo de ejecución.
Tamper Data: https://addons.mozilla.org/es-ES/firefox/addon/966
Modify Headers: https://addons.mozilla.org/en-US/firefox/addon/967
Y si queres modificar las cookies lo podes hacer con la extensión: https://addons.mozilla.org/firefox/addon/573