summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorianb <ianb@localhost>2006-12-14 22:10:55 +0000
committerianb <ianb@localhost>2006-12-14 22:10:55 +0000
commit036190051d1ccb30db6bd9a3e2002a65875a75f6 (patch)
treeeed4d75afa9d1aaf3f18d4450f055ef3c3125acd
parentb7330a4ee6eec6717f26f773041fbe046aceb4ce (diff)
downloadpastedeploy-git-036190051d1ccb30db6bd9a3e2002a65875a75f6.tar.gz
Added force_port option
-rw-r--r--docs/news.txt3
-rw-r--r--paste/deploy/config.py29
2 files changed, 29 insertions, 3 deletions
diff --git a/docs/news.txt b/docs/news.txt
index 2360c1e..c8bfe3b 100644
--- a/docs/news.txt
+++ b/docs/news.txt
@@ -9,6 +9,9 @@ svn trunk
can be used in variable interpolation. Note: this won't overwrite
any existing values in ``[DEFAULT]``.
+* Added ``force_port`` option to
+ ``paste.deploy.config.PrefixMiddleware``
+
1.0
---
diff --git a/paste/deploy/config.py b/paste/deploy/config.py
index 608efdf..363ee59 100644
--- a/paste/deploy/config.py
+++ b/paste/deploy/config.py
@@ -222,14 +222,23 @@ class PrefixMiddleware(object):
Also, unless disabled, the ``X-Forwarded-Server`` header will be
translated to the ``Host`` header, for cases when that header is
lost in the proxying.
+
+ If ``force_port`` is set, SERVER_PORT and HTTP_HOST will be
+ rewritten with the given port. You can use a number, string (like
+ '80') or the empty string (whatever is the default port for the
+ scheme). This is useful in situations where there is port
+ forwarding going on, and the server believes itself to be on a
+ different port than what the outside world sees.
"""
def __init__(self, app, global_conf=None, prefix='/',
- translate_forwarded_server=True):
+ translate_forwarded_server=True,
+ force_port=None):
self.app = app
self.prefix = prefix
self.translate_forwarded_server = translate_forwarded_server
self.regprefix = re.compile("^%s(.*)$" % self.prefix)
+ self.force_port = force_port
def __call__(self, environ, start_response):
url = environ['PATH_INFO']
@@ -240,15 +249,29 @@ class PrefixMiddleware(object):
if (self.translate_forwarded_server and
'HTTP_X_FORWARDED_SERVER' in environ):
environ['HTTP_HOST'] = environ.pop('HTTP_X_FORWARDED_SERVER')
+ if self.force_port is not None:
+ host = environ.get('HTTP_HOST', '').split(':', 1)[0]
+ if self.force_port:
+ host = '%s:%s' % (host, self.force_port)
+ environ['SERVER_PORT'] = str(self.force_port)
+ else:
+ if environ['wsgi.url_scheme'] == 'http':
+ port = '80'
+ else:
+ port = '443'
+ environ['SERVER_PORT'] = port
+ environ['HTTP_HOST'] = host
return self.app(environ, start_response)
def make_prefix_middleware(
app, global_conf, prefix='/',
- translate_forwarded_server=True):
+ translate_forwarded_server=True,
+ force_port=None):
from paste.deploy.converters import asbool
translate_forwarded_server = asbool(translate_forwarded_server)
return PrefixMiddleware(
app, prefix=prefix,
- translate_forwarded_server=translate_forwarded_server)
+ translate_forwarded_server=translate_forwarded_server,
+ force_port=force_port)
make_prefix_middleware.__doc__ = PrefixMiddleware.__doc__