Graham Dumpleton
grahamd at dscpl.com.au
Fri Mar 3 00:39:47 EST 2006
FWIW, if req.proxyreq is made writable, it would be good at the same time to make req.uri writable as well. This would allow for example a PythonTransHandler which did something like the following: def transhandler(req): if req.proxyreq: return apache.DECLINED if req.uri.find('/search/') == 0: req.proxyreq = apache.PROXYREQ_PROXY req.uri = 'http://www.google.com/' + req.uri[len('/search/'):] req.filename= "proxy:%s' % req.uri req.handler= 'proxy-server' return apache.OK return apache.DECLINED That is, you could from within a mod_python handler when detecting a certain URL prefix, dynamically cause Apache to proxy the request to another location. This example is based on a mod_perl example which does something similar. See: http://162.105.203.19/apache-doc/88.htm#BIN194 I'll definitely create a JIRA issue for this, as can see a use for this in some stuff I have to do. I was going to create a static snippet of Apache configuration with lots of proxy stuff, but this would be more interesting. Graham Graham Dumpleton wrote .. > Bill Fraser wrote .. > > Hello, this is my first post to this list, and I'm rather new to > > Python, so please excuse me if my question is a trivial one. :) > > > > I'm using Apache2's mod_rewrite for a proxy system on my webserver, > > and I've noticed that no matter what, mod_rewrite instructs mod_proxy > > to add all the X-Forwarded-* headers, despite the fact that the proxy > > request is forward proxy and not a reverse one. Looking at the Apache2 > > source, mod_proxy specifically mentions in the relevant comment block > > that this should NOT be done for forward proxy requests (and in fact > > they are messing up the application this is for), yet mod_rewrite will > > ALWAYS add them, no matter what the nature of the proxy request is. > > > > Looking further in the source, I found that the way to change this > > behavior is to change the value of the r->proxyreq variable from > > PROXYREQ_REVERSE (what mod_rewrite sets it to) to PROXYREQ_PROXY. A > > nice thing about Python is its ability to attach itself to arbitrary > > points in the request process, so I thought I could change this value. > > No luck. req.proxyreq is marked as read-only. > > There are various members in the req object in mod_python which are > read only when they should be writable as well. I have been slowly identifying > them and making them writable as appropriate. > > In the case of req.proxyreq, because it is an integer value, I think only > a one line change is required to make it writable. > > Index: src/requestobject.c > =================================================================== > --- src/requestobject.c (revision 382636) > +++ src/requestobject.c (working copy) > @@ -1675,7 +1675,7 @@ > {"main", (getter)getmakeobj, NULL, "If subrequest, pointer to > the main request", "main"}, > {"the_request", (getter)getreq_recmbr, NULL, "First line of request", > "the_request"}, > {"assbackwards", (getter)getreq_recmbr, (setter)setreq_recmbr, "HTTP/0.9 > \"simple\" request", "assbackwards"}, > - {"proxyreq", (getter)getreq_recmbr, NULL, "A proxy request: one > of apache.PROXYREQ_* values", "proxyreq"}, > + {"proxyreq", (getter)getreq_recmbr, (setter)setreq_recmbr, "A > proxy request: one of apache.PROXYREQ_* values", "proxyreq"}, > {"header_only", (getter)getreq_recmbr, NULL, "HEAD request, as oppsed > to GET", "header_only"}, > {"protocol", (getter)getreq_recmbr, NULL, "Protocol as given to > us, or HTTP/0.9", "protocol"}, > {"proto_num", (getter)getreq_recmbr, NULL, "Protocol version. 1.1 > = 1001", "proto_num"}, > > I haven't tested this yet though. > > Can you possibly add an issue for this at: > > http://issues.apache.org/jira/browse/MODPYTHON > > If not I'll add one later and include your email. > > Graham > _______________________________________________ > Mod_python mailing list > Mod_python at modpython.org > http://mailman.modpython.org/mailman/listinfo/mod_python
|