Simon,
Like you, I've been struggling between the default content negotiation, and
the fact that I want a) flexibility; b) reasonable "default" handling in the
browsers. Note that most of my routes can return many media types.
While I am considering revisiting the Metadata classes (per Jerome), I
currently have what you might call content negotiation logic in
Resource#generateRepresentation overrides.
One of the things I do here is just handle IE as an exceptional case.
Literally:
if (agent.equals("MSIE") &&
mtype.equals(MediaType.APPLICATION_XHTML_XML)) {
mtype = MediaType.TEXT_HTML;
}
So, the default (when reasonable) is to return XHTML. FF/Opera/etc. get the
XHTML content type; IE gets HTML.
Cliff Binstock
Coyote Reporting
> -----Original Message-----
> From: Simon Reinhardt [mailto:[email protected]]
> Sent: Friday, January 30, 2009 12:25 PM
> To: [email protected]
> Subject: Custom conneg for (X)HTML media types
>
> Hi,
>
> When working with XHTML you have to be careful how to deliver it. The
> appropriate content type is application/xhtml+xml in which case the
> supporting browser will treat it as XML (for parsing, in the DOM and in
> CSS for example). However non-supporting browsers like IE will choke on
> that and offer you the page for download. Therefore you can alternatively
> serve it as text/html - with the disadvantage that it will be parsed and
> treated as HTML.
> Now, of course you can look into the Accept header to find out if the
> browser will support XHTML or not and serve it under an appropriate
> content type accordingly. The problem with that are the Accept headers
> that browsers actually send. Opera and FF ask for both media types, with
> the same preference, text/html coming first. IE doesn't ask for any HTML
> media type at all but just tells you that it accepts some other stuff and
> then anything with a preference of 1. So, the default conneg algorithm
> doesn't work here: If I register two variants, the HTML one coming first,
> then all browsers will get the HTML version. If I register two variants,
> the XHTML one coming first, then all browsers will get the XHTML version,
> even IE which doesn't support it.
> This situation was being recognised by the W3C and they came up with a
> custom conneg algorithm [1]. The idea is to only serve XHTML when it is
> explicitly listed in the Accept header - and when it is, give it
> precedence over HTML. They say there that you should do that for XHTML
> documents that follow the compatibility guidelines and therefore can be
> rendered by non-supporting browsers properly, so they don't really do
> conneg but just serve one variant with different media types. But of
> course nothing stops you from really writing two variants, one in HTML
> 4.01 and one in XHTML+SVG+MathML for example (the latter wouldn't be valid
> to serve as text/html at all).
>
> So the question here is, can you think of an easy way to implement this
> custom conneg (or rather just Accept-header inspection) algorithm in
> Restlet?
>
> Thanks,
> Simon
>
> [1] http://www.w3.org/TR/2009/NOTE-xhtml-media-types-20090116/#media-types
>
> ------------------------------------------------------
> http://restlet.tigris.org/ds/viewMessage.do?dsForumId=4447&dsMessageId=107
> 6412
------------------------------------------------------
http://restlet.tigris.org/ds/viewMessage.do?dsForumId=4447&dsMessageId=1077338