- From: Mark Nottingham <mnot@yahoo-inc.com>
- Date: Wed, 5 Apr 2006 18:04:53 -0700
- To: public-webapi@w3.org
Hello,
Great stuff! A few quick comments on the draft;
* responseText attribute - type the response as an HTTP entity
explicitly (you already do this for the request data); that way,
there's no ambiguity about what level the implementation operates at.
I.e., XHR won't give you direct access to the raw HTTP bytestream,
with transfer-codings like chunked visible.
* open() - "If the URI given to this method contains a user name and
a password (the latter being the empty string), then these MUST be
used if the user and password arguments are omitted." This is
confusing; some developers might think that the query arguments (for
example) would contain a user name and password. I *assume* you're
referring to the userinfo production in RFC3986; e.g.,
http://user:pass@host.name/path/?query
It may be better to use this terminology ("userinfo") explicitly,
along with an appropriate reference.
Also, AIUI, the security gods have determined that userinfo is a no-
no in URLs, and IE (for example) doesn't support it (at least in the
browser, not sure about XmlHttpRequest; must add that to the test
suite...). See:
http://lists.w3.org/Archives/Public/uri/2004Feb/0001.html
WRT supported methods, it should support PUT, DELETE, FOO and
anything else that's syntactically correct.
WRT URIs, what should happen when I pass it a URI with a fragment
identifier?
* send() - I'd say that if there is data passed in the send method
args, it MUST be passed; not just if it's POST or PUT.
Nit - WRT redirect loops, there's a caveat on it, so it's a SHOULD,
not a MUST.
When talking about redirects, it would be really nice to remind
implementers (probably non-normatively) that HTTP has requirements
about method preservation and getting approval for the user for the
various codes; see http://www.mnot.net/javascript/xmlhttprequest/
If implementations are allowed to encoding/decode content-codings
(i.e., automatically manipulate Accept-Encoding/Content-Encoding),
say so explicitly. Content-coding is a property of the content
(entity, representation, whatever) itself -- just like content-type
and content-language -- and automatically handling it breaks layering
(which is OK, as long as you do it explicitly). This means that if
decoding is handled automagically, the appropriate part of the
Content-Encoding header should probably be stripped, so the app
doesn't get confused.
* setRequestHeader() - HTTP allows header field-values to contain
linefeeds and cr's; they should be allowed here.
The specification of concatenation of headers is too simplistic; a
header can be split across multiple lines, or have multiple entries.
Some implementations will do this to avoid header length limitations
out there.
Also, some headers are specified to have only a single value (not a
list), and some implementations might take advantage of that
knowledge to overwrite them, rather than concatenate new values. The
current language effectively disallows that.
Say something to the effect that if the UA has a cache, it MUST
honour Cache-Control request headers sent with setRequestHeader().
This allows the application to control the cache.
It seems a *little* draconian to not allow the user to control If-
Modified-Since, If-None-Match and If-Range. Range should definitely
be available to users; somebody might know what they're doing. :)
The wording around Connection and Keep-Alive leads developers to
believe that they always have to set these headers; that's not the
case. "set" should probably be "use", and Content-Length should be in
there too. In fact, I'd require UAs to set Content-Length; while
theoretically you can chunk a request body, there are some practical
interop problems with doing so.
The Referer header MUST be set, and MUST NOT be overridable; once
cross-site XHR is available, sites will want to use it for security,
logging, etc.
What about automatically setting headers to do with delta encoding
(RFC3229)? TE (for transfer encoding negotiation)? Content-MD5 (for
request body integrity)? Meter (HTTP hit metering from caches)? The
UA-* request headers? MUST NOT is too strong a prohibition for
automatically-set headers; I'd suggest SHOULD NOT. (The response
shown in the "Manipulating response headers" example is actually
impossible for conforming implementations to see; you need to send TE
to get a Transfer-Encoding back).
* In open(), send() and setRequestHeader(), it says that the userinfo
MUST be used. This is too simplistic; a naive implementation will
send them optimistically as HTTP Basic authentication, which is the
wrong thing to do from a security perspective. If they're supplied,
the UA needs to wait for a 401 Unauthenticated response, so it can
learn that a) credentials are required and b) what scheme (and
details thereof) to use.
Also, if the browser is already sending credentials for a particular
protection space (to use RFC2617 terminology), XHR SHOULD send them
when accessing resources in the same space. It'll need to define
precedence between these and those explicitly used in a call (which
would override, I presume).
Cheers,
--
Mark Nottingham
mnot@yahoo-inc.com
Received on Thursday, 6 April 2006 01:05:23 UTC