[ 
https://issues.apache.org/jira/browse/COUCHDB-981?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13139846#comment-13139846
 ] 

Jason Smith commented on COUCHDB-981:
-------------------------------------

Rewrites are scary. Combining them with ghosts is just terrifying. Must be 
Halloween.

tl;dr: I have a working patch set that fixes this specific bug but it is a bit 
invasive and a bit architecture astronautty, but I am happy to publish it if 
there is interest.

We needed this fixed at Iris Couch a long time ago, and the result is 
req.iris.requested_path with the real requested path. No tricks. No games. The 
real requested path. It works perfectly. Unfortunately, the patch set modifies 
mochiweb and I assume it would be unwelcome here.

The design of vhosts and rewrites is great! In both cases, a fresh #httpd or 
MochiReq object is created and processing completely restarts. For security and 
correctness, that is an excellent approach. Unfortunately, vhosts and rewrites 
discard the old MochiReq object (module) and create a new one. Information is 
lost.

The trick I used was to add an 'oob' (Out Of Band) parameter to the 
mochiweb_request constructor. It simply stores an arbitrary term there, and you 
can get it with MochiReq:get(oob). Couch uses this storage to note anything 
important. When request processing begins, it stores the original request path. 
Vhosts and rewrites simply copy this value. When it's time to build the JSON 
request object in couch_httpd_external/json_req_obj/3, the true and proper 
requested_path is there, safe and sound, in a MochiReq:get(oob) tagged tuple.

(I don't remember why I built this into the mochi_request object and not the 
couch #httpd{} but I think there was a a compelling reason to do it "the hard 
way.")

I mention all of this because I have subsequently found out-of-band storage in 
the MochiReq to be extremely useful for other features. For example, we ping 
the couch to monitor its health. Those requests are flagged no_log in the OOB, 
and when it's time to log them, the logger no-ops instead. That way, users' 
logs reflect only stuff that they care about.

                
> req.path and req.requested_path both show the path after rewrites
> -----------------------------------------------------------------
>
>                 Key: COUCHDB-981
>                 URL: https://issues.apache.org/jira/browse/COUCHDB-981
>             Project: CouchDB
>          Issue Type: Bug
>          Components: JavaScript View Server
>    Affects Versions: 1.1, 1.2
>         Environment: Ubuntu 9.10 (karmic)
>            Reporter: Caolan McMahon
>
> The request object passed to show functions contains properties for 'path' 
> and 'requested_path'. Both of these properties return the path *after* 
> rewrites have taken place, it was my understanding (from talking to benoitc 
> and others on #couchdb) that requested_path should show the path prior to the 
> rewrite.
> With the following design doc:
> {
>    "_id": "_design/test",
>    "_rev": "1-be48afc903d2ca4b879efa211b354d88",
>    "shows": {
>        "testshow": "function(doc, req){log(req); return 'testshow';}"
>    },
>    "rewrites": [
>        {
>            "from": "/",
>            "to": "_show/testshow"
>        }
>    ]
> }
> Requesting the _rewrite url:
> $ curl http://localhost:5984/test/_design/test/_rewrite/
> testshow
> Shows the following in the couchdb log output:
> [info] [<0.592.0>] OS Process #Port<0.2152> Log :: 
> {"info":{"db_name":"test","doc_count":1,"doc_del_count":0,"update_seq":1,"purge_seq":0,"compact_running":false,"disk_size":4185,"instance_start_time":"1291827724231276","disk_format_version":5,"committed_update_seq":1},"id":null,"uuid":"b37350616734d6a48f6d63fefd00156c","method":"GET","requested_path":["test","_design","test","_show","testshow"],"path":["test","_design","test","_show","testshow"],"query":{},"headers":{"Accept":"*/*","Host":"localhost:5984","User-Agent":"curl/7.19.5
>  (x86_64-pc-linux-gnu) libcurl/7.19.5 OpenSSL/0.9.8g zlib/1.2.3.3 
> libidn/1.15"},"body":"undefined","peer":"127.0.0.1","form":{},"cookie":{},"userCtx":{"db":"test","name":null,"roles":["_admin"]},"secObj":{}}
> [info] [<0.574.0>] 127.0.0.1 - - 'GET' /test/_design/test/_show/testshow 200
> You'll notice that both 'path' and 'requested_path' are set to: 
> ["test","_design","test","_show","testshow"]

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators: 
https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

Reply via email to