50 lines
1.9 KiB
Python
50 lines
1.9 KiB
Python
|
|
import re
|
|
|
|
class MandayeFilter(object):
|
|
""" Default Mandaye filter
|
|
This class allows to filter the request (cookies, headers and the message-body)
|
|
and the response (cookies, headers and message-body)
|
|
"""
|
|
|
|
def __init__(self, env, target):
|
|
""" env: wsgi environment
|
|
target: the reverse proxy self.target (urlparse object)
|
|
"""
|
|
self.env = env
|
|
self.target = target
|
|
|
|
def on_request(self, request):
|
|
referer = request.headers.getheader('referer')
|
|
if referer:
|
|
referer = referer.replace(self.env["HTTP_HOST"], self.target.hostname)
|
|
request.headers.addheader("Referer", referer)
|
|
origin = request.headers.getheader('origin')
|
|
if origin:
|
|
origin = origin.replace(self.env["HTTP_HOST"], self.target.hostname)
|
|
request.headers.addheader("Origin", origin)
|
|
# Add forwarded header like Apache
|
|
request.headers.addheader('X-Forwarded-For', self.env['REMOTE_ADDR'])
|
|
request.headers.addheader('X-Forwarded-Host', self.env['HTTP_HOST'])
|
|
return request
|
|
|
|
def on_response(self, response):
|
|
# Modify cookies
|
|
src_hostname = re.sub(":\d*$", "", self.env["HTTP_HOST"])
|
|
for cookie in response.cookies.values():
|
|
if cookie.has_key('domain'):
|
|
cookie['domain'] = re.sub('^\.*%s$' % (self.target.hostname),
|
|
src_hostname, cookie['domain'])
|
|
# Modify headers
|
|
blacklist = ['transfer-encoding', 'content-length']
|
|
for key, value in response.headers.iteritems():
|
|
if key == 'location':
|
|
location = value[0].replace(self.target.geturl(),
|
|
"%s://%s" % (self.env['mandaye.scheme'], self.env["HTTP_HOST"]))
|
|
response.headers['location'] = [location]
|
|
for name in blacklist:
|
|
if response.headers.has_key(name):
|
|
del response.headers[name]
|
|
return response
|
|
|