Benoît, I did what you proposed and it behaves exactly as before
Ok i did some testing and this is what I figured out.
This is my testing setup: I created a new database (test) that doesn't use
any VHost rules.
Inside it I created a design document that only has rewrites field. I will
present test results exactly as per configuration I used.
I always sent the same document contained in file "example" - namely:
{
"type": "comment"
}
Below are the test results:
----------------------------------------------------------------------------------------------------
## Test 1:
# rewrites config:
[
{
"to": "../..",
"from": ":db"
}
]
# Executed command 1.1:
$ curl -d @example -H "Content-type:application/json" -e
http://localhost:5984/test http://localhost:5984/test/
{"ok":true,"id":"ce8b504d63666c9257cc07537c00aa70","rev":"1-505a221d0aef5d664f29d6afdae01293"}
# Comment: expected result - everything is fine.
# Executed command 1.2:
$ curl -X PUT -d @example -H "Content-type:application/json"
http://localhost:5984/test/_design/test/_rewrite/test/randomid324324
{"error":"not_found","reason":"missing"}
# Comment: result expected since there is no ID parameter passed through -
due to the rewrite rule
#LOG:
[Mon, 10 Jan 2011 21:42:17 GMT] [debug] [<0.8844.3>] 'PUT'
/test/_design/test/_rewrite/test/randomid324324 {1,1}
Headers: [{'Accept',"*/*"},
{'Content-Length',"23"},
{'Content-Type',"application/json"},
{'Host',"localhost:5984"},
{'User-Agent',"curl/7.21.0 (i686-pc-linux-gnu) libcurl/7.21.0
OpenSSL/0.9.8o zlib/1.2.3.4 libidn/1.18"}]
[Mon, 10 Jan 2011 21:42:17 GMT] [debug] [<0.8844.3>] OAuth Params: []
[Mon, 10 Jan 2011 21:42:17 GMT] [debug] [<0.8844.3>] Minor error in HTTP
request: not_found
[Mon, 10 Jan 2011 21:42:17 GMT] [debug] [<0.8844.3>] Stacktrace:
[{couch_httpd_rewrite,handle_rewrite_req,3},
{couch_httpd_db,do_db_req,2},
{couch_httpd,handle_request_int,5},
{mochiweb_http,headers,5},
{proc_lib,init_p_do_apply,3}]
[Mon, 10 Jan 2011 21:42:17 GMT] [info] [<0.8844.3>] 127.0.0.1 - - 'PUT'
/test/_design/test/_rewrite/test/randomid324324 404
[Mon, 10 Jan 2011 21:42:17 GMT] [debug] [<0.8844.3>] httpd 404 error
response:
{"error":"not_found","reason":"missing"}
# Executed command 1.3:
$curl -d @example -H "Content-type:application/json" -e
http://localhost:5984/test
http://localhost:5984/test/_design/test/_rewrite/test/
{"error":"bad_content_type","reason":"Content-Type must be
multipart/form-data"}
# Comment: Rewrite is wrong - also peculiar it won't take application/json
content type.
# LOG:
[Mon, 10 Jan 2011 21:51:55 GMT] [debug] [<0.9453.3>] 'POST'
/test/_design/test/_rewrite/test/ {1,1}
Headers: [{'Accept',"*/*"},
{'Content-Length',"23"},
{'Content-Type',"application/json"},
{'Host',"localhost:5984"},
{'Referer',"http://localhost:5984/test"},
{'User-Agent',"curl/7.21.0 (i686-pc-linux-gnu) libcurl/7.21.0
OpenSSL/0.9.8o zlib/1.2.3.4 libidn/1.18"}]
[Mon, 10 Jan 2011 21:51:55 GMT] [debug] [<0.9453.3>] OAuth Params: []
[Mon, 10 Jan 2011 21:51:55 GMT] [debug] [<0.9453.3>] rewrite to
"/test/_design/..?db=test"
[Mon, 10 Jan 2011 21:51:55 GMT] [debug] [<0.9453.3>] 'POST'
/test/_design/..?db=test {1,1}
Headers: [{'Accept',"*/*"},
{'Content-Length',"23"},
{'Content-Type',"application/json"},
{'Host',"localhost:5984"},
{'Referer',"http://localhost:5984/test"},
{'User-Agent',"curl/7.21.0 (i686-pc-linux-gnu) libcurl/7.21.0
OpenSSL/0.9.8o zlib/1.2.3.4 libidn/1.18"}]
[Mon, 10 Jan 2011 21:51:55 GMT] [debug] [<0.9453.3>] OAuth Params:
[{"db","test"}]
[Mon, 10 Jan 2011 21:51:55 GMT] [debug] [<0.9453.3>] Minor error in HTTP
request: {bad_ctype,
"Content-Type must be multipart/form-data"}
[Mon, 10 Jan 2011 21:51:55 GMT] [debug] [<0.9453.3>] Stacktrace:
[{couch_httpd,validate_ctype,2},
{couch_httpd_db,db_doc_req,3},
{couch_httpd_db,do_db_req,2},
{couch_httpd,handle_request_int,5},
{couch_httpd_db,do_db_req,2},
{couch_httpd,handle_request_int,5},
{mochiweb_http,headers,5},
{proc_lib,init_p_do_apply,3}]
[Mon, 10 Jan 2011 21:51:55 GMT] [info] [<0.9453.3>] 127.0.0.1 - - 'POST'
/test/_design/..?db=test 415
[Mon, 10 Jan 2011 21:51:55 GMT] [debug] [<0.9453.3>] httpd 415 error
response:
{"error":"bad_content_type","reason":"Content-Type must be
multipart/form-data"}
# Executed command 1.4:
$ curl -d @example -H "Content-type:application/json" -e
http://localhost:5984/test http://localhost:5984/test/randomid32420
{"error":"bad_content_type","reason":"Content-Type must be
multipart/form-data"}
# Comment: I did this one just because - and I noticed that when you post
with and ID - it wont accept JSON content type
# LOG:
[Mon, 10 Jan 2011 21:54:23 GMT] [debug] [<0.9490.3>] 'POST'
/test/randomid32420 {1,1}
Headers: [{'Accept',"*/*"},
{'Content-Length',"23"},
{'Content-Type',"application/json"},
{'Host',"localhost:5984"},
{'Referer',"http://localhost:5984/test"},
{'User-Agent',"curl/7.21.0 (i686-pc-linux-gnu) libcurl/7.21.0
OpenSSL/0.9.8o zlib/1.2.3.4 libidn/1.18"}]
[Mon, 10 Jan 2011 21:54:23 GMT] [debug] [<0.9490.3>] OAuth Params: []
[Mon, 10 Jan 2011 21:54:23 GMT] [debug] [<0.9490.3>] Minor error in HTTP
request: {bad_ctype,
"Content-Type must be multipart/form-data"}
[Mon, 10 Jan 2011 21:54:23 GMT] [debug] [<0.9490.3>] Stacktrace:
[{couch_httpd,validate_ctype,2},
{couch_httpd_db,db_doc_req,3},
{couch_httpd_db,do_db_req,2},
{couch_httpd,handle_request_int,5},
{mochiweb_http,headers,5},
{proc_lib,init_p_do_apply,3}]
[Mon, 10 Jan 2011 21:54:23 GMT] [info] [<0.9490.3>] 127.0.0.1 - - 'POST'
/test/randomid32420 415
[Mon, 10 Jan 2011 21:54:23 GMT] [debug] [<0.9490.3>] httpd 415 error
response:
{"error":"bad_content_type","reason":"Content-Type must be
multipart/form-data"}
----------------------------------------------------------------------------------------------------
## Test 2:
# Rewrites config:
[
{
"to": "../../*",
"from": ":db/*"
}
]
# Executed command 2.1:
$ curl -d @example -H "Content-type:application/json" -e
http://localhost:5984/test http://localhost:5984/test/
{"ok":true,"id":"ce8b504d63666c9257cc07537c00af99","rev":"1-505a221d0aef5d664f29d6afdae01293"}
# Comment: OK, everything is fine
#Executed command 2.2:
$ curl -X PUT -d @example -H "Content-type:application/json"
http://localhost:5984/test/_design/test/_rewrite/test/randomid3125
{"ok":true,"id":"randomid3125","rev":"1-505a221d0aef5d664f29d6afdae01293"}
# Comment: OK, everything is fine - since now rewrite rule appropriately
handles the ID.
#Executed command 2.3:
$ curl -d @example -H "Content-type:application/json" -e
http://localhost:5984/test
http://localhost:5984/test/_design/test/_rewrite/test/
{"error":"bad_content_type","reason":"Content-Type must be
multipart/form-data"}
# Comment: Routing and content type are wrong (routing in PUT request -
command 2.2 was done right!)
# LOG:
[Mon, 10 Jan 2011 22:06:17 GMT] [debug] [<0.10262.3>] 'POST'
/test/_design/test/_rewrite/test/ {1,1}
Headers: [{'Accept',"*/*"},
{'Content-Length',"23"},
{'Content-Type',"application/json"},
{'Host',"localhost:5984"},
{'Referer',"http://localhost:5984/test"},
{'User-Agent',"curl/7.21.0 (i686-pc-linux-gnu) libcurl/7.21.0
OpenSSL/0.9.8o zlib/1.2.3.4 libidn/1.18"}]
[Mon, 10 Jan 2011 22:06:17 GMT] [debug] [<0.10262.3>] OAuth Params: []
[Mon, 10 Jan 2011 22:06:17 GMT] [debug] [<0.10262.3>] rewrite to
"/test/_design/..?db=test"
[Mon, 10 Jan 2011 22:06:17 GMT] [debug] [<0.10262.3>] 'POST'
/test/_design/..?db=test {1,1}
Headers: [{'Accept',"*/*"},
{'Content-Length',"23"},
{'Content-Type',"application/json"},
{'Host',"localhost:5984"},
{'Referer',"http://localhost:5984/test"},
{'User-Agent',"curl/7.21.0 (i686-pc-linux-gnu) libcurl/7.21.0
OpenSSL/0.9.8o zlib/1.2.3.4 libidn/1.18"}]
[Mon, 10 Jan 2011 22:06:17 GMT] [debug] [<0.10262.3>] OAuth Params:
[{"db","test"}]
[Mon, 10 Jan 2011 22:06:17 GMT] [debug] [<0.10262.3>] Minor error in HTTP
request: {bad_ctype,
"Content-Type must be multipart/form-data"}
[Mon, 10 Jan 2011 22:06:17 GMT] [debug] [<0.10262.3>] Stacktrace:
[{couch_httpd,validate_ctype,2},
{couch_httpd_db,db_doc_req,3},
{couch_httpd_db,do_db_req,2},
{couch_httpd,handle_request_int,5},
{couch_httpd_db,do_db_req,2},
{couch_httpd,handle_request_int,5},
{mochiweb_http,headers,5},
{proc_lib,init_p_do_apply,3}]
[Mon, 10 Jan 2011 22:06:17 GMT] [info] [<0.10262.3>] 127.0.0.1 - - 'POST'
/test/_design/..?db=test 415
[Mon, 10 Jan 2011 22:06:17 GMT] [debug] [<0.10262.3>] httpd 415 error
response:
{"error":"bad_content_type","reason":"Content-Type must be
multipart/form-data"}
#Executed command 2.4:
$ curl -d @example -H "Content-type:application/json" -e
http://localhost:5984/test http://localhost:5984/test/randomid32843
{"error":"bad_content_type","reason":"Content-Type must be
multipart/form-data"}
#Comment: No routing information in log, got Cotent type error.
#LOG:
[Mon, 10 Jan 2011 22:11:53 GMT] [debug] [<0.10377.3>] 'POST'
/test/randomid32843 {1,1}
Headers: [{'Accept',"*/*"},
{'Content-Length',"23"},
{'Content-Type',"application/json"},
{'Host',"localhost:5984"},
{'Referer',"http://localhost:5984/test"},
{'User-Agent',"curl/7.21.0 (i686-pc-linux-gnu) libcurl/7.21.0
OpenSSL/0.9.8o zlib/1.2.3.4 libidn/1.18"}]
[Mon, 10 Jan 2011 22:11:53 GMT] [debug] [<0.10377.3>] OAuth Params: []
[Mon, 10 Jan 2011 22:11:53 GMT] [debug] [<0.10377.3>] Minor error in HTTP
request: {bad_ctype,
"Content-Type must be multipart/form-data"}
[Mon, 10 Jan 2011 22:11:53 GMT] [debug] [<0.10377.3>] Stacktrace:
[{couch_httpd,validate_ctype,2},
{couch_httpd_db,db_doc_req,3},
{couch_httpd_db,do_db_req,2},
{couch_httpd,handle_request_int,5},
{mochiweb_http,headers,5},
{proc_lib,init_p_do_apply,3}]
[Mon, 10 Jan 2011 22:11:53 GMT] [info] [<0.10377.3>] 127.0.0.1 - - 'POST'
/test/randomid32843 415
[Mon, 10 Jan 2011 22:11:53 GMT] [debug] [<0.10377.3>] httpd 415 error
response:
{"error":"bad_content_type","reason":"Content-Type must be
multipart/form-data"}
----------------------------------------------------------------------------------------------------
## Test 3:
# Rewrites config:
[
{
"to": "../../*",
"from": ":db/*"
},
{
"to": "../..",
"from": ":db"
}
]
# Executed command 3.1:
$ curl -d @example -H "Content-type:application/json" -e
http://localhost:5984/test http://localhost:5984/test/
{"ok":true,"id":"ce8b504d63666c9257cc07537c00bbe3","rev":"1-505a221d0aef5d664f29d6afdae01293"}
# Comment: OK! works as expected
#Executed command 3.2:
$ curl -X PUT -d @example -H "Content-type:application/json"
http://localhost:5984/test/_design/test/_rewrite/test/randomid43242
{"ok":true,"id":"randomid43242","rev":"1-505a221d0aef5d664f29d6afdae01293"}
# Comment: OK! works as expected
#Executed command 3.3:
$ curl -d @example -H "Content-type:application/json" -e
http://localhost:5984/test
http://localhost:5984/test/_design/test/_rewrite/test/
{"error":"bad_content_type","reason":"Content-Type must be
multipart/form-data"}
# Comment: Rewrite issue and content type issue
# LOG:
[Mon, 10 Jan 2011 22:19:55 GMT] [debug] [<0.11199.3>] 'POST'
/test/_design/test/_rewrite/test/ {1,1}
Headers: [{'Accept',"*/*"},
{'Content-Length',"23"},
{'Content-Type',"application/json"},
{'Host',"localhost:5984"},
{'Referer',"http://localhost:5984/test"},
{'User-Agent',"curl/7.21.0 (i686-pc-linux-gnu) libcurl/7.21.0
OpenSSL/0.9.8o zlib/1.2.3.4 libidn/1.18"}]
[Mon, 10 Jan 2011 22:19:55 GMT] [debug] [<0.11199.3>] OAuth Params: []
[Mon, 10 Jan 2011 22:19:55 GMT] [debug] [<0.11199.3>] rewrite to
"/test/_design/..?db=test"
[Mon, 10 Jan 2011 22:19:55 GMT] [debug] [<0.11199.3>] 'POST'
/test/_design/..?db=test {1,1}
Headers: [{'Accept',"*/*"},
{'Content-Length',"23"},
{'Content-Type',"application/json"},
{'Host',"localhost:5984"},
{'Referer',"http://localhost:5984/test"},
{'User-Agent',"curl/7.21.0 (i686-pc-linux-gnu) libcurl/7.21.0
OpenSSL/0.9.8o zlib/1.2.3.4 libidn/1.18"}]
[Mon, 10 Jan 2011 22:19:55 GMT] [debug] [<0.11199.3>] OAuth Params:
[{"db","test"}]
[Mon, 10 Jan 2011 22:19:55 GMT] [debug] [<0.11199.3>] Minor error in HTTP
request: {bad_ctype,
"Content-Type must be multipart/form-data"}
[Mon, 10 Jan 2011 22:19:55 GMT] [debug] [<0.11199.3>] Stacktrace:
[{couch_httpd,validate_ctype,2},
{couch_httpd_db,db_doc_req,3},
{couch_httpd_db,do_db_req,2},
{couch_httpd,handle_request_int,5},
{couch_httpd_db,do_db_req,2},
{couch_httpd,handle_request_int,5},
{mochiweb_http,headers,5},
{proc_lib,init_p_do_apply,3}]
[Mon, 10 Jan 2011 22:19:55 GMT] [info] [<0.11199.3>] 127.0.0.1 - - 'POST'
/test/_design/..?db=test 415
[Mon, 10 Jan 2011 22:19:55 GMT] [debug] [<0.11199.3>] httpd 415 error
response:
{"error":"bad_content_type","reason":"Content-Type must be
multipart/form-data"}
#Executed command 3.4:
$ curl -d @example -H "Content-type:application/json" -e
http://localhost:5984/test http://localhost:5984/test/randomid432432
{"error":"bad_content_type","reason":"Content-Type must be
multipart/form-data"}
#Comment: Obviously no rewrite issue, however content type problem is there
#LOG:
[Mon, 10 Jan 2011 22:21:24 GMT] [debug] [<0.11220.3>] 'POST'
/test/randomid432432 {1,1}
Headers: [{'Accept',"*/*"},
{'Content-Length',"23"},
{'Content-Type',"application/json"},
{'Host',"localhost:5984"},
{'Referer',"http://localhost:5984/test"},
{'User-Agent',"curl/7.21.0 (i686-pc-linux-gnu) libcurl/7.21.0
OpenSSL/0.9.8o zlib/1.2.3.4 libidn/1.18"}]
[Mon, 10 Jan 2011 22:21:24 GMT] [debug] [<0.11220.3>] OAuth Params: []
[Mon, 10 Jan 2011 22:21:24 GMT] [debug] [<0.11220.3>] Minor error in HTTP
request: {bad_ctype,
"Content-Type must be multipart/form-data"}
[Mon, 10 Jan 2011 22:21:24 GMT] [debug] [<0.11220.3>] Stacktrace:
[{couch_httpd,validate_ctype,2},
{couch_httpd_db,db_doc_req,3},
{couch_httpd_db,do_db_req,2},
{couch_httpd,handle_request_int,5},
{mochiweb_http,headers,5},
{proc_lib,init_p_do_apply,3}]
[Mon, 10 Jan 2011 22:21:24 GMT] [info] [<0.11220.3>] 127.0.0.1 - - 'POST'
/test/randomid432432 415
[Mon, 10 Jan 2011 22:21:24 GMT] [debug] [<0.11220.3>] httpd 415 error
response:
{"error":"bad_content_type","reason":"Content-Type must be
multipart/form-data"}
Apparently these are two different issues.
First handling of rewrites for POST requests and the second is the problem
with Content types?
Also I would be extremely happy to find out what are more exact rules for
pattern matching? I have found this site (
http://caolanmcmahon.com/on_designs_undocumented.html) which provides some
answers. I have also read somewhere that rewriting is basically Erlang
pattern matching ... so should I read up more about the topic in Erlang
documentation?
There is also a question I have that wasn't answered anywhere - is it
possible for multiple rewrites to apply to single request? If so what is the
precedence? If not - what is the precedence in that case.
Thank you for any response.
Kind regards, -Janez
On Thu, Jan 13, 2011 at 8:21 AM, Benoit Chesneau <[email protected]>wrote:
> did you try to add:
>
> {
>
> "from": ":db",
> "to": "../.."
> }
>
> ?
>
> - benoît
>
> On Mon, Jan 10, 2011 at 6:21 PM, Janez Štupar <[email protected]>
> wrote:
> > Here is the problem I'm currently dabbling around with Sofa (got it from
> > jchrisa's Github)... To this end I'm reverse engineering it and trying to
> > get it work in a following scenario:
> >
> > The database is hidden behind following VHost: sofa.mycouch ->
> > /sofa/_design/sofa/_rewrite
> >
> > Since I wanted to improve the appearance of the URL's I also did some
> > modifications to the rewrites, my current configuration is as follows:
> >
> > [
> > {
> > "to": "_list/index/recent-posts",
> > "from": "blog/",
> > "query": {
> > "limit": 10,
> > "descending": true
> > }
> > },
> > {
> > "to": "_list/:listname/*",
> > "from": "list/:listname/*",
> > "query": {
> > "limit": 10,
> > "descending": true
> > }
> > },
> > {
> > "to" : "_show/:showname/*",
> > "from" : "show/:showname/*"
> > },
> > {
> > "to" : "_update/:updatename/*",
> > "from" : "update/:updatename/*"
> > },
> > {
> > "to": "_list/index/recent-posts",
> > "from": "",
> > "query": {
> > "limit": 10,
> > "descending": true
> > }
> > },
> > {
> > "to": "script/*",
> > "from": "script/*"
> > },
> > {
> > "to": "style/*",
> > "from": "style/*"
> > },
> > {
> > "to": "vendor/*",
> > "from": "vendor/*"
> > },
> > {
> > "to": "../../*",
> > "from": ":db/*"
> > }
> > ]
> >
> > The last problem I have left is that although everything works (I have
> > indeed done some modifications to the templates, pathing function, etc..
> > nothing relevant to this current issue IMHO).
> > *
> > Except* one thing doesn't work as expected ... that is posting comments.
> I
> > have kinda narrowed it down that when the browser sends a new blog post
> it
> > does PUT to address: '"/sofa/_design/sofa/_rewrite/sofa/spet-nov-post"'
> > (spet-nov-post is a _id - according to jquery.couch.js)
> >
> > While comment gets POST -ed to following URL:
> > '"/sofa/_design/sofa/_rewrite/sofa/"'
> >
> > what happens in the rewriter is following:
> >
> > 'PUT' /sofa/_design/sofa/_rewrite/sofa/spet-nov-post {1,1} -> 'PUT'
> > /sofa/spet-nov-post?db=sofa {1,1}
> > 'POST' /sofa/_design/sofa/_rewrite/sofa/ {1,1} -> 'POST'
> > /sofa/_design/..?db=sofa {1,1}
> >
> > I blame the following rewrite rule:
> > {
> > "to": "../../*",
> > "from": ":db/*"
> > }
> >
>