El navegador web más sencillo del mundo

Quizá la manera más sencilla de demostrar cómo funciona el protocolo HTTP
sea escribir un programa en Python muy sencillo, que realice una conexión a un
servidor web y siga las reglas del protocolo HTTP para solicitar un documento y
mostrar lo que el servidor envía de regreso.

En primer lugar, el programa realiza una conexión al puerto 80 del servidor www.py4e.com. Puesto que nuestro programa está jugando el rol de “navegador web”, el protocolo HTTP dice que debemos enviar el comando GET seguido de una línea en blanco. \r\n representa un salto de línea (end of line, o EOL en inglés), así que \r\n\r\n significa que no hay nada entre dos secuencias de salto de línea. Ese es el equivalente de una línea en blanco.

Una vez que enviamos esa línea en blanco, escribimos un bucle que recibe los datos desde el socket en bloques de 512 caracteres y los imprime en pantalla hasta que no quedan más datos por leer (es decir, la llamada a recv() devuelve una cadena vacía).

El programa produce la salida siguiente:

La salida comienza con la cabecera que el servidor envía para describir el documento. Por ejemplo, la cabecera Content-Type indica que el documento es un documento de texto sin formato (text/plain).

Después de que el servidor nos envía la cabecera, añade una línea en blanco para indicar el final de la cabecera, y después envía los datos reales del archivo romeo.txt.

Este ejemplo muestra cómo hacer una conexión de red de bajo nivel con sockets. Los sockets pueden ser usados para comunicarse con un servidor web, con un servidor de correo, o con muchos otros tipos de servidores. Todo lo que se necesita es encontrar el documento que describe el protocolo correspondiente y escribir el código para enviar y recibir los datos de acuerdo a ese protocolo.

Sin embargo, como el protocolo que se usa con más frecuencia es el protocolo web HTTP, Python tiene una librería especial diseñada especialmente para trabajar con éste para recibir documentos y datos a través de la web.

Uno de los requisitos para utilizar el protocolo HTTP es la necesidad de enviar y recibir datos como objectos binarios, en vez de cadenas. En el ejemplo anterior, los métodos encode() y decode() convierten cadenas en objectos binarios y viceversa.

El siguiente ejemplo utiliza la notación b ‘ ‘ para especificar que una variable debe ser almacenada como un objeto binario. encode() y b’ ‘ son equivalentes.