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.
>


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

2008-04-02 Thread Olexandr Prokhorenko
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.


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


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

2008-04-02 Thread Olexandr Prokhorenko
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.

-- 
Alexander Prohorenko.