Contenido principal

Breve discusión acerca del protocolo HTTP

Septiembre 8, 2008

Explico varias cosas
* La función “SepararHostdeUrl” todavía no esta completamente terminada, me falta agregarle para que funcione con números ip.
* Ws.Connect, se utiliza para conectar al servidor, el primer parámetro indica el host o Ip del servidor, y el segundo indica el puerto en el cual se esta brindando el servicio.
* Ws.Senddata, se utiliza para enviar datos al servidor.
* Ws.Getdata, se utiliza para recibir lo que nos manda el servidor, el primer parámetro es la variable en la cual se almacenará lo que este nos envié, el segundo parámetro es el tipo de dato que se esta recibiendo y el tercer dato es la longitud de los datos que recibimos.
* El textbox “Petición” debe estar especialmente armado con la petición que queremos enviar. Ej:

GET / HTTP/1.1
...

En la versión completa del minibrowser, esta implementadas algunas funciones como guardar la respuesta del servidor, editar variables, construirlas, manejo de cookies.

Guardar respuesta del servidor
Como vemos en las respuesta del servidor, podemos separar dos elementos claros, las cabeceras del servidor y el cuerpo del mensaje, los cuales están separados por un doble (crlf), para guardar la respuesta del servidor, por ejemplo un archivo .exe, lo unico que hacemos en el codigo es separar toda la respuesta en dos, la primera parte es la que desechamos que son las cabeceras del servidor, y la segunda la guardamos la cual es el archivo en si:

Ws.getdata Datos
...
If InStr(1, Datos, vbCrLf & vbCrLf) Then ‘Si en los datos se encuentra el doble crlf
Guardar = Split(Respuesta, vbCrLf & vbCrLf, 2)(1) ‘variable guardar es la segunda parte de la division de la respuesta teniendo encuenta el crlf
Else
Guardar = Datos ‘si no se encuentra el doble crlf, la variable guardar son los datos
End If
Canal = FreeFile ‘escogemos canal libre
Open App.path & “\archivo” For Binary Access Write As Canal ‘abrimos el archivo “archivo” en modo binari0, para los archivo como imagenes o ejecutables.
Put #Canal, LOF(Canal) + 1, Guardar ‘escribimos sobre el archivo
Close #Canal ‘cerramos canal

Sin programación sería algo así

HTTP/1.1 200 OK
Bla Bla
Bla Bla
Content-Length: 1024

BMP...

El código separaría las cabeceras que manda el servidor con el cuerpo del mensaje, y luego guardaría el cuerpo del mensaje en el archivo indicado. En este caso se guardaría un BMP de 1 mega.

Manejo de Cookies
Para el manejo de cookies, nos debemos fijar en la cabecera que nos manda el servidor.
Un ejemplo:

HTTP/1.1 302 Found
Date: Sat, 03 Nov 2007 02:03:25 GMT
Server: Apache
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Set-Cookie: pwl=4d186321c1a7f0f354b297e8914ab240; expires=Sat, 03 Nov 2007 03:03:26 GMT
Content-Length: 0

El valor de la cookie, nos la manda el servidor con la cabecera Set-Cookie, por lo cual si queremos manejar las cookies, debemos agregar un TextBox con el nombre Cookie.text, y el siguiente código meterlo en el Ws_DataArrival:

Ws.getdata Datos
Parte1 = Split(Datos, vbCrLf) ‘dividimos la cabecera del servidor según el crlf
For i = 0 To UBound(Parte1) ‘recorremos todas las cabeceras
Parte2 = Split(Parte1(i), " ", 2) ‘cada cabecera la dividimos según la cabecera y contenido
If LCase$(Parte2(0)) = "set-cookie:" Then ‘si la cabecera es set-cookie
Parte3 = Split(Parte2(1), ";") ‘dividimos el contenido por “;”
For n = 0 To UBound(Parte3) ‘recorremos su contenido
If LCase$(Mid$(Trim$(Parte3(n)), 1, 8)) <> "expires=" And LCase$(Mid$(Trim$(Parte3(n)), 1, 6)) <> "path=/" Then ‘ignoramos los “expires” y los “path”
If InStr(1, Cookie.Text, Parte3(n)) = 0 Then ‘si el contenido de la cookie ya estaba en el textbox se ignora el nuevo contenido
If Cookie.Text = "" Then ‘si cookie.text esta vacío
Cookie.Text = Parte3(n) ‘metemos la cookie
Else
Cookie.Text = Cookie.Text & "; " & Parte3(n) ‘si no esta vacío, ponemos el contenido de cookie mas un “; “ y luego metemos la cookie nueva
End If
End If
End If
Next n
End If
Next i

Como dije anteriormente, los contenidos tratados son muy básicos, es una base para poder empezar a tratar con el protocolo HTTP.
El código fuente del minibrowser puede ser descargado de acá: http://www.sinfocol.org/archivos/programas/MiniBrowser.zip

Páginas: 1 2 3 4

Archivado en: Programación |

18 comentarios

  1. kmykc Septiembre 23, 2008 @ 7:23 pm

    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.

  2. Sysroot Septiembre 23, 2008 @ 7:52 pm

    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:

    post /ejercicios/cabeceras/cabecera.php http/1.1 (ctrl)
    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]"

  3. kmykc Septiembre 23, 2008 @ 11:29 pm

    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.

  4. kmykc Septiembre 23, 2008 @ 11:31 pm

    *******************************************
    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";
    }
    ?>

  5. Sysroot Septiembre 24, 2008 @ 12:50 am

    Es posible entonces que falte una cabecera, y creo saber cual es. Mira si probando esto te funciona:

    POST /ejercicios/cabeceras/cabecera.php http/1.1
    host: localhost
    content-length: 12
    content-type: application/www-x-form-urlencoded

    codigo=kmykc

  6. kmykc Septiembre 24, 2008 @ 2:29 pm

    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 !!!.

  7. kmykc Septiembre 24, 2008 @ 2:42 pm

    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

  8. Sysroot Septiembre 24, 2008 @ 8:37 pm

    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.

  9. kmykc Septiembre 27, 2008 @ 7:57 pm

    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.

  10. Sysroot Septiembre 27, 2008 @ 8:04 pm

    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.

  11. kmykc Septiembre 27, 2008 @ 9:49 pm

    ********Peticion con telnet*********

    http://img229.imageshack.us/img229/4096/telent1tm4.jpg

    ********Script PHP******************

    http://img375.imageshack.us/img375/1/telnet2uy9.jpg

  12. Sysroot Septiembre 27, 2008 @ 10:53 pm

    Pero no entiendo porque en el código php está
    echo "Variable: ".$var."<br>"
    En la respuesta del script está "Var2 : &ltbr>" y debería ser "Variable: &ltbr>". 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.

  13. kmykc Septiembre 28, 2008 @ 12:59 am

    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.

  14. Sysroot Septiembre 28, 2008 @ 3:28 am

    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:

    < ?php
    foreach($_SERVER as $i => $val){
    echo $i.' = '.$val.chr(13).chr(10);
    }
    ?>

    O imprimiendo las variables globales

    < ?php
    print_r($GLOBALS);
    ?>
  15. kmykc Septiembre 29, 2008 @ 4:22 pm

    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.

  16. Sysroot Septiembre 29, 2008 @ 5:22 pm

    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.

  17. BLACKUBAY Marzo 25, 2009 @ 9:02 pm

    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????

  18. Sysroot Marzo 25, 2009 @ 11:02 pm

    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

Deja un comentario