Saltar al contenido

Artículos, tutoriales, trucos, curiosidades, reflexiones y links sobre programación web ASP.NET Core, MVC, Blazor, SignalR, Entity Framework, C#, Azure, Javascript... y lo que venga ;)

17 años online

el blog de José M. Aguilar

Inicio El autor Contactar

Artículos, tutoriales, trucos, curiosidades, reflexiones y links sobre programación web
ASP.NET Core, MVC, Blazor, SignalR, Entity Framework, C#, Azure, Javascript...

¡Microsoft MVP!
martes, 14 de diciembre de 2021
Protocolo HTTP Como sabemos, en las peticiones HTTP se envían al servidor un conjunto de “parámetros” o encabezados que añaden información extra para que la solicitud pueda ser procesada correctamente. Ahí encontramos información sobre el lado cliente, como la cadena de agente de usuario (encabezado user-agent), información sobre la propia petición, como el host al que se dirige la petición (encabezado host) o los idiomas que se aceptan para el contenido (accept-language), e incluso información contextual como las cookies del usuario (cookie) o información de autorización (authorization), entre muchos otros.

Hoy vamos a detenernos en una curiosidad histórica sobre el protocolo HTTP y uno de sus más célebres encabezados :)

Entre los encabezados HTTP enviados en las peticiones se encuentra también el conocido referer que, básicamente, indica cuál fue la página desde la cual se realizó la petición actual. Por ejemplo, en un cambio de página indicaría cuál es la página a la que se volvería al pulsar el botón “atrás” del browser o en peticiones Ajax la página base desde la cual se ha realizado.

ErrorSin embargo, si nos paramos un poco, observaremos que la palabra “referer” no existe en inglés. El término más parecido, y que tiene sentido en el contexto en que lo estamos utilizado sería “referrer” (referencia o referente).

Pues sí, amigos, esto pasa en las mejores familias 😆 Cuando Phillip Hallam-Baker y Roy Fielding propusieron la introducción de dicho encabezado en el estándar HTTP -RFC 1945- , se les coló el error ortográfico y el estándar fue redactado de esa forma. Cuando se dieron cuenta del gazapo ya era demasiado tarde porque estaba siendo utilizado ampliamente y realizar el cambio resultaría más doloroso que asumirlo y seguir adelante con el error.

Según Wikipedia, el motivo, aunque es más bien un pequeño disclaimer en tono jocoso, era que el corrector ortográfico de Unix utilizado en aquél momento no reconocía ni “referer” ni “referrer”, según comentaba Roy Fielding en las listas de correo de la W3C en 1995:
From: John Franks <john@math.nwu.edu> 
Date: Thu, 9 Mar 1995 22:46:47 -0600 (CST)
Subject: Referer: (sic)

Has anyone else noticed that the HTTP header "Referer:" is spelled wrong?

===================

From: Roy T. Fielding <fielding@avron.ICS.UCI.EDU> 
Date: Thu, 09 Mar 1995 21:24:23 -0800
To: John Franks <john@math.nwu.edu> 
Subject: Re: Referer: (sic)

> Has anyone else noticed that the HTTP header "Referer:" is spelled wrong?

That's okay, neither one (referer or referrer) is understood by "spell"
anyway.  I say we should just blame it on France.  ;-)

........Roy
La cuestión es que el término “referer” se convirtió en el estándar de facto, a pesar de ser incorrecto. Años después, Phillip Hallam-Baker hacía bromas con ello:
“Es como cuando propuse el campo “referer”. Me lamento de haberlo escrito de esa forma, pero a día de hoy estoy intentado que en el Oxford English Dictionary cambien el término correcto por este, pues el mío se utiliza muchos millones de veces por minuto más que el suyo”
Y su razón tenía. Quién sabe cuánto ancho de banda ha ahorrado la omisión de este carácter a lo largo de la historia 😄

¿Y en qué nos afecta a los desarrolladores?

En principio no debe afectarnos demasiado siempre que asumamos el error original e interioricemos que el nombre del encabezado es “referer”, como muestra de apoyo y solidaridad con los autores (bueno, y por alineación con el estándar) ;)

Por ejemplo, en .NET Framework la enumeración System.Net.HttpRequestHeader perpetuaba la ortografía incorrecta llevándola a un entorno de tipado fuerte:
public enum HttpRequestHeader
{
    CacheControl,
    Connection,
    ...
    Referer, // <-- Hey!
    Range,
    Te,
    Translate,
    UserAgent,
}
También en .NET Core podemos encontrar una clara alineación entre el nombre tipado del encabezado y su valor:
namespace Microsoft.Net.Http.Headers
{
    public static class HeaderNames
    {
        public const string Accept = "Accept";
        public const string AcceptCharset = "Accept-Charset";
        ...
        public const string Referer = "Referer"; // <-- Hey!
        ...
    }        
}
En ambos casos tiene sentido porque estos elementos se utilizan para acceder al encabezado “referer” utilizando distintos métodos y componentes del framework. Aunque ortográficamente incorrectos, al menos son una muestra de coherencia, pues el elemento de la enumeración y la constante se llaman exactamente igual que el encabezado HTTP al que hacen referencia.

Pero hay otros casos donde no es así, y “referrer” hay que escribirlo de la forma correcta. Por ejemplo, en ASP.NET 4.x es posible acceder al valor del encabezado “referer” mediante la propiedad UrlReferrer (esta vez con dos erres) del objeto Request:
public ActionResult Whatever()
{
    Uri referrer = Request.UrlReferrer;
    ...
}    
Esto mismo ocurre con Javascript, donde podemos acceder al contenido de dicho encabezado mediante la propiedad document.referrer (también con dos erres):
alert(document.referrer);
Aunque pueda parecer extraño o incoherente con los ejemplos que vimos antes, estos usos son es correctos, pues en ambos casos estamos accediendo al concepto “referrer”. Obviamente este dato será obtenido internamente desde encabezado HTTP “referer”, pero es ya es un detalle de implementación de menor nivel.

Referencias:
Publicado en Variable not found.

2 Comentarios:

MontyCLT dijo...

Teniendo en cuenta que las dos primera enumeraciones están ligadas al protocolo HTTP en específico, me parece lógico que se use "referer" con una sola erre, mientras que las dos API de abajo hacen referencia al concepto, y no a la implementación concreta, también me parece lógico que se use la palabra "referrer" con dos erres.

Utilizar la palabra "referer" en las API de los dos segundos ejemplos sería un "architecture leaks".

Quién sabe si en un futuro HTTP podría ser sustituido por otro protocolo donde esta palabra esté bien escrita... (¿alguien se acuerda de SPDY?)

José María Aguilar dijo...

Hola,

pues quién sabe... nuevos protocolos serían sin duda buenas oportunidades para enmendarlo ;D

Pero de todas formas, eso de enviar el "referrer" está cada vez peor visto por temas de privacidad, y es posible que con el tiempo termine desapareciendo.

Gracias por comentar!