- From: Yves <ylafon@raubacapeu.net>
- Date: Tue, 21 Oct 2008 03:46:58 -0400 (EDT)
- To: Julian Reschke <julian.reschke@gmx.de>
- cc: Helge Hess <helge.hess@opengroupware.org>, HTTP Working Group <ietf-http-wg@w3.org>
On Mon, 20 Oct 2008, Julian Reschke wrote:
>> On 20.10.2008, at 20:39, Julian Reschke wrote:
>>>> I think this is better, according to what you quoted above:
>>>> S: HTTP/1.1 301 Moved Permanently
>>>> S: Location: /folder/bar
>>>> S:
>>>> S: Do it there
>>>> C: PUT /folder/bar
>>>> C: ...
>>> Of course that's not going to work in practice, as Cyrus pointed out.
>>
>> Thats exaggerated. Lets see where the requirement comes from. Its
>
> OK, it's not *always* going to work.
>
>> originated in servers which use an RDBMS as the storage. Such servers do
>> not want to maintain an additional namespace for DAV but just want to use
>> the records primary key as the relative resource name.
>>
>> Example: PUT /new.txt => Location: 1.txt, PUT /new.txt => Location: 2.txt,
>> etc.
>
> Yes. Doesn't need to be an RDBMS, but the use case is similar.
When you know that /new.txt will generate new URIs, the correct method to
trigger is is POST and clearly not PUT.
What's wrong with
POST /give_me_a_new_URI
=> 303 See Other
Location: /new1.txt
=> PUT /new1.txt
...
>> Most applications use SQL sequences to create the primary keys, since you
>> usually need the key anyways to fill up foreign keys in related records. In
>> such a scenario the 301 works OK. The server can preallocate a key from the
>> sequence and then tell the client to use that.
>
> That may work sometimes, but not always. For instance, when the API of the
> underlying store simply doesn't allow you that "preallocate" step.
>
>> Its a bit more difficult with 'SERIAL' keys, primary keys which are
>> allocated by the RDBMS only during the INSERT of the actual record. In this
>> case you indeed need to insert before you get the primary key.
>> BUT lets get real:
>> a) its not hard to change the SERIAL code to use a real sequence,
>> server compat is hardly affected by such a switch
>> b) most RDBMS implement SERIAL with a sequence anyways
Well, everytime underlying implementation surface at the URI level, you
run into that kind of issue, nothing new there.
>> Summary: IMHO the 301+location solution is not great, but OK. Primary
>> disadvantage is the additional roundtrip, but thats acceptable, especially
>> in combination with 100-continue.
>
> 301 is IMHO terrible wrong as it indicates a permanent redirect.
Yep 307 is far better. (I bet that the HTTP stacks are all supporting it
by now, no ?)
>> Lets modify RFC2616 to explicitly state that the PUT with 201+Location is
>> allowed. Maybe in a separate RFC, I don't know. Its the obvious thing to
>> do. It works well with existing clients, its already done that way by
>> serveral servers and it fits into the overall design.
>
> It would break existing clients, so I don't see how it could be done in
> HTTP/1.1.
>
> The semantics for PUT are clear from RFC2616: the client picks the URI.
>
> If you don't want that semantics, do not use PUT. One solutions is to use
> POST (as done in AtomPub), another one would be to define a new method (as
> proposed earlier). But changing the semantics of PUT IMHO is the wrong
> choice.
+1 (meaning that I should read the entire email before replying :) )
--
Baroula que barouleras, au tiéu toujou t'entourneras.
~~Yves
Received on Tuesday, 21 October 2008 07:47:08 UTC