Hi Toby,

On Jul 31, 2008, at 21:01 , Tobias Bocanegra wrote:
Hi,
we are not violating the idempotency of the PUT (disguised as a POST)

1. POST /foo.bar.html (foo=bar)
2. GET /foo.bar.html
3. POST /foo.bar.html (foo=bar)
4. GET /foo.bar.html

If request 1 and 3 are identical, responses 2 and 4 will be identical as
well.
does not compute :-)
What I meant is: you can post the same request parameters (representation) as often as you like, the resource will have the same state afterwards. The POST has no side-effects and it does not work additive. So it is idempotent
and can work as a replacement for a PUT.
yes, but only if the addressing does not change in respect if the
resource is present or not.

David's original point was that cutting off extensions might be necessary to preserve the idempotency of the POST request. I have shown that it is not necessary.

as far as i understood REST, the url always addresses a representation
of a resource.
so when you GET a /foo.html you get for example the HTML
representation of the resource /foo. if you post to /foo.html, you
want to update the HTML representation of the resource /foo.
The URL locates the resource. What gets transferred is the representation.
We are using extensions and selectors only due to limitations of our
browsers that do not allow us to set the Accept header for GET requests (which would be the proper way of indicating what representation you can deal with). I think extensions and selectors are a neat workaround, but we should not overuse them were we do not rely on them (e.g. everywhere where
we can send request headers or a request entity)

no, the URL (and only the url) locates the representation of the
resource, which is in most cases the same, of course.

URL (Uniform Resource Locator) locate resources in a uniform way. Resources and representations are not the same or identical, as they describe different concepts. Even if there is only one representation of the resource (which is almost never the case with Sling where we have a txt and a json representation for every resource).

no matter what
headers are set, if i request a .html, i want a HTML document (or i
should always get the same, irrespective of the headers).

Not necessarily. The HTTP spec mentions headers explicitly for content negotiation (http://www.w3.org/Protocols/rfc2616/rfc2616-sec12.html) and there might be enough cases where a resource (!) happens to have a name ending with .html without implying that it is actually HTML. The server selects the representation that is being sent and the server determines how to value headers or not.

it's very logical, that a foo.html and foo.pdf are different
representations of the resource foo.

Only if you forbid having foo.pdf and foo.html as two different resources in the same path. In that case you would have foo.pdf.html and foo.html.pdf and foo.html.html and foo.pdf.pdf.

so actually, if i want to change
representation independent properties, i need to post to /foo, if i
want to change PDF representation properties, e.g.. a watermark, i
post to foo.pdf.

If your representation has distinct properties that can be changed individually, you do not have a representation, you have another resource. If you want to upload a new thumbnail, you should PUT it to the appropriate resource and indicate the content type accordingly.

however, this does not help us here.

i suggest to leave the resolution the way it is,

I have read this before, but I still do not understand why. You mention not a single real use case that would be broken through my proposal.

and you need to find
a workaround for your upload-a-css-file problem

Thank you very much for your proposal. I did look for workarounds and found them cumbersome and inconsistent with the intended RESTful nature of Sling. Which was the reason why I proposed to fix it.

(which should be done
via webdav anyways :-)

Unfortunately I have no WebDAV in my browser and it is quite hard to convince the browser to PUT the contents of a textarea to an URL. Furthermore, the Sling way of expressing a PUT to a non-existing resource with a POST does not work, precisely because the POST servlet does something the WebDAV servlet will never do: it ignores the resource location the client specifies and tries to apply its own rules of finding out what's best for me. If this is the case, we should perhaps change the behavior of the WebDAV servlet accordingly to make it a bit less surprising.

regards,

Lars



regards, toby




and i think here is the problem, since .css (or .pdf, ...) is treated

the same way. in your example, if you want to 'upload' the /foo.css,

then in this case, the resource and the representation URL are the
same: /foo.css. but i don't know how to discover that in a smart way.
maybe because there is a file parameter pointing to "." ?



I think we do not need to be smart here. All we need to do is trust the client (or the developer) that she is able to correctly locate the resource.
Do not use magic that could stab you in the back.

regards,


Lars




regards, toby

On Wed, Jul 30, 2008 at 1:59 PM, David Nuescheler <[EMAIL PROTECTED]>
wrote:

hi guys,

i think it is dangerous if we have a different behavior on a POST
(that
originally should have been a PUT anyway, but due to browser
limitations...)
based on the existence of a node. I think that would violate the
idempotent
behavior that we had on the "PUT oriented" operations in the
slingpostservlet.

regards,
david

On Wed, Jul 30, 2008 at 1:46 PM, Tobias Bocanegra
<[EMAIL PROTECTED]> wrote:
On 7/30/08, Felix Meschberger <[EMAIL PROTECTED]> wrote:
Hi,

all taking this to the list for discussion because Lars it making
some
important points.

Lars Trieloff (JIRA) schrieb:

If you could decide for a way of fixing the NPE, I would be glad

to have a working workaround. (and close this bug) However I
still
think it is quite easy to find out which case the servlet is
dealing
with. As the user is free to specify the action of the form, he
can
post to /some/sample if he wants no dot and /some/sample.html if
he
wants a dot.


Speaking more broadly we are increasingly introducing "tricks",

special cases and magic post parameters to deal with a very
specific
use case "most of the times in a CMS or such" while ignoring the
needs
of other use cases like DAM, Blog, Wiki, social networking,
forum,
online shop, podcast, file sharing and other content-centric web applications. Having a RESTful web application framework implies
in
my opinion to respect concepts like Resource, Representation,
URI
and to avoid RPC-like interaction if not necessary.

I agree and thinking about it the SlingPostServlet is more about
modifying
(create, update, delete) content and less about content
representation.
As
such the URL fired at the SlingPostServlet should probably be more
treated
as the actual path than it is today.

The actual code, which does this is buried in the
ModifyOperation.getItemPath method, which tries to locate the item
to
work
on from the resource. For an existing resource, there is nothing
much to
be
done, as we have the item through the resource.

For a non-existing resource, the resource path, contains the full
path
from
the URL (actually it is ServletRequest.getPathInfo()) including
anything
which might be interpreted as selectors and extensions and even
suffix.
The
idea of this was, that the SlingPostServlet might redirect to this
URL
after
the update.

Now, in the meantime we have applied various changes to the
SlingPostServlet, which influence the creation of the name of a
node to
create:

 * :name and :nameHint to handle how names are generated
   in the case of Slash-Star request (trailing / or /*)
 * :redirect to indicate whether to redirect to the modified
   or created node after the request.

Taking all this into account, I come to agree with Lars, that the SlingPostSerlvet should treat the resource path of a non- existing
resource
(to be created) as is without modification.
i don't think that this is a good idea. otherwise you would need to know on the client if a resource already exists or not. ii find it
very dangerous if the resolution is not symmetric.

IMO, with the extension, you choose the type of response you want.
eg,
with .json you get a json response, with .html you get a html
response. etc...

We still have to deal with the / and /* suffixes, but we do not
cut off
any
extensions any more from the path.

In the case of a redirect, the :redirect parameter could just be
set
with
*.selectors.ext to redirect to the newly create resource with
selectors
and
extensions, where the SlingPostServlet replaces "*" with the actual
location
URL of it.

regards, toby




--
Visit: http://dev.day.com/ - Day JCR Cup 08 - Win a MacBook Pro





Reply via email to