Re: [ogpx] content negotiation for LLSD over HTTP connections

Carlo Wood <carlo@alinoe.com> Sat, 27 June 2009 11:50 UTC

Return-Path: <carlo@alinoe.com>
X-Original-To: ogpx@core3.amsl.com
Delivered-To: ogpx@core3.amsl.com
Received: from localhost (localhost [127.0.0.1]) by core3.amsl.com (Postfix) with ESMTP id 7497F3A68C0 for <ogpx@core3.amsl.com>; Sat, 27 Jun 2009 04:50:54 -0700 (PDT)
X-Virus-Scanned: amavisd-new at amsl.com
X-Spam-Flag: NO
X-Spam-Score: -1.13
X-Spam-Level:
X-Spam-Status: No, score=-1.13 tagged_above=-999 required=5 tests=[AWL=-0.300, BAYES_00=-2.599, HELO_EQ_AT=0.424, HOST_EQ_AT=0.745, J_CHICKENPOX_46=0.6]
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 4vyuhYmaA-1F for <ogpx@core3.amsl.com>; Sat, 27 Jun 2009 04:50:53 -0700 (PDT)
Received: from viefep13-int.chello.at (viefep13-int.chello.at [62.179.121.33]) by core3.amsl.com (Postfix) with ESMTP id 10F363A688D for <ogpx@ietf.org>; Sat, 27 Jun 2009 04:50:52 -0700 (PDT)
Received: from edge05.upc.biz ([192.168.13.212]) by viefep13-int.chello.at (InterMail vM.7.09.01.00 201-2219-108-20080618) with ESMTP id <20090627115109.XANZ23539.viefep13-int.chello.at@edge05.upc.biz>; Sat, 27 Jun 2009 13:51:09 +0200
Received: from mail9.alinoe.com ([77.250.43.12]) by edge05.upc.biz with edge id 8zr61c00P0FlQed05zr7Nw; Sat, 27 Jun 2009 13:51:09 +0200
X-SourceIP: 77.250.43.12
Received: from carlo by mail9.alinoe.com with local (Exim 4.69) (envelope-from <carlo@alinoe.com>) id 1MKWR5-00007j-2M; Sat, 27 Jun 2009 13:51:11 +0200
Date: Sat, 27 Jun 2009 13:51:11 +0200
From: Carlo Wood <carlo@alinoe.com>
To: Infinity Linden <infinity@lindenlab.com>
Message-ID: <20090627115111.GA30752@alinoe.com>
References: <3a880e2c0906261648k1a14024cudd4cbccb57d8753f@mail.gmail.com> <20090627104731.GB28675@alinoe.com> <20090627110112.GC28675@alinoe.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
In-Reply-To: <20090627110112.GC28675@alinoe.com>
User-Agent: Mutt/1.5.18 (2008-05-17)
Cc: ogpx@ietf.org
Subject: Re: [ogpx] content negotiation for LLSD over HTTP connections
X-BeenThere: ogpx@ietf.org
X-Mailman-Version: 2.1.9
Precedence: list
List-Id: Virtual Worlds and the Open Grid Protocol <ogpx.ietf.org>
List-Unsubscribe: <https://www.ietf.org/mailman/listinfo/ogpx>, <mailto:ogpx-request@ietf.org?subject=unsubscribe>
List-Archive: <http://www.ietf.org/mail-archive/web/ogpx>
List-Post: <mailto:ogpx@ietf.org>
List-Help: <mailto:ogpx-request@ietf.org?subject=help>
List-Subscribe: <https://www.ietf.org/mailman/listinfo/ogpx>, <mailto:ogpx-request@ietf.org?subject=subscribe>
X-List-Received-Date: Sat, 27 Jun 2009 11:50:54 -0000

Ok, I made a 'translation' of that IRC page for the purpose of ogpx:

For documentation purposes there would exist a (central) webpage,
for example http://protocols.ogpx.net, that lists all (accepted)
ogpx server implementations (basically meaning more or less
independent groups working on their own ogpx server versions).

For example, this page could list the labels:
SecondLife, OpenSim, BlueMoon, which link to websites
controlled by the aforementioned group. Lets call these
"implementation labels" for now.

Upon connection to a server, the server should send a message
to the client as early as possible (even before authentication,
or order to allow also the authentication method to be altered
in the future) indicating which protocol base it is using.
This would exist of a (list) of triplets exists of a label (string)
a version (integer) and a 'compatibility version' (integer).

For human readable and documentation reasons, the label should
always start with an "implementation label". It's highly suggested
to just add an integer behind that to complete the label and
make it unique. Lets call these labels "version labels".
For example, the version labels could read "SecondLife23",
"OpenSim1", etc.

For documentation purposes, each of the aforementioned websites
owned by the different implementer groups should list each of
these version labels with a link to more information about them.

The version string together with the version defines the (supported)
protocol of the server: every feature, mandatory of optional.

Neither side has to worry about the mandatory parts, since the
versions will take care of that: a 'compatibility version' is
oldest version that supports all mandatory stuff.

The client then reacts with the version label and protocol version
it 'requests', as well as all the optional features it wants.
The server confirms which optional features will be used, after
which the protocol is switched to the negotiated protocol.
The client acknowledges this and also switches to the final
protocol.

As an example, lets assume that one implementation (opensim)
adds a feature that allows clients to better synchronize animations
with sound. They assign the label "anisndsync" to it, which only
really has to be unique within the namespace of OpenSim.
It is made a negotiable feature of 'OpenSim1 version 30'.

A viewer that has no notion of this feature will logically not
request it, and therefore it will not be used.

If some grid makes the feature mandatory, the negotation fails
with such a client and the user is told to upgrade to a viewer
that supports 'anisndsync'. I do not consider it very likely
that anyone would make it mandatory however, until -say- 90%
of all viewers already support it, and the 4 year-old viewers
that still don't become really annoying.

If the client supports it, it will request it (if it's an optional
feature, still) and the server will grant it. Obviously the
server will know about it (it sent 'OpenSim1 30'), or else
the viewer would not have requested it.

However, then this feauture turns out to not to work - and
the opensim developers decide to remove it again from version
31. Removing a negotiable feature doesn't break compatiblity,
so there is nothing to indicate to a viewer (that was written
during version 30) that version 31 doesn't support it anymore.
What would happen is this: The server says: Opensim1 31 10.
(where 10 is the compatibility version in this example).
The viewer, only knowing about version 30 and before (that is,
version 10 to 30) doesn't have a clue what changed in
version 31, but it knows that 10 < 30, the version it does
support - and hence it is allowed to react as if the server
is version 30. So, it requests "anisndsync" as before.
This time however, the server doesn't acknowledge it, and
the feature is not used.

What worried people in the past with this sheme is:
How do the clients keep track of all the features that are
mandatory and/or negotiable for every version?

Well, this is really very very simple. For each implementated
feature the coder had to sit down and read the documenation.
Along with that documentation come the label and version
number. So, all that is needed is a map from "label + version"
to which *implemented* features are mandatory or negotiable.
The maintenance load of that is neglectable. It will be like
adding two lines of code extra per feature:

  protocol.register("OpenSim1", 30, "anisndsync", &handle_anisndsync);

and common code that takes care of the whole negotiation
will do the rest.

Mapping "OpenSim1" to the mandatory and optional features
might involve more code lines, but this code can simply be
copy&pasted from the documentation website of "OpenSim1".
Also this will be something that is easy to maintain (adding
and removing lines per added/delete feature).

-- 
Carlo Wood <carlo@alinoe.com>