NOTA DEL TRADUCTOR: los posibles errores presentes en este documento, debidos a la traducción, son responsabilidad del traductor y no son achacables en modo alguno los autores de la especificación, Ian Hickson y Stuart Langridge. Para cualquier comentario sobre la traducción dirijanse a Ignacio Javier "igjav". La única versión normativa oficial de este documento es la versión original (en inglés):

http://www.hixie.ch/specs/pingback/pingback-1.0

Pingback 1.0

Las únicas versiones oficiales de esta especificación son las versiones originales (en inglés), citadas a continuación:

Esta versión:
http://www.hixie.ch/specs/pingback/pingback-1.0
Última versión:
http://www.hixie.ch/specs/pingback/pingback
Versiones previas:
http://www.hixie.ch/specs/pingback/pingback-0.9.3
http://www.hixie.ch/specs/pingback/pingback-0.9.2
http://www.hixie.ch/specs/pingback/pingback-0.9.1
http://www.hixie.ch/specs/pingback/pingback-0.9
http://www.kryogenix.org/writings/tech/pingback
http://www.kryogenix.org/days/000138.cas
Editores:
Stuart Langridge <sil@kryogenix.org>
Ian Hickson <ian@hixie.ch>

Resumen

Pingback es un método dirigido a autores de la web para requerir notificación cuando alguien enlaza con uno de sus documentos. Normalmente, el software de publicación de documentos web informará automáticamente a las partes implicadas de parte del usuario, permitiendo la posibilidad de crear enlaces automáticamente a los documentos referentes.

Por ejemplo, Alicia escribe un artículo interesante en su bitácora. Entonces Roberto lee este artículo y comenta acerca de él, enlazando con el artículo original de Alicia. Usando pingback, el software de Roberto puede notificar automáticamente a Alicia que su envío ha sido enlazado, y el software de Alicia puede incluir esta información en su sitio web.

Estado de este documento

Esta es una especificación estable. Son bienvenidos los comentarios en la lista de correo Blogite (archivada).

Actualmente se conocen seis desarrollos prácticos diferentes de esta especificación, aunque no se han hecho pruebas formales para probar en que medida se adaptan a la especificación:

Se incita a los autores a hacer pingback http://www.hixie.ch/specs/pingback/pingback para registrar sus desarrollos prácticos.

Idiomas disponibles

La versión en Inglés de esta especificación es la única versión normativa. De todos modos, para traducciones de este documento, ver http://www.hixie.ch/specs/pingback/translations/. Las traducciones disponibles actualmente son:

Tabla de contenidos


1. Introducción

El sistema de pingback es un camino para una bitácora web de ser automáticamente notificada cuando otros sitios web enlazan con ella. Es enteramente transparente al autor del enlace, no requiriendo intervención del usuario alguna para su funcionamiento, y opera en base a principios de descubrimiento automático de todo aquello que necesita conocer. Un envío de bitácora de ejemplo, en el que esté involucrado pingback, podría desarrollarse de la siguiente manera:

  1. Alicia realiza un envío a su bitácora. Su envío incluye un enlace a un envío en la bitácora de Roberto.
  2. El software de bitácoras de Alicia contacta con el sistema de bitácoras de Roberto y le dice: "atiende, Alicia ha hecho un envío que enlaza con uno de tus envíos".
  3. El software de bitácoras de Roberto, entonces, incluye, en el envío original de Roberto, un enlace de vuelta al envío de Alicia.
  4. El lector del artículo de Roberto puede entonces seguir este enlace al envío de Alicia para leer su opinión.

Habilita enlaces inversos (hiperenlazado inverso) — una manera de regresar por una cadena de enlaces en vez de simplemente hacer introspección.

1.1. Detalles técnicos

El mecanismo de pingback usa una cabecera HTTP y un elemento <link> de HTML o XHTML para descubrimiento automático, y usa una simple llamada XML-RPC para notificar al sitio web de destino, del enlace realizado desde el sitio de origen.

Se pretende que los clientes pingback conformes y los servidores pingback sean programables con un esfuerzo mínimo usando bibliotecas comunmente disponibles en entornos de CGI. Por esta razón, los requerimientos de filtrado/análisis de cabeceras HTTP y documentos HTML se han mantenido a un nivel de mínimo imprescindible.

1.2. Definiciones

URI de origen (source URI)
La dirección de la entrada en el sitio web conteniendo el enlace.
cliente pingback
El software que establece la conexión para informar al servidor acerca del enlace desde el origen al destino. Usualmente, el origen será el cliente.
recurso habilitado-pingback
Un documento, imagen o otro recurso que anuncia un servidor de pingback usando una cabecera HTTP de pingback o un elemento link de pingback.
servidor pingback
El software que acepta conexiones XML-RPC. Normalmente, el URI de destino estará asociado con el servidor (p. ej. en el mismo host).
agente de usuario pingback
Un sistema único, el cual es a su vez un cliente pingback y un servidor pingback.
URI de destino (target URI)
El destino del enlace en el sitio web de origen. DEBERÍA ser una página web habilitada-pingback.

Las palabras clave "DEBE", "NO DEBE", "REQUERIDO", "DEBERÁ", "NO DEBERÁ", "DEBERÍA", "NO DEBERÍA", "RECOMENDADO", "PUEDE", y "OPCIONAL" en este documento, con sus respectivas variantes en plural y/o reflexivas, donde sea aplicable, poseen intrínsecamente la interpretación de sus términos análogos en inglés:"MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" (por ese orden), que se describe en [RFC 2119].


2. Descubrimiento Automático de Servidor

Existen dos mecanismos para efectuar el descubrimiento de servidores pingback de manera automática o automatizada: el elemento <link> de HTML (o XHTML) y las cabeceras HTTP. Un recurso habilitado-pingback DEBE servirse con una cabecera HTTP X-Pingback, o bien contener un elemento <link>, o ambas cosas. Las páginas HTML y XHTML habilitadas-pingback  DEBEN ser válidas. Los clientes PUEDEN rehusar a buscar información de pingback en páginas no válidas.

Téngase en cuenta que la manera en que el cliente es informado de las URI de origen y destino está fuera del ámbito de esta especificación. Normalmente los sistemas de bitácora extraerán los enlaces o hipervínculos externos de los envíos que están siendo preparados para su publicación, para de ese modo encontrar los URI de destino.

2.1. Cabecera HTTP

Los recursos habilitados-pingback PUEDEN ser devueltos con una cabecera X-Pingback HTTP. Por ejemplo, una imagen PNG servida con las siguientes cabeceras sería habilitada-pingback:

HTTP/1.1 200 OK
Date: Sun, 08 Sep 2002 15:05:37 GMT
Server: Apache/1.3.26 (Unix)
Last-Modified: Thu, 28 Dec 2000 03:18:26 GMT
ETag: "65044-15b9c-3a4ab102"
Accept-Ranges: bytes
Content-Length: 88988
Connection: close
Content-Type: image/png
X-Pingback: http://charlie.example.com/pingback/xmlrpc

.PNG...

El valor de la cabecera X-Pingback DEBE ser el URI absoluto del servidor XML-RPC de pingback.

Las páginas o recursos NO DEBEN incluir más de una cabecera de ese tipo. Los documentos HTML y XHTML PUEDEN  incluir un elemento <link> por añadidura a una cabecera HTTP, aunque no es aconsejable. Si es incluida, la cabecera DEBERÍA tener exactamente el mismo valor que posea el elemento <link>. En caso de discrepancia de valores, la cabecera HTTP DEBERÁ sobrescribir el valor del elemento <link>. De todos modos, los autores de documentos deben estar alerta del hecho que algunos clientes nos procesarán las cabeceras HTTP debido a limitaciones de su entorno operativo.

Los recursos habilitados-pingback NO DEBEN usar la cabecera HTTP Link para anunciar servidores de pingback. Las cabeceras HTTP Link requieren un filtrado/análisis no trivial, y han sido por tanto juzgadas como técnicamente demasiado cargantes para los propósitos de descubrimiento automático de servidores pingback.

2.2. Elemento Link

Una página habilitada-pingback, en HTML o XHTML, PUEDE contener un elemento <link> en una cualquiera de las siguientes formas:

HTML
<link rel="pingback" href="servidor de pingback">
XHTML
<link rel="pingback" href="servidor de pingback" />

En caso de ser usado, el elemento link DEBE cuadrar la forma apropiada de manera exacta (incluyendo el espacio en blanco antes de la barra diagonal (slash), por ejemplo).

Las páginas NO DEBEN incluir más de uno de tales elementos, y NO DEBEN incluir ninguna cadena que cuadre el patrón descrito más abajo, a no ser que se trate del elemento link concreto.

El descriptivo servidor de pingback DEBE ser reemplazado por el URI absoluto del servidor XML-RPC de pingback. Este URI NO DEBE incluir entidades distintas de &amp;, &lt;, &gt;, y &quot;. Otros caracteres que no sean válidos en el documento HTML o que no puedan ser representados en el character encoding del documento DEBEN ser salvados usando el mecanismo %xx (URL escape, comúnmente) tal como describe el [RFC2396].

Estos requerimientos tan estrictos, tienen como propósito el reducir significativamente los requerimientos en clientes que implementen descubrimiento automático de servidor. Fue estimado que requerir a los clientes la inclusión de un filtro/analizador de HTML aparte de un filtro/analizador de XML era una carga demasiado pesada, desde el momento en que sería muy sencillo para autores de páginas web cumplir con las restricciones dadas y descritas previamente.

2.3. Algoritmo de Descubrimiento Automático

Los Clientes de Pingback, dados un URI de origen y un URI de destino, DEBERÍAN recoger el URI de destino y seguir los siguientes pasos para encontrar el URI del servidor de pingback.

  1. Examinar las cabeceras HTTP de la respuesta. Si hay algunas cabeceras X-Pingback, entonces el valor de la primera de las citadas cabeceras debería ser usado como el URI del servidor de pingback. Los clientes DEBEN examinar las cabeceras HTTP si les es posible hacerlo. Si por alguna razón las cabeceras HTTP no están disponibles en el marco del desarrollo, entonces este paso se puede saltar. De todos modos, los implementadores deberían ser conscientes que este hecho reducirá la utilidad de su aplicación, ya que los elementos link no pueden, en esencia, ser usados en recursos web que no sean HTML ni XHTML, y las cabeceras HTTP, por definición, sobrescriben los valores de los elementos link, lo que es significativo en caso de que su valor difiera.
  2. O bien, buscar en el cuerpo de entidad HTTP la primera coincidencia de la siguiente expresión regular:
    <link rel="pingback" href="([^"]+)" ?/?>
  3. Si hay coincidencia con la expresión regular, entonces los clientes DEBEN expandir las cuatro entidades permitidas (&amp; por &, &lt; por <, &gt; por >, and &quot; por ").

Una vez extraído este URI correspondiente al servidor de pingback, DEBERÍA ser usado para enviar una solicitud XML-RPC como se describe posteriormente.

Si no hay cabecera X-Pingback y la expresión regular no cuadra, entonces el destino en cuestión no soporta pingback tal como es definido en esta especificación y el cliente PUEDE hacer lo que quiera. De todos modos, SE RECOMIENDA que los clientes no intenten ser más benevolentes (p. ej. efectuando un análisis/filtrado correcto del HTML y buscando elementos <link> que aparenten links de pingback desde el punto de vista de HTML) porque esto tendrá como consecuencia que ciertos sistemas reconozcan donde otros simplemente ignoren.

Los clientes PUEDEN optimizar la búsqueda. Por ejemplo:

Téngase en cuenta que, de todos modos, estas optimizaciones son propensas a obviar documentos legítimos, por ejemplo, aquellos que tengan comentarios conteniendo las cadenas de texto descritas anteriormente, o aquellos con considerables hojas de estilo en línea que aparezcan situadas justo antes del elemento link de pingback. Se alienta a los autores a tener muy en cuenta estas posibles optimizaciones cuando decidan donde situar sus links de pingback.


3. Interfaz XML-RPC

Los clientes de pingback, una vez hayan descubierto un servidor de pingback, DEBERÍAN enviar al servidor una solicitud XML-RPC con el nombre de método pingback.ping y dos argumentos, el URI de origen y el URI de destino, respectivamente. [XML-RPC]

pingback.ping
Notifica al servidor que un enlace ha sido agregado a URIorigen, apuntando a URIdestino.
Parámetros
URIorigen de tipo cadena de texto (string)
El URI absoluto del envío a bitácora en la página de origen que contiene el enlace al sitio web de destino.
URIdestino de tipo cadena de texto (string)
El URI absoluto de el destino del enlace, tal como viene dado en la página de origen.
Valor de Retorno
Una cadena de texto, tal como se describe posteriormente.
Fallos
Si ocurriese una condición de error, entonces debería ser usado el código de fallo apropiado de entre los que figuran en la siguiente lista. Los clientes pueden rápidamente determinar el tipo de error examinando los bits del 5 al 8. Los códigos de fallo 0×001x se utilizan para expresar problemas con el URI de origen, los códigos de fallo 0×002x indican problemas con el URI de destino, y los códigos 0×003x son utilizados cuando no existe problema significativo con ninguno de ambos URI pero el pingback no puede ser reconocido por alguna otra razón.
0
Un código genérico de fallo. Los servidores PUEDEN usar este código de error en vez de uno cualquiera de los otros códigos de error existentes si no poseen un modo claro de determinar el código de fallo apropiado.
0×0010 (16)
El URI de origen no existe.
0×0011 (17)
El URI de origen no contiene un enlace al URI de destino, y por lo tanto no puede ser usado como origen.
0×0020 (32)
El URI especificado como de destino no existe. Este código únicamente DEBE ser usado cuando se tiene la certeza que el destino especificado no existe, no en el caso de que el destino pudiese existir pero no se reconoce. Ver el siguiente código de error.
0×0021 (33)
El URI de destino especificado no puede ser usado como destino. O bien no existe, o no es un recurso habilitado-pingback. Por ejemplo, en una bitácora, tradicionalmente únicamente los permalinks son recursos habilitados-pingback, e intentar hacer pingback a la página principal, o a un conjunto de envíos, fallará con este error.
0×0030 (48)
El pingback ya ha sido registrado anteriormente.
0×0031 (49)
Acceso denegado.
0×0032 (50)
El servidor no puede comunicarse con un servidor upstream, o ha recibido un error de un servidor upstream, y por lo tanto no puede completar la solicitud. Esto es similar al error de HTTP: 402 Bad Gateway. Este error DEBERÍA ser usado por servidores proxy de pingback al propagar los errores.
[FaultCodes] define, por añadidura, algunos códigos de fallo estándar que los servidores PUEDEN usar para avisar errores de más alto nivel.

Los servidores DEBEN responder a esta llamada a procedimiento o bien con una cadena de texto simple o bien con un código de fallo.

Si la solicitud de pingback es exitosa, entonces el valore de retorno DEBE ser una única cadena de texto, conteniendo tanta información como el servidor juzgue útil o conveniente. Es de esperar que esta cadena únicamente sea usada para depuración.

Si el resultado no es exitoso, entonces el servidor DEBE responder con un valor RPC de fallo. El código de fallo debería ser, o bien uno de los códigos anteriormente citados, o bien el código genérico de fallo cero si el servidor no puede determinar el código de fallo apropiado.

Los clientes PUEDEN ignorar el valor de retorno, haya sido o no exitosa la solicitud. SE RECOMIENDA que los clientes no muestren los resultados de las solicitudes exitosas al usuario.

Ante la llegada de una solicitud, los servidores PUEDEN hacer lo que quieran. De todos modos, SE RECOMIENDA seguir el siguiente procedimiento:

  1. El servidor PUEDE intentar descargar el URI de origen para asi verificar que el origen ciertamente enlaza con el destino.
  2. El servidor PUEDE verificar sus propios datos para asegurarse que el destino existe y es una entrada válida.
  3. El servidor PUEDE verificar que el pingback no ha sido registrado todavía.
  4. El servidor PUEDE registrar el pingback.
  5. El servidor PUEDE regenerar las páginas del sitio web o bitácora (si las páginas son estáticas).

4. Requerimientos de Conformidad

Para pretender la conformidad con esta especificación, un cliente de pingback DEBE soportar descubrimiento automático de servidor tal como se describe en esta especificación, y DEBE enviar correctamente solicitudes XML-RPC de pingback.

Para pretender la conformidad con esta especificación, un servidor de pingback DEBE ser capaz de recibir solicitudes XML-RPC de pingback y siempre DEBE devolver resultados que estén en conformidad con los valores de retorno permitidos. La devolución de códigos de fallo detallados (no cero) es OPCIONAL.

Nótese que algunos servidores de pingback pueden no tener páginas asociadas. Por ejemplo, un servidor de pasarela pingback podría ser de tipo "standalone", es decir, dedicado, y otras páginas usarían el elemento link para enlazar con esta pasarela en vez de proveer un servicio de pingback doméstico. Para pretender la conformidad con esta especificación un recurso habilitado-pingback DEBE tener, o bien una cabecera HTTP X-Pingback, o bien un elemento link de modo que se permita el descubrimiento automático de servidores.

Para pretender la conformidad con esta especificación, un agente de usuario pingback DEBE soportar descubrimiento automático de servidor tal cual ha sido descrito en esta especificación, DEBE enviar correctamente solicitudes XML-RPC de pingback, DEBE ser capaz de recibir solicitudes XML-RPC de pingback, DEBE devolver siempre resultados que se ajusten a los valores de retorno permitidos (la devolución de códigos de fallo detallados (no cero) es OPCIONAL), y DEBE tener, o bien una cabecera HTTP X-Pingback, o bien un elemento link en todas las páginas de destino potenciales, para de este modo permitir el funcionamiento del descubrimiento automático de servidores.


5. Ejemplo

A continuación se ofrece una observación más detallada acerca de lo que podría ocurrir entre Alicia y Roberto durante el transcurso del ejemplo descrito en la introducción.

  1. Alicia realiza un envío a su bitácora. El envío que acaba de hacer incluye un enlace a otro envío en la bitácora de Roberto. El permalink al nuevo envío que acaba de realizar Alicia es http://alice.example.org/#p123, y el URL del enlace a la bitácora de Roberto es http://bob.example.net/#foo.
  2. El sistema de bitácora de Alicia filtra/analiza todos los enlaces externos, hacia afuera del envío de Alicia, y encuentra http://bob.example.net/#foo.
  3. Entonces solicita los primeros 5 kilobytes de la página a la cual se refiere cada enlace.
  4. Busca al presencia de una cabecera X-Pingback, pero no la encuentra.
  5. Intenta encontrar, en el fragmento de página restante, la aparición de la marca link de pingback, la cual encuentra:
    <link rel="pingback" href="http://bob.example.net/xmlrpcserver">
    Si la página no hubiese contenido esta marca, entonces la bitácora de Roberto no soportaría pingback, y entonces el software de Alicia abandonaría aquí (desplazándose al siguiente enlace encontrado en el paso 2).
  6. A continuación, como la marca link estaba allí, ejecuta la siguiente llamada XML-RPC a http://bob.example.net/xmlrpcserver:
    pingback.ping('http://alice.example.org/#p123', 'http://bob.example.net/#foo')
  7. El sistema de bitácoras de Alicia repite los pasos del 3 al 6 para cada enlace externo que haya sido encontrado en el envío de bitácora.

Aquí finaliza el trabajo a llevar a cabo por el sistema de Alicia. El resto del trabajo lo realizará el sistema de bitácoras de Roberto.

  1. El sistema de bitácoras de Roberto recibe una solicitud de ping proveniente del sistema de bitácoras de Alicia (la solicitud de ping enviada en el paso número 6 anteriormente), detallando http://alice.example.org/#p123 (la dirección que enlaza con Roberto) y http://bob.example.net/#foo (la página con la que Alicia enlaza).
  2. El sistema de bitácoras de Roberto confirma que http://bob.example.net/#foo es, de hecho, un envío en su bitácora.
  3. Entonces solicita el contenido de http://alice.example.org/#p123, y chequea el Content-Type de la entidad devuelta con el propósito de asegurarse que es algún tipo de texto.
  4. Después verifica que este contenido, de hecho, contiene un enlace a http://bob.example.net/#foo (esto se hace para prevenir envíos masivos de pingback).
  5. La bitácora de Roberto también recolecta otros datos requeridos a partir del envío que acaba de hacer Alicia, tales como el título de la página, un extracto del contenido de la página, en el contexto del enlace al envío de bitácora de Roberto, cualesquiera atributos indicando el idioma de la página, y así sucesivamente.
  6. Finalmente, el sistema de Roberto registra el pingback en su base de datos, y regenera las páginas estáticas que se refieran al envío de bitácora de Roberto, de tal manera que mencionen el pingback realizado.

A. Referencias

[RFC 2119]
Key words for use in RFCs to Indicate Requirement Levels, S. Bradner. IETF, marzo de 1997. El RFC 2119 está disponible en inglés en http://www.normos.org/ietf/rfc/rfc2119.txt.
[RFC 2396]
Uniform Resource Identifiers (URI): Generic Syntax, T. Berners-Lee, R. Fielding, L. Masinter. IETF, agosto de 1998. El RFC 2396 está disponible en inglés en  http://www.normos.org/ietf/rfc/rfc2396.txt
[XML-RPC]
XML-RPC Specification, D. Winer. UserLand Software, Inc, junio de 1999. XML-RPC está disponible en inglés en http://www.xmlrpc.com/spec
[FaultCodes]
Specification for Fault Code Interoperability, D. Libby, et al, mayo de 2001. La Especificación para Interoperabilidad de Códigos de Fallo está disponible en inglés en http://xmlrpc-epi.sourceforge.net/specs/rfc.fault_codes.php