On Wed, 24 May 2006 12:40:45 -0700, David Reid <[EMAIL PROTECTED]> wrote:
Remi Cool wrote:
Ok, I'm with you with that (I need to read more carefully) ... but what
I would like to do, is pass all requests for files ending with .php (and
maybe .js and .ccs) to be forwarded to another server. Forwarding
everything would make the transition from php to nevow a tad more
difficult.  Would this 'selective' proxying be possible?

Well unless you've specifically got long standing URLs to worry about

David's explanation was correct, but I tend to expect long-standing URLs to continue to work.  With 
that in mind: Twisted's philosophy in this regard is to provide simple interfaces so that you can 
write your own "glue" resources criteria as you see fit.  Since I was bored and stuck in 
a train station while I was reading this message, here's a quick "left/right" switch for 
resources.  Toooootally untested, not even run.

The way you'd use it in your program is similar to dreid's .tac example:

SegmentSwitch(lambda segments:
             segments[-1].split('.')[-1] in ('php', 'js', 'css'),
             MyCoolNevowApplication(),
             ReverseProxyResource('localhost', 8080, '/'))


And here's the implementation:

from zope.interface import implements

from twisted.web2 import resource, iweb

class SegmentSwitch(resource.Resource):
   """
   I am a resource that switches between two alternative resource hierarchies
   depending on a callable.
   """

   implements(iweb.IResource)

   def __init__(self, switch, left, right):
       """
       Create a switching resource.

       @param switch: A one-argument callable that takes a sequence of
       segments and returns False to divert to the left resource and True to
       divert to the right.

       @param left: An IResource provider to be used when 'switch' returns
       False.

       @param right: An IResource provider to be used when 'switch' returns
       True.
       """

       self.switch = switch
       self.left = left
       self.right = right

   def locateChild(self, request, segments):
       if self.switch(segments):
           res = self.right
       else:
           res = self.left
       return res.locateChild(request, segments)

   def render(self, request):
       return "OOPS"

_______________________________________________
Twisted-web mailing list
[email protected]
http://twistedmatrix.com/cgi-bin/mailman/listinfo/twisted-web

Reply via email to