relative links between resources provided by design docs
--------------------------------------------------------
Key: COUCHDB-280
URL: https://issues.apache.org/jira/browse/COUCHDB-280
Project: CouchDB
Issue Type: Improvement
Reporter: Chris Anderson
Assignee: Chris Anderson
Fix For: 0.9
In an earlier thread we discussed the costs and benefits of changing CouchDB so
that all the resources provided by a design doc are rooted in the design doc.
Under the current system, there is no way to link among HTML files attached to
a design docs, the HTML output of show and list functions, and view queries.
The only way to link between these resources is by hard-coding the design doc
name in your link. By giving the resources provided by design docs a common
root, one can link between them using hrefs like "../../_show/sname/docid".
The current system never posed a problem before, because design docs only
provided one type of resource. However, going forward I can see that design
docs could continue to provide new, unanticipated resources. Jason Davies has
proposed an _update resource, which would be a JavaScript (or other language)
function that can accept request with non-JSON bodies (for instance POSTed XML
from a webhook service) and convert them to JSON for storage.
The advantages to decomposing the traditional "accept a request, do whatever
you want, send a reply" app-server model into discrete functions are numerous,
the main one being that developers can support custom non-JSON content-types,
while still interacting with the database in a manner where side-effects and
memory / runtime characteristics are controlled.
Show and list break non-JSON rendering down into the right sized granules for
safe, cacheable idempotent requests. But because we we can't link between them
(and design doc attachments) using normal html links (the links must be
computed on the server) they aren't enough to provide a hypermedia interface
for CouchDB. Hypermedia is above what CouchDB has been shooting for, but we are
so close now that it seems silly not to go the "rest" of the way.
If it were just the tradeoffs between relative links (good) and slightly uglier
urls (bad) I'd be roughly +0 on this change. But a consequence of giving design
doc resources a common root is that the applications the define can then be
proxied with a URL rewriter. The means that (if written correctly) an
application with paths like:
/db/_design/foo/_view/bar?limit=10
/db/_design/foo/_show/docid
/db/_design/foo/index.html
can be proxied so that the "/db/_design/foo" part of the URL is added by the
proxy, so that all clients see is:
/_view/bar?limit=10
/_show/docid
/index.html
This also nicely limits end-client access, so that they may only interact with
the database using resources provided by the design doc. I consider this an
edge-case for deployment but the fact that we can cleanly support makes me
think we're on the right track with the change to a common root for design doc
resources.
For more details about these URL path interactions, see the earlier thread:
http://mail-archives.apache.org/mod_mbox/couchdb-dev/200902.mbox/%[email protected]%3e
I've implemented a patch (attached to this ticket) that makes it so that views,
shows, lists, and design doc attachments are all rooted under the design doc.
It works by adding a section to the ini file, like this (which we could use to
easily add new resource, like the _update mentioned above):
[httpd_design_handlers]
_view = {couch_httpd_view, handle_view_req}
_show = {couch_httpd_show, handle_doc_show_req}
_list = {couch_httpd_show, handle_view_list_req}
the _design handler itself is just an http_db_handler.
Points of discussion:
If we want to change the names of any of: _view, _show, _list, or _design now
is a good time to do it. We've been over the names _list and _show many times,
and while they aren't perfect, they are short, and more-or-less descriptive of
what they do.
The code is robust about changes to the _design db handler's name. That is, we
could continue to call them design docs, and store them with ids like
"_design/name", while changing the resource root so that the above set of URLs
could be something like (modulo an attachments handler, "_files" here, for
clarity):
/db/_baz/foo/_view/bar?limit=10
/db/_baz/foo/_show/docid
/db/_baz/foo/_files/index.html
Before we commit / before 0.9.0:
This patch is a big enough change that I think we should vote on it before I
commit it. However, I'd like to get it in before 0.9.0 to avoid future
confusion where trunk is incompatible with API clients and applications
designed to run on our latest release.
Sincerely,
Chris
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.