HTTP 2.0 (was Re: Last Call: draft-nottingham-http-link-header (Web Linking) to Proposed Standard)

Sam Johnston <> Fri, 25 September 2009 11:31 UTC

Return-Path: <>
Received: from localhost (localhost []) by (Postfix) with ESMTP id BA46F3A6A21 for <>; Fri, 25 Sep 2009 04:31:19 -0700 (PDT)
X-Virus-Scanned: amavisd-new at
X-Spam-Flag: NO
X-Spam-Score: -4.02
X-Spam-Status: No, score=-4.02 tagged_above=-999 required=5 tests=[AWL=-3.929, BAYES_00=-2.599, FM_FORGED_GMAIL=0.622, HTML_FONT_FACE_BAD=0.884, HTML_MESSAGE=0.001, J_BACKHAIR_57=1, NORMAL_HTTP_TO_IP=0.001]
Received: from ([]) by localhost ( []) (amavisd-new, port 10024) with ESMTP id 3I6YcBf36Pbi for <>; Fri, 25 Sep 2009 04:31:17 -0700 (PDT)
Received: from ( []) by (Postfix) with SMTP id BF94B3A67D9 for <>; Fri, 25 Sep 2009 04:31:16 -0700 (PDT)
Received: from source ([]) by ([]) with SMTP ID; Fri, 25 Sep 2009 11:32:28 UTC
Received: by bwz17 with SMTP id 17so1933653bwz.21 for <>; Fri, 25 Sep 2009 04:32:26 -0700 (PDT)
MIME-Version: 1.0
Received: by with SMTP id g27mr3296hba.62.1253878345777; Fri, 25 Sep 2009 04:32:25 -0700 (PDT)
Date: Fri, 25 Sep 2009 12:32:25 +0100
Message-ID: <>
Subject: HTTP 2.0 (was Re: Last Call: draft-nottingham-http-link-header (Web Linking) to Proposed Standard)
From: Sam Johnston <>
To: Julian Reschke <>
Content-Type: multipart/alternative; boundary="001485f2774e64430a0474654d2f"
Cc: Ian Hickson <>, HTTP Working Group <>, IETF Apps Discuss <>
X-Mailman-Version: 2.1.9
Precedence: list
List-Id: General discussion of application-layer protocols <>
List-Unsubscribe: <>, <>
List-Archive: <>
List-Post: <>
List-Help: <>
List-Subscribe: <>, <>
X-List-Received-Date: Fri, 25 Sep 2009 11:31:19 -0000

On Thu, Sep 24, 2009 at 10:52 AM, Julian Reschke <>wrote:

> These are orthogonal issues. You *could* define that there must be only one
> title. Also, HTTP can not easily be upgraded to change the header encoding;
> this has been discussed a lot over here in the last years, and my
> understanding is that we would need to change the major version number.

I'm increasingly often running into problems that could be relatively easily
fixed by upgrading the HTTP spec - after all we've been talking about HTTP
2.0 for 15 years<>already

The link header could already make a huge difference to the way the web
works (I've already started on this with
but we're lacking the LINK and UNLINK verbs that HTTP originally defined for
managing them. Similarly, people often run into problems using PUT/POST for
requests that should have been handled by PATCH (which was also [poorly]
specified and then abandoned). Encodings are yet another issue I'm
increasingly coming up against for non-ASCII characters. "HTTP as a
meta-model" would also benefit from categories (which I have already
transplanted from Atom in
Oh and let's not forget about pulling in the MOVE and COPY verbs from WebDAV
so we can instruct servers to migrate resources (e.g. push a VM from one
cloud to another).

I'd also like to have the ability to set persistent server-side "Cookies"
(or "Attributes" for a more appropriate term) using a similar process to
Set-Cookie, so much so that I'm considering writing an I-D specifying this.
The use case I have in mind is RESTful web services, specifically exposing
"attributes" of a virtual machine such as the number of cores, core speed,
memory size, etc. You can see an example below, where the OCCI-* headers
would be replaced by something like "Attribute: compute-cores=2" (which you
could update with an empty POST specifying Set-Attribute header(s) and
remove by including 'discard' ala Set-Cookie).

Another significant pain point for me (and apparently others) is
collections. URLs should be able to return multiple resources headers and
all, without having to resort to add-ons like multipart MIME. That way I
could ask for, say, all of the contacts in my mail account and have them
rendered as vCard but with metadata like author and security information,
web linking to other contacts (eg FOAF), web categories, etc. Presumably
this would be relatively easy to do by tweaking the spec (e.g. using CRLF
separators between resources) but today I'm having to use hacks like
text/uri-list which have O(n+1) rather than O(1) performance, or resorting
to formats like Atom for this special case.

There are of course plenty of other use cases, but the idea is to avoid
"wrapper" formats like Atom (which can add significant overhead in the form
of base64 encoding and/or O(n+1) requests, while neutering many HTTP
features such as range GETs and caching). The only other alternative for
metadata with opaque/non-hypertext resources is to create a distinct
content-type and/or resource which is clearly a hack when there is a
perfectly good existing out-of-band communication channel.

All in all I think that if we don't start to look at upgrading HTTP to
better cater for machine interfaces, advanced (semantic) clients and the
like then we're going to be bolting things like SOAP, Atom, RDF, etc. onto
it forever. It's looking increasingly like the OCCI Core
on at OGF <> is basically a semantic version of HTTP
and some of these ideas could well be a starting point for HTTP 2.0 (in
which case I've been working in the wrong forum for this component of


Retrieving a virtual machine using OCCI:

GET /myapp.ovf;web01 HTTP/1.1


> HTTP 200 OK

Content-type: application/ovf

Content-length: 12345


OCCI-Compute-Cores: 2

OCCI-Compute-Speed: 3000

OCCI-Memory-Size: 2048

Link: </myvm.pdf>; rel="related"; type="application/pdf"; title="Build
> Documentation"

Link: </myvm.xen>; rel="alternative"; type="application/xen"; title="Xen
> Image"

Link: </myvm.ovf;action=stop>; rel="";
> title="Stop"

Link: </myvm.ovf;action=restart>; rel="";
> title="Restart"

Link: </myvm.png>; rel="";
> title="Console Screenshot"

Link: <rdp://>; rel="
>"; title="Remote Desktop
> Connection"

Link: <ssh://>; rel="
>"; title="Secure SHell (SSH)"

Link: </networks/dmz>; rel="";
> title="DMZ Interface"; address:; local="eth0";
> policy="allow tcp/80"

Link: </san/myvm>; rel="";
> title="Root Device"; local="sda"

Category: windows; scheme="";
> label="Windows"

Category: q123456; scheme="";
> label="Q123456 - Evil Bug"

Category: us-east; scheme=""; label="US
> East"

Category: staging; scheme="";
> label="Staging"

> <?xml version="1.0" encoding="UTF-8" ?>

<!-- Open Virtualisation Format (OVF) -->