Re: [hybi] Adding clarification regarding future revisions (Was: Proposed way forward for WebSockets)

Jamie Lokier <jamie@shareable.org> Tue, 27 July 2010 16:29 UTC

Return-Path: <jamie@shareable.org>
X-Original-To: hybi@core3.amsl.com
Delivered-To: hybi@core3.amsl.com
Received: from localhost (localhost [127.0.0.1]) by core3.amsl.com (Postfix) with ESMTP id A5FEE3A682F for <hybi@core3.amsl.com>; Tue, 27 Jul 2010 09:29:02 -0700 (PDT)
X-Virus-Scanned: amavisd-new at amsl.com
X-Spam-Flag: NO
X-Spam-Score: -2.498
X-Spam-Level:
X-Spam-Status: No, score=-2.498 tagged_above=-999 required=5 tests=[AWL=0.101, BAYES_00=-2.599]
Received: from mail.ietf.org ([64.170.98.32]) by localhost (core3.amsl.com [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 5nVZ0kFBOePo for <hybi@core3.amsl.com>; Tue, 27 Jul 2010 09:29:01 -0700 (PDT)
Received: from mail2.shareable.org (mail2.shareable.org [80.68.89.115]) by core3.amsl.com (Postfix) with ESMTP id 8CF4B28C0D6 for <hybi@ietf.org>; Tue, 27 Jul 2010 09:29:01 -0700 (PDT)
Received: from jamie by mail2.shareable.org with local (Exim 4.63) (envelope-from <jamie@shareable.org>) id 1Odn1s-0002AN-W0; Tue, 27 Jul 2010 17:29:20 +0100
Date: Tue, 27 Jul 2010 17:29:20 +0100
From: Jamie Lokier <jamie@shareable.org>
To: Ian Hickson <ian@hixie.ch>
Message-ID: <20100727162920.GH23142@shareable.org>
References: <ECF0E97F-1DA2-4662-BA48-F68B65AA8179@apple.com> <4C4D66AF.9030905@opera.com> <Pine.LNX.4.64.1007270030120.24444@ps20323.dreamhostps.com> <AANLkTi=fx=Yfm_pe9-pdCc=5sKRP=dNfDEBYCKNHFOmH@mail.gmail.com> <op.vghnjpex64w2qv@annevk-t60> <AANLkTik5AB=UPJ47z8tEnVygJodPVAmppeXUymMBz+9n@mail.gmail.com> <20100727065018.GA16134@1wt.eu> <Pine.LNX.4.64.1007270709300.3056@ps20323.dreamhostps.com>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Disposition: inline
In-Reply-To: <Pine.LNX.4.64.1007270709300.3056@ps20323.dreamhostps.com>
User-Agent: Mutt/1.5.13 (2006-08-11)
Cc: hybi@ietf.org
Subject: Re: [hybi] Adding clarification regarding future revisions (Was: Proposed way forward for WebSockets)
X-BeenThere: hybi@ietf.org
X-Mailman-Version: 2.1.9
Precedence: list
List-Id: Server-Initiated HTTP <hybi.ietf.org>
List-Unsubscribe: <https://www.ietf.org/mailman/listinfo/hybi>, <mailto:hybi-request@ietf.org?subject=unsubscribe>
List-Archive: <http://www.ietf.org/mail-archive/web/hybi>
List-Post: <mailto:hybi@ietf.org>
List-Help: <mailto:hybi-request@ietf.org?subject=help>
List-Subscribe: <https://www.ietf.org/mailman/listinfo/hybi>, <mailto:hybi-request@ietf.org?subject=subscribe>
X-List-Received-Date: Tue, 27 Jul 2010 16:29:02 -0000

Ian Hickson wrote:
> > And BTW, saying "Upgrade: WebSocket/1.0" would be *a lot* better than 
> > "Upgrade: WebSocket".
> 
> Not having a version field is intentional. Versioning is an anti-pattern 
> on the Web.

That statement is too opaque: it needs a reference or something.

I don't know what Ian means, but it might be this: In the Javascript
browser world, everyone is told to *avoid* browser version checks and
to check for *feature presence* instead.

But here's the thing: *Using* version numbers is the anti-pattern,
not *providing* them.

Browser version checks are a major anti-pattern, especially the awful
ones which do pattern matching on User-Agent, because they prevent new
browsers from changing anything that existing scripts check for.

Feature checks work quite well in browser JavaScript: Often the
presence of an object or attribute is enough.  It's not great though:
Implementations of XmlHttpRequest still vary enormously, for example.
So almost everyone sticks to a de facto common subset that work in the
big browsers, or they combine it with dodgy "existence of feature A
implies feature B works like blah because the big browsers have that
combination of behaviours".  Thus feature checks have problems too.

Then there's HTTP: version numbers in HTTP aren't reliable.  Quite a
few HTTP things advertise HTTP/1.1 but are not 1.1 complient.  Thus
you cannot trust the HTTP version, and if you care and if you can,
look for other hints that say what not to trust.

So neither versions nor detectable feature are reliable or trustable
in a large ecosystem where something deployed and buggy may need to be
supported anyway.

In general if a buggy implementation becomes widespread, you can't
trust what it says whether it's a version or feature string, and you
need whatever clues you can get to detect the buggy thing.

Version numbers, feature lists and user-agent style strings are all
useful clues when you have to cope with buggy things out there.

If there are no clues, that's an anti-pattern.

Concluding:

  - *Using* version numbers and user-agent strings instead of
    explicit feature checks is an anti-pattern because it blocks
    updates to those numbers and strings and forces them to lie.

  - But *not providing them* is an anti-pattern because it
    prevents workarounds and thus blocks deployment of new features.

Neither extreme is effective.

-- Jamie