Re: Question: how to change the request in input filter and pass it to proxy

2008-04-03 Thread Nick Kew
On Wed, 2 Apr 2008 21:31:27 -0700
Olexandr Prokhorenko [EMAIL PROTECTED] wrote:

 Hi everyone,
 
 I am working on the input filter which is going to catch on input
 requests, find the bucket with Host: , modify it and pass it
 through.  I will modify it to something that does not belong to my
 httpd server, so I need to pass it through the proxy module (my
 guess ;).  I can't use either the static ProxyPass or
 ProxyReversePass, because the host will be modified dynamically and
 it will depend on what is called and substitute it from the database
 call.

You're making a mountain of a molehill.  You can do the proxying
using RewriteRule, and the dynamic mapping using RewriteMap.
Or if you want to do it in a module, you can just use a
header_parser hook, which is much simpler than a filter.

-- 
Nick Kew

Application Development with Apache - the Apache Modules Book
http://www.apachetutor.org/


Re: Question: how to change the request in input filter and pass it to proxy

2008-04-02 Thread Graham Dumpleton
On 03/04/2008, Olexandr Prokhorenko [EMAIL PROTECTED] wrote:
 Hi everyone,

  I am working on the input filter which is going to catch on input requests,
  find the bucket with Host: , modify it and pass it through.  I will modify
  it to something that does not belong to my httpd server, so I need to pass
  it through the proxy module (my guess ;).  I can't use either the static
  ProxyPass or ProxyReversePass, because the host will be modified dynamically
  and it will depend on what is called and substitute it from the database
  call.

  It wasn't a big deal to catch on the Host: (well, I may also need to look
  for something like GET http://blablabla.com/, but this is not the highest
  priority now).  I have created a new HEAP bucket, put it instead of an
  original one, however, a) it looks to me that Apache makes a call and gives
  an error saying file wasn't found, however the Web page displayed is the
  correct one, like not being rewritten, and the httpd child crashes; and b) I
  need to send it to proxy somehow and pass the call to it.

  I am not very good on concept, my book on Apache modules is still on the
  way, but I'd very appreciate any hints on this.

  Thank you.  I'd very thankful for cc: me as well.

I think you may perhaps be going about this the wrong way. One can
cause a request to be proxied by doing something like the following.
This example uses mod_python, but could be done in C code or mod_perl
as well.

import posixpath

from mod_python import apache

def fixuphandler(req):

  if req.proxyreq:
return apache.DECLINED

  normalised_uri = posixpath.normpath(req.uri)

  if normalised_uri:
if normalised_uri != '/' and req.uri[-1] == '/':
  normalised_uri += '/'

  length = len(req.filename)
  length -= len(req.hlist.directory) - 1
  length += len(req.path_info or '')

  baseurl = normalised_uri[:-length]
  path = normalised_uri[len(baseurl):]

  # THIS IS THE IMPORTANT BIT WHICH SETS UP PROXY.

  req.proxyreq = apache.PROXYREQ_REVERSE
  req.uri = 'http://www.dscpl.com.au' + path
  req.filename = 'proxy:%s' % req.uri
  req.handler = 'proxy-server'

  return apache.OK

If you didn't want to proxy a particular request, just return DECLINED
when you know so.

Graham


Re: Question: how to change the request in input filter and pass it to proxy

2008-04-02 Thread Graham Dumpleton
This technique is taken from modules/proxy/mod_proxy.c in Apache
source code. See the proxy_detect() function in that file for a C code
example.

One could change request headers on way through in same handler
function as setup the proxy. Still need an output filter if you want
to change handlers in response. I haven't used input/output filters
that modify headers, so can't comment on that.

Graham

On 03/04/2008, Olexandr Prokhorenko [EMAIL PROTECTED] wrote:
 Hi,

  Do I understand you right and you're proposing to have just an Apache module
  (not a hook on either output or input filter) and modify the request then?

  I'd be very thankful if you can point me to any typical C code example doing
  that.  I'm not very good at Python and never used to code with it.  While I
  think that I understand what you're talking about, I'd be much comfortable
  with being able to sneak at the example ;)

  What I will also need is to rewrite cookies.   Will I be able to do that
  this way as well?  I decided to try on input filter just because I thought I
  may get in troubles rewriting the cookies.  I'll also need to modify the
  proxy response, so it's a place for output filter, isn't it?

  Thanks, your reply was very quick.

  On Wed, Apr 2, 2008 at 9:39 PM, Graham Dumpleton [EMAIL PROTECTED]
  wrote:


   On 03/04/2008, Olexandr Prokhorenko [EMAIL PROTECTED] wrote:
Hi everyone,
   
 I am working on the input filter which is going to catch on input
   requests,
 find the bucket with Host: , modify it and pass it through.  I will
   modify
 it to something that does not belong to my httpd server, so I need to
   pass
 it through the proxy module (my guess ;).  I can't use either the
   static
 ProxyPass or ProxyReversePass, because the host will be modified
   dynamically
 and it will depend on what is called and substitute it from the
   database
 call.
   
 It wasn't a big deal to catch on the Host: (well, I may also need to
   look
 for something like GET http://blablabla.com/, but this is not the
   highest
 priority now).  I have created a new HEAP bucket, put it instead of an
 original one, however, a) it looks to me that Apache makes a call and
   gives
 an error saying file wasn't found, however the Web page displayed is
   the
 correct one, like not being rewritten, and the httpd child crashes; and
   b) I
 need to send it to proxy somehow and pass the call to it.
   
 I am not very good on concept, my book on Apache modules is still on
   the
 way, but I'd very appreciate any hints on this.
   
 Thank you.  I'd very thankful for cc: me as well.
  
   I think you may perhaps be going about this the wrong way. One can
   cause a request to be proxied by doing something like the following.
   This example uses mod_python, but could be done in C code or mod_perl
   as well.
  
   import posixpath
  
   from mod_python import apache
  
   def fixuphandler(req):
  
if req.proxyreq:
  return apache.DECLINED
  
normalised_uri = posixpath.normpath(req.uri)
  
if normalised_uri:
  if normalised_uri != '/' and req.uri[-1] == '/':
normalised_uri += '/'
  
length = len(req.filename)
length -= len(req.hlist.directory) - 1
length += len(req.path_info or '')
  
baseurl = normalised_uri[:-length]
path = normalised_uri[len(baseurl):]
  
# THIS IS THE IMPORTANT BIT WHICH SETS UP PROXY.
  
req.proxyreq = apache.PROXYREQ_REVERSE
req.uri = 'http://www.dscpl.com.au' + path
req.filename = 'proxy:%s' % req.uri
req.handler = 'proxy-server'
  
return apache.OK
  
   If you didn't want to proxy a particular request, just return DECLINED
   when you know so.
  
   Graham
  




 --
  Alexander Prohorenko.