Subsecciones


HTTP

Introducción

  1. HTTP es un protocolo sin estado: que no guarda ninguna información sobre conexiones anteriores.

  2. El desarrollo de aplicaciones web necesita frecuentemente mantener estado.

  3. Para esto se usan las cookies, que es información que un servidor puede almacenar en el sistema cliente.

  4. Esto le permite a las aplicaciones web introducir la noción de sesión, y también permite rastrear usuarios ya que las cookies pueden guardarse en el cliente por tiempo indeterminado.
  5. Una transacción HTTP está formada por un encabezado seguido, opcionalmente, por una línea en blanco y algún dato.

  6. El encabezado especificará cosas como la acción requerida del servidor, o el tipo de dato retornado, o el código de estado.
  7. El uso de campos de encabezados enviados en las transacciones HTTP le da flexibilidad al protocolo. Estos campos permiten que se envíe información descriptiva en la transacción, permitiendo así la autenticación, cifrado e identificación de usuario.
  8. Un encabezado es un bloque de datos que precede a la información propiamente dicha, por lo que a veces se hace referencia a él como metadato, porque tiene datos sobre los datos.
  9. Si se reciben líneas de encabezado del cliente, el servidor las coloca en las variables de entorno de CGI con el prefijo HTTP_ seguido del nombre del encabezado. Cualquier carácter guion ( - ) del nombre del encabezado se convierte a caracteres "_".

    Ejemplos de estos encabezados del cliente son HTTP_ACCEPT y HTTP_USER_AGENT.

    1. HTTP_ACCEPT. Los tipos MIME que el cliente aceptará, dados los encabezados HTTP. Los elementos de esta lista deben estar separados por comas
    2. HTTP_USER_AGENT. El navegador que utiliza el cliente para realizar la petición. El formato general para esta variable es: software/versión biblioteca/versión.
    El servidor envía al cliente:
    1. Un código de estado que indica si la petición fue correcta o no. Los códigos de error típicos indican que el archivo solicitado no se encontró, que la petición no se realizó de forma correcta o que se requiere autenticación para acceder al archivo.
    2. La información propiamente dicha. HTTP permite enviar documentos de todo tipo y formato, como gráficos, audio y video.
    3. Información sobre el objeto que se retorna.

Sesiones HTTP

  1. Una sesión HTTP es una secuencia de transacciones de red de peticiones y respuestas

  2. Un cliente HTTP inicia una petición estableciendo una conexión TCP con un puerto particular de un servidor (normalmente el puerto 80)
  3. Un servidor que esté escuchando en ese puerto espera por un mensaje de petición de un cliente.
  4. El servidor retorna la línea de estatus, por ejemplo HTTP/1.1 200 OK, y su propio mensaje. El cuerpo de este mensaje suele ser el recurso solicitado, aunque puede que se trate de un mensaje de error u otro tipo de información.

Veamos un ejemplo. Usemos este servidor:

[~/local/src/ruby/sinatra/rack/rack-debugging]$ cat hello1.rb 
require 'rack'

class HelloWorld
  def call env
    [200, {"Content-Type" => "text/plain"}, ["Hello world"]]
  end
end

Rack::Handler::WEBrick::run HelloWorld.new

[~/local/src/ruby/sinatra/rack/rack-debugging]$ ruby hello1.rb 
[2013-09-23 15:16:58] INFO  WEBrick 1.3.1
[2013-09-23 15:16:58] INFO  ruby 1.9.3 (2013-02-22) [x86_64-darwin11.4.2]
[2013-09-23 15:16:58] INFO  WEBrick::HTTPServer#start: pid=12113 port=8080

Arrancamos un cliente con telnet con la salida redirigida:

[~/local/src/ruby/sinatra/rack/rack-debugging]$ telnet localhost 8080 > salida

Escribimos esto en la entrada estandard:

GET /index.html HTTP/1.1
Host: localhost
Connection: close
con una línea en blanco al final. Este texto es enviado al servidor.

El cliente deja su salida en el fichero salida:

[~/local/src/ruby/sinatra/rack/rack-debugging]$ cat salida
Trying ::1...
Connected to localhost.
Escape character is '^]'.
HTTP/1.1 200 OK 
Content-Type: text/plain
Server: WEBrick/1.3.1 (Ruby/1.9.3/2013-02-22)
Date: Mon, 23 Sep 2013 14:33:16 GMT
Content-Length: 11
Connection: close

Hello world
El cliente escribe en la salida estandard:
Connection closed by foreign host.


Métodos de Petición

  1. GET

    Solicita una representación de un recurso especificado. Las peticiones que usen GET deberían limitarse a obtener los datos y no tener ningún otro efecto.

  2. HEAD

    Pregunta por la misma respuesta que una petición GET pero sin el cuerpo de la respuesta

  3. POST

    Requests that the server accept the entity enclosed in the request as a new subordinate of the web resource identified by the URI. The data POSTed might be, as examples,

    1. an annotation for existing resources;
    2. a message for a bulletin board, newsgroup, mailing list, or comment thread;
    3. a block of data that is the result of submitting a web form to a data-handling process;
    4. or an item to add to a database.
  4. PUT

    Requests that the enclosed entity be stored under the supplied URI. If the URI refers to an already existing resource, it is modified; if the URI does not point to an existing resource, then the server can create the resource with that URI.

  5. DELETE

    Deletes the specified resource.

  6. TRACE

    Echoes back the received request so that a client can see what (if any) changes or additions have been made by intermediate servers.

  7. OPTIONS

    Returns the HTTP methods that the server supports for the specified URL. This can be used to check the functionality of a web server by requesting * instead of a specific resource.

  8. CONNECT

    Converts the request connection to a transparent TCP/IP tunnel, usually to facilitate SSL-encrypted communication (HTTPS) through an unencrypted HTTP proxy.

  9. PATCH

    Is used to apply partial modifications to a resource. HTTP servers are required to implement at least the GET and HEAD methods and, whenever possible, also the OPTIONS method

Véase

  1. ArrrrCamp #6 - Konstantin Haase - We don't know HTTP
  2. Resources, For Real This Time (with Webmachine) Sean Cribbs Ruby Conference 2011

Casiano Rodríguez León
2015-01-25