[z3-checkins] r55076 - z3/deliverance/trunk/deliverance
ianb at codespeak.net
ianb at codespeak.net
Wed May 21 17:57:34 CEST 2008
Author: ianb
Date: Wed May 21 17:57:32 2008
New Revision: 55076
Modified:
z3/deliverance/trunk/deliverance/proxyapp.py
Log:
Fix up the proxy path changes in the last commit; move error handling into ProxyDeliveranceApp out of make_app.
Modified: z3/deliverance/trunk/deliverance/proxyapp.py
==============================================================================
--- z3/deliverance/trunk/deliverance/proxyapp.py (original)
+++ z3/deliverance/trunk/deliverance/proxyapp.py Wed May 21 17:57:32 2008
@@ -22,19 +22,29 @@
serializer=None):
self.theme_uri = theme_uri,
self.rule_uri = rule_uri,
- self.proxy = proxy
- self.path_info = ''
-
- # the proxy might look like foo.bar.org:8080/baz/fleem
- # so we need to save the baz/fleem part to inject
- # into PATH_INFO later on (during __call__)
- proxy = proxy.split('/', 1)
- if len(proxy) > 1:
- self.proxy = proxy[0]
- proxy[1] = proxy[1].strip('/')
- self.path_info = '/%s' % proxy[1]
-
+ if not re.match(r'https?://', proxy, re.I):
+ proxy = 'http://' + proxy
+ scheme, netloc, path, query, fragment = urlparse.urlsplit(proxy)
+ if fragment:
+ raise ValueError(
+ "No fragment is allowed in the proxy destination (#%s in the url %r)"
+ % (fragment, proxy))
+ if query:
+ raise ValueError(
+ "No query string is allowed in the proxy destination (?%s in the url %r)"
+ % (query, proxy))
+ if path == '/':
+ path = ''
+ self.proxy_path = path
+ self.proxy = netloc
+ if scheme not in ('http', 'https'):
+ raise ValueError(
+ "Proxying to the scheme %r location is not supported" % scheme)
self.transparent = transparent
+ if self.proxy_path and self.transparent:
+ raise ValueError(
+ "The transparent option is not compatible with proxy destinations that include"
+ " a path (path=%r)" % self.proxy_path)
self.debug_headers = debug_headers
self.subapp = self.make_app()
self.deliverance_app = DeliveranceMiddleware(
@@ -55,7 +65,8 @@
if get_serializer(environ, None) is None:
set_serializer(environ, self.deliverance_app.serializer)
if self.relocate_content:
- reloc_app = RelocateMiddleware(self.run_subapp, old_href='http://'+self.proxy)
+ proxy_dest = 'http://%s%s' % (self.proxy, self.proxy_path)
+ reloc_app = RelocateMiddleware(self.run_subapp, old_href=proxy_dest)
return reloc_app(environ, start_response)
else:
return self.run_subapp(environ, start_response)
@@ -70,7 +81,7 @@
server, port = self.proxy, '80'
environ['SERVER_NAME'] = server
environ['SERVER_PORT'] = port
- environ['PATH_INFO'] = self.path_info + environ['PATH_INFO']
+ environ['PATH_INFO'] = self.proxy_path + environ['PATH_INFO']
return self.deliverance_app(
environ, start_response)
@@ -143,23 +154,6 @@
parts = urlparse.urlsplit(wrap_href)
scheme, netloc, path, query, fragment = parts
scheme = scheme.lower()
- if scheme not in ['http', 'https']:
- raise ValueError(
- "I don't know how to proxy to the scheme %r (from wrap_href=%s)"
- % (scheme, wrap_href))
- if fragment:
- raise ValueError(
- "You cannot use a fragment (%r) in wrap_href=%s"
- % (fragment, wrap_href))
- if query:
- raise ValueError(
- "You cannot use a query string ?%s (from wrap_href=%s)"
- % (query, wrap_href))
- if path and path != '/':
- raise ValueError(
- "Proxying to a path on a server is not currently supported "
- "(path=%r from wrap_href=%s)"
- % (path, wrap_href))
app = ProxyMountedDeliveranceApp(
theme_uri=theme_uri,
rule_uri=rule_uri,
More information about the z3-checkins
mailing list